开放原子训练营(第一季)铜锁探密:基于铜锁构建在线在线加密工具箱

news/2024/5/9 12:32:15/文章来源:https://blog.csdn.net/qq_24694139/article/details/130316594

基于铜锁构建Web在线加密工具库

搭建运行环境

实验⼿册中的实验都是以 dockerdocker-compose 环境为主,基于 Ubuntu 20.04 容器镜像。

初始化项目

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-doMrXRdM-1682067005381)(img.png)]

首先利用 IDE 创建一个 tongsuo_web 的空项目,接下来我们所有的文件都会创建在该项目中,我们首先构建运行环境,整个环境都是由 Dockerfile 进行构建,然后使用 docker-compose.yml 进行编排,使得宿主机不用进行环境依赖安装,实验完也可以快速删除环境,不对宿主机造成过多影响。

创建sources.list

因为 ubuntu 的默认 apt 源是比较慢的,对于我们实验会造成过慢,所以这里提前准备了 apt 源,在项目里新建 sources.list 文件,并将如下内容写入到文件中,下文就会使用到该配置

deb http://repo.huaweicloud.com/ubuntu/ focal main restricted universe multiverse
deb-src http://repo.huaweicloud.com/ubuntu/ focal main restricted universe multiverse
deb http://repo.huaweicloud.com/ubuntu/ focal-security main restricted universe multiverse
#deb-src http://repo.huaweicloud.com/ubuntu/ focal-security main restricted universe multiverse
deb http://repo.huaweicloud.com/ubuntu/ focal-updates main restricted universe multiverse
#deb-src http://repo.huaweicloud.com/ubuntu/ focal-updates main restricted universe multiverse
deb http://repo.huaweicloud.com/ubuntu/ focal-proposed main restricted universe multiverse
#deb-src http://repo.huaweicloud.com/ubuntu/ focal-proposed main restricted universe multiverse
deb http://repo.huaweicloud.com/ubuntu/ focal-backports main restricted universe multiverse
#deb-src http://repo.huaweicloud.com/ubuntu/ focal-backports main restricted universe multiverse

创建Dockerfile

在项目中首先创建 Dockerfile 文件,并把以下内容写入到文件中

FROM ubuntu:20.04
WORKDIR "/application"ADD sources.list /etc/apt/RUN apt-get update \&& apt-get -y install git make gcc python3.7 python3-pip \&& git config --global http.sslverify false \&& python3 --version \&& pip3 --versionRUN git clone https://atomgit.com/tongsuo/Tongsuo.git \&& cd Tongsuo \&& ./config --prefix=/opt/tongsuo enable-ntls enable-ssl-trace -Wl,-rpath,/opt/tongsuo/lib64 --debug \&& make -j \&& make install \&& /opt/tongsuo/bin/tongsuo version

这是一个基于 ubuntu:20.04 的环境,他在构建的过程中替换了 apt 的源,并且将 gccmakepythongitpip 等环境所需工具进行了安装;通过 git 将铜锁的仓库克隆到容器中并进行编译,使得环境中拥有了铜锁。

通过docker-compose进行dockerfile构建

在项目中新建 docker-compose.yml 文件然后指定当前目录下的 Dockerfile

version: '3.1'
services:tongsuo:build:context: .working_dir: /applicationvolumes:- '.:/application'ports:- "5000:5000"tty: truestdin_open: true

最终项目文件如下所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VBjqQLCR-1682067005382)(img_1.png)]

  • 创建环境
docker-compose up -d

在这里插入图片描述

出现下图输出即环境创建成功:

在这里插入图片描述

因为我们需要使用到 PythonFlask 作为 Web 框架,所以我们需要先进容器进行安装,命令如下

docker-compose exec -it tongsuo bash
pip3 install flask

安装完成后我们就可以来创建 Web Api

基于铜锁构建API

对铜锁SDK能力进行封装

新建一个名为 tongsuopackage

在这里插入图片描述

创建一个 tools.py,我们将铜锁SDK提供的 sm2sm3sm4 能力进行封装,相关函数如下:

import subprocess# SM4-CBC加密
def sm4_cbc_encrypt(plaintext: str, key: str):command = 'echo ' + plaintext + ' | /opt/tongsuo/bin/tongsuo enc -K ' + key + ' -e -sm4-cbc ' \'-iv 1fb2d42fb36e2e88a220b04f2e49aa13 -nosalt -base64',return shell(command)# SM4-CBC解密
def sm4_cbc_decrypt(ciphertext: str, key: str):command = 'echo ' + ciphertext + '| /opt/tongsuo/bin/tongsuo enc -K '+key+' -d -sm4-cbc ' \'-iv 1fb2d42fb36e2e88a220b04f2e49aa13 -nosalt -base64'return shell(command)# sm3杂凑算法
def sm3_dgst(ciphertext: str):command = 'echo -n ' + ciphertext + ' | /opt/tongsuo/bin/tongsuo dgst -sm3'return shell(command)# sm2签名验证
def sm2_verify(sig_file: str, file_path: str):command = "/opt/tongsuo/bin/tongsuo dgst -sm3 -verify ./sm2pub.key -signature {} {}".format(sig_file, file_path)return shell(command)# sm2 签名
def sm2_sign(file_path: str, sig_file: str):command = "/opt/tongsuo/bin/tongsuo dgst -sm3 -sign ./sm2.key -out {} {}".format(sig_file, file_path)return shell(command)def shell(command):process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)process.wait()# 获取命令的输出和错误信息output = process.stdout.read()error = process.stderr.read()# 将输出和错误信息解码为字符串output = output.decode(encoding="utf8")error = error.decode(encoding="utf8")# 返回命令的输出和错误信息result = {"output": output, "error": error}print(result)return result

main 文件中将封装好的函数能力通过 api 进行暴露

import random
from functools import wrapsfrom flask import Flask, send_file
from flask import render_template
from flask import requestfrom tongsuo.tools import sm3_dgst, sm4_cbc_encrypt, sm4_cbc_decrypt, sm2_verify, sm2_signapp = Flask(__name__)@app.route('/')
def index():return render_template('index.html')def check_param(param_name):"""装饰器,用于检查请求参数是否存在"""def decorator(func):@wraps(func)def wrapper(*args, **kwargs):param_value = request.form.get(param_name)if param_value is None:return f"Error: '{param_name}' parameter is missing", 400else:return func(param_value, *args, **kwargs)return wrapperreturn decorator@app.route('/sm4_cbc_encrypt', methods=['POST'])
@check_param('msg')
@check_param('key')
def sm4_cbc_encrypt_endpoint(key, msg):return sm4_cbc_encrypt(msg, key)@app.route('/sm4_cbc_decrypt', methods=['POST'])
@check_param('msg')
@check_param('key')
def sm4_cbc_decrypt_endpoint(key, msg):return sm4_cbc_decrypt(msg, key)@app.route('/sm3_dgst', methods=['POST'])
@check_param('msg')
def sm3_dgst_endpoint(msg):return sm3_dgst(msg)@app.route('/sm2_sign', methods=['POST'])
@check_param('path')
def sm2_sign_endpoint(path):sign_file = path + '_sign'sm2_sign(path, sign_file)return {'path': sign_file}@app.route('/sm2_verify', methods=['POST'])
@check_param('file_path')
@check_param('sign_file_path')
def sm2_verify_endpoint(sign_file_path, file_path):return sm2_verify(sign_file_path, file_path)@app.route('/upload', methods=['POST'])
def upload():file = request.files['file']random_num = str(random.randint(10000, 99999))filename = file.filenamenew_filename = random_num + '_' + filenamesave_path = './file/' + new_filenamefile.save(save_path)return {'path': save_path}@app.route('/download', methods=['POST'])
@check_param('file_path')
def download_file(file_path):return send_file(file_path, as_attachment=True)if __name__ == '__main__':app.run(host='0.0.0.0', port=5000, debug=True)

我们还需要创建 file 目录,用来保存上传的文件,在我们进行 sm2签名和sm2验证的时候还需要公钥和私钥,我们在项目根目录中创建 sm2.key 和 sm2pub.key,内容如下:

  • sm2.key
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBG0wawIBAQQgSKhk+4xGyDI+IS2H
WVfFPDxh1qv5+wtrddaIsGNXGZihRANCAAQwqeNkWp7fiu1KZnuDkAucpM8piEzE
TL1ymrcrOBvv8mhNNkeb20asbWgFQI2zOrSM99/sXGn9rM2/usM/Mlca
-----END PRIVATE KEY-----
  • sm2pub.key
-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEMKnjZFqe34rtSmZ7g5ALnKTPKYhM
xEy9cpq3Kzgb7/JoTTZHm9tGrG1oBUCNszq0jPff7Fxp/azNv7rDPzJXGg==
-----END PUBLIC KEY-----

这个时候我们的 API 就构建好了,可以从代码中看到,我们在 / 路由上还进行了前端页面的渲染,我们需要在项目目录中创建 templates 目录,用来放置我们的前端程序,在该目录中创建 index.html 作为客户端的入口

当前项目目录结构如下:

在这里插入图片描述

构建Web页面

  • index.html
<!doctype html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport"content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>铜锁SM2、SM3、SM4在线加密解密</title><link rel="stylesheet" href="//unpkg.com/layui@2.6.8/dist/css/layui.css"/><script src="//unpkg.com/layui@2.6.8/dist/layui.js"></script>
</head>
<body>
<div style="padding: 20px 20px"><div class="layui-tab"><ul class="layui-tab-title"><li class="layui-this">SM4加解密算法</li><li>SM3杂凑算法</li><li>SM2签名和验签</li></ul><div class="layui-tab-content"><div class="layui-tab-item layui-show"><div class="layui-row layui-anim-scale pt10" style="width: 100%;"><div class="layui-col-md5"><textarea style="resize: none;min-height: 280px;"placeholder="在此输入明文,选择对应的加密方式,也可以加入密钥,然后加密即可。"class="layui-textarea w99 fl m-h100" id="msg_source"></textarea></div><div class="layui-col-md2"><form class="layui-form" action="" onsubmit="return !1;"><div class="layui-form-item layui-col-md-offset2"><div class="layui-input-inline fr w200 xpswd"><input type="text" name="text" id="pwd"placeholder="在此输入密钥"autocomplete="off"class="layui-input"></div></div><div class="layui-form-item layui-col-md-offset2"><div class="layui-input-inline fr w200 mbt"><button class="layui-btn" onclick="decrypt();"><i class="layui-icon m-hide"></i>解密</button><button class="layui-btn" onclick="encrypt();">加密<iclass="layui-icon m-hide"></i></button></div></div></form></div><div class="layui-col-md5"><textarea name="cipher" class="layui-textarea w99 fr "placeholder="加密后的密文会显示在这里。也可以是待解密的密文。"style="resize: none;min-height: 280px;" id="encrypt_result"ondblclick="this.focus();this.select();"></textarea></div></div></div><div class="layui-tab-item"><div><textarea style="resize: none;height: 200px;" placeholder="原文放到这里即可。"class="layui-textarea w99 fl " id="source" maxlength="1000"></textarea></div><div style="display: inline-block;margin-top: 10px;margin-bottom:20px;"><button class="layui-btn" id="ensm3" onclick="ensm3()">SM3加密<i class="layui-icon"></i></button></div></div><div class="layui-tab-item"><div><button type="button" class="layui-btn" id="sign_file"><i class="layui-icon">&#xe67c;</i>上传需要签名的文件</button><div style="display: inline-block;margin-top: 10px;margin-bottom:20px;"><button class="layui-btn" id="sign" onclick="download()">下载签名文件<i class="layui-icon"></i></button></div></div><div><button type="button" class="layui-btn" id="upload_origin_file"><i class="layui-icon">&#xe67c;</i>上传源文件</button><button type="button" class="layui-btn" id="upload_sign_file"><i class="layui-icon">&#xe67c;</i>上传签名文件</button><div style="display: inline-block;margin-top: 10px;margin-bottom:20px;"><button class="layui-btn" onclick="verify()">验证签名<i class="layui-icon"></i></button></div></div></div></div></div>
</div></body>
<script>function ajaxRequest(url, data, onSuccess, onError) {var xhr = new XMLHttpRequest();xhr.open('POST', url, true);xhr.onreadystatechange = function () {if (xhr.readyState === XMLHttpRequest.DONE) {if (xhr.status === 200) {onSuccess(JSON.parse(xhr.responseText));} else {onError(JSON.parse(xhr.statusText));}}};var formData = new FormData();for (var key in data) {formData.append(key, data[key]);}xhr.send(formData);}// 获取 id 为 msg_source 的元素var source = document.getElementById('msg_source');var source_text = document.getElementById('source');var pwd = document.getElementById('pwd');// 获取 id 为 encrypt_result 的元素var result = document.getElementById('encrypt_result');function encrypt() {console.log('加密')const v = source.valueconst pass = pwd.valueif (!v || v === '') {return alert('加密数据为空')}if (!pass || pass === '') {return alert('密钥为空')}ajaxRequest('http://127.0.0.1:5000/sm4_cbc_encrypt', {'msg': v.trim(), 'key': pass.trim()}, function (res) {console.log(res);result.value = res.output;}, function (err) {console.log(err);})}function decrypt() {console.log('解密')const v = result.value.trim()if (!v || v === '') {return alert('解密数据为空')}const pass = pwd.value.trim()if (!pass || pass === '') {return alert('密钥为空')}ajaxRequest('http://127.0.0.1:5000/sm4_cbc_decrypt', {'msg': v, 'key': pass}, function (res) {console.log(res);if (res.error !== '') {return layer.alert('解密失败:' + res.error, {'icon': 2});}source.value = res.output;}, function (err) {console.log(err);})}function ensm3() {console.log('sm3加密')const v = source_text.valueif (!v || v === '') {return alert('加密数据为空')}ajaxRequest('http://127.0.0.1:5000/sm3_dgst', {'msg': v.trim()}, function (res) {console.log(res);source_text.value = res.output;}, function (err) {console.log(err);})}var file_path = ''var origin_file_path = ''var sign_file_path = ''function download() {console.log('file_path')if (!file_path || file_path === '') {return alert('签名文件未上传')}var xhr = new XMLHttpRequest();xhr.open('POST', 'http://127.0.0.1:5000/download', true);xhr.responseType = 'blob';xhr.onload = function () {if (xhr.status === 200) {var blob = new Blob([xhr.response], {type: 'application/octet-stream'});var a = document.createElement('a');a.href = window.URL.createObjectURL(blob);a.download = Math.floor(Math.random() * 10000) + '_sign_file';document.body.appendChild(a);a.click();document.body.removeChild(a);layer.alert('下载签名文件成功', {'icon': 1});} else {console.log(xhr.statusText);}};var fData = new FormData();fData.append('file_path', file_path);console.log(file_path);console.log(fData)xhr.send(fData);}function verify() {console.log('verify')const v = source.valueif (!origin_file_path || origin_file_path === '') {return alert('原始文件未上传!')}if (!sign_file_path || sign_file_path === '') {return alert('签名文件未上传!')}ajaxRequest('http://127.0.0.1:5000/sm2_verify', {'file_path': origin_file_path,'sign_file_path': sign_file_path}, function (res) {console.log(res);layer.alert(res.output);}, function (err) {console.log(err);})}uploadFile('#sign_file', function (res) {ajaxRequest('http://127.0.0.1:5000/sm2_sign', {'path': res.path}, function (sign_res) {file_path = sign_res.path}, function (sign_err) {console.log(sign_err);})})uploadFile('#upload_origin_file', function (res) {origin_file_path = res.path})uploadFile('#upload_sign_file', function (res) {sign_file_path = res.path})function uploadFile(elem, doneCallback, errorCallback) {layui.use('upload', function () {var upload = layui.upload;//执行实例var uploadInst = upload.render({elem: elem,accept: 'file',url: 'http://127.0.0.1:5000/upload',done: function (res) {doneCallback(res);},error: function () {errorCallback();}});});}
</script>
</html>

项目预览

我们需要在容器中启动该项目:

python3 main.py

并输入 127.0.0.1:5000 在浏览器中进行预览,最终效果如下:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_479104.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Atlas500】华为500小站预配置

目录 基础配置解决配置能力项未开启问题 基础配置 1.网线连接盒子 2.1口IP:192.168.2.111 2口IP&#xff1a;192.168.3.111 3.登临网页https://192.168.2.111 输入用户名和密码&#xff08;管理端用户&#xff09;。 ● 默认用户名&#xff1a;admin ● 默认密码&#xff1a;H…

【Scala入门】scala基础语法:类和对象,变量和常量

上一篇请移步【Scala入门】Scala下载及安装&#xff08;Windows&#xff09;以及Idea创建第一个scala项目_水w的博客-CSDN博客 目录 一、Scala 二、Scala基础语法 2.1 注释与标识符规范 2.2 变量与常量 【案例&#xff1a;变量声明和赋值】 2.3 object 【案例&#xff1…

2023年数据治理工程师证书有哪些值得考?DAMA-CDGA/CDGP

DAMA认证为数据管理专业人士提供职业目标晋升规划&#xff0c;彰显了职业发展里程碑及发展阶梯定义&#xff0c;帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力&#xff0c;促进开展工作实践应用及实际问题解决&#xff0c;形成企业所需的新数字经济下的核心职业…

【音视频】国际双向对讲方案

语音对讲的的整体流程为&#xff1a; 先拉流播放设备的视频&#xff1b;使用WebRTC推送语音流到ZLM服务&#xff1b;使用SIP协议下发Broadcast指令给设备&#xff1b;接收到设备的OK指令后&#xff0c;请求ZLM的startSendRtp接口&#xff0c;TCP协议请求startSendRtpPassive接口…

C/C++每日一练(20230423)

目录 1. 多组输入求和 ※ 2. 螺旋矩阵 II &#x1f31f;&#x1f31f; 3. 路径交叉 &#x1f31f;&#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 多组…

直播软件app开发:如何开发一个可以免费打扑克的直播应用?

作为一个技术开发人员&#xff0c;我深知直播软件app开发的重要性。在这个数字化时代&#xff0c;越来越多的人选择使用直播软件来分享自己的生活和与朋友互动。而随着技术的发展&#xff0c;直播软件也不断更新和改进&#xff0c;为用户提供更好的体验和功能。 对于开发者来说…

供需两端催化口腔医疗服务市场增长 未来将呈现线上化、智能化、品质化三大趋势

一、口腔医疗服务行业概述 口腔由唇、颊、舌、腭、涎腺、牙和颌骨等部分组成。口腔疾病种类繁多&#xff0c;伴随人全生命周期&#xff0c;常见疾病有龋病、牙周疾病、牙髓病、根尖周病、牙齿缺损、错颌畸形等&#xff0c;多数口腔疾病的发病率高&#xff0c;诊疗需求大。除此…

java 实现对称加密的方法

对称加密是一种加密算法&#xff0c;它和非对称加密的区别在于&#xff1a;加密和解密使用不同的密钥&#xff0c;对称加密使用同一个密钥对数据进行加密和解密。 今天我们来学习下对称加密的实现方法&#xff0c;不需要使用到私钥&#xff0c;只需要用到公钥。 首先我们来看下…

leetcode328. 奇偶链表

给定单链表的头节点 head &#xff0c;将所有索引为奇数的节点和索引为偶数的节点分别组合在一起&#xff0c;然后返回重新排序的列表。 第一个节点的索引被认为是 奇数 &#xff0c; 第二个节点的索引为 偶数 &#xff0c;以此类推。 请注意&#xff0c;偶数组和奇数组内部的相…

022:Mapbox GL 加载geojson数据,形成热力图,自定义样式

第022个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中加载geojson数据,形成热力图. paint设置的参数:heatmap-color,heatmap-intensity,heatmap-opacity,heatmap-radius,heatmap-weight,visibility,具体请参考下面的api链接。 直接复制下面的 vue+mapbox源代…

Java编译器插件Manifold(流形)

流形 文天祥正气歌中有云&#xff1a;“天地有正气&#xff0c;杂然赋流形”。 流形是一种抽象而又具体的事务&#xff0c;要研究一个事务就要格物&#xff0c;不格物就不能知道事物的具体描绘形式。流形大多数情况下是一种数学计算方式&#xff0c;可以将一个复杂的模型抽象…

V2.4版本商超标签专用路由器

PICK_Router_V2.4 产品参数 产品型号 PICK_Router_V2.4 尺寸(mm) 21*14*4.3mm 工作温度 -10-70℃ 产品重量 465g 供电方式 DC12V or POE 工作频率 2.4G 通信速率 50-250kbps 通信方式 10/100Mbps有线网络&2.4G 通信半径 30m 支持标签数量 >10000…

设计模式 -- 命令模式

前言 月是一轮明镜,晶莹剔透,代表着一张白纸(啥也不懂) 央是一片海洋,海乃百川,代表着一块海绵(吸纳万物) 泽是一柄利剑,千锤百炼,代表着千百锤炼(输入输出) 月央泽,学习的一种过程,从白纸->吸收各种知识->不断输入输出变成自己的内容 希望大家一起坚持这个过程,也同…

【Redis】Redis十大数据类型—列表List

介绍 List列表是简单的字符串列表&#xff0c;按照插入顺序排序&#xff0c;可以从头部或尾部向List列表添加元素。 列表的最大长度是2^32-1&#xff0c;也就是每个列表支持超过40亿个元素。 实现 底层数据结构是由双向链表或压缩列表实现。 如果列表的元素个数小于 512 个…

YOLOv7如何提高目标检测的速度和精度,基于模型结构提高目标检测速度

目录 一、目标检测二、目标检测的速度和精度的权衡1、速度和精度的概念和定义2、如何评估目标检测算法的速度和精度3、速度和精度之间的权衡 三、基于模型结构提高目标检测速度1、Backbone网络的选择2、特征金字塔网络的设计3、通道注意力机制4、混合精度训练 一、目标检测 目…

3个实用的文字转语音方法,让你时刻保持信息更新!

现在&#xff0c;我们生活节奏加快&#xff0c;信息量也越来越大&#xff0c;有时候想了解新闻却又不想眼睛再去盯着手机屏幕了&#xff0c;这时候文字转语音工具就可以帮助我们实现听新闻的需求。如果你还不了解文字如何转换成语音&#xff0c;别担心&#xff0c;今天我将向大…

不同的场景上线时钟同步系统需要注意些什么

时钟同步系统一般都是用在学校或者医院的环境当中&#xff0c;一般时钟同步系统由硬件和软件相组成。对于局域网部署&#xff0c;通常使用NTP协议。对于广域网部署&#xff0c;通常需要考虑网络延迟和安全性等因素。此外&#xff0c;时钟同步系统在不同的使用场景当中的需求也不…

15天学习MySQL计划-多表联查(基础篇)第四天

15天学习MySQL计划&#xff08;多表联查&#xff09;第四天 1.多表查询 1.1概述 ​ 指从多张表中查询数据 ​ 在项目开发中&#xff0c;在进行数据库表结构设计时&#xff0c;会根据业务需求及业务模块之间的关系&#xff0c;分析并设计表结构&#xff0c;由于业务之间相互…

记录-JavaScript常规加密技术

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 当今Web开发中&#xff0c;数据安全是一个至关重要的问题&#xff0c;为了确保数据的安全性&#xff0c;我们需要使用加密技术。JavaScript作为一种客户端编程语言&#xff0c;可以很好地为数据进行加…

sggJava基础第四天

1 分支结构 分支结构 根据条件&#xff0c;选择性地执行某段代码。 有if…else和switch-case两种分支语句。 概述 顺序结构的程序虽然能解决计算、输出等问题 但不能做判断再选择。对于要先做判断再选择的问题就要使用分支结构 if…else形式 单分支结构 代码实现 …