对称加密(symmetric encryption)和非对称加密(Asymmetric Encryption)(密钥、公钥加密、私钥解密)AES、RSA
文章目录
- 对称加密与非对称加密
- 对称加密
- 1.1 定义
- 1.2 工作原理
- 1.3 场景分析
- 1.4 算法示例(以AES为例)
- 1.5 对称加密的优点与缺点
- 优点
- 缺点
- 非对称加密
- 2.1 定义
- 2.2 工作原理
- 注意:每次生成的RSA密钥对都会不一样
- 2.3 场景分析
- 2.4 算法示例(以RSA为例)
- 2.5 非对称加密的优点与缺点
- 优点
- 缺点
- 结论
对称加密与非对称加密
在今天的数字化世界中,保护信息安全已经成为一个至关重要的任务。因此,了解和使用有效的加密技术是必不可少的。本文将介绍两种主要的加密类型:对称加密和非对称加密。
对称加密
1.1 定义
对称加密是一种早期的加密技术,其特点是在加密和解密过程中使用同一密钥(密码)。这就意味着,任何知道这个密钥的人都能解密被加密的信息。对称加密因其高效性和易于实施而受到广泛的欢迎。
1.2 工作原理
当发送者需要发送加密消息时,他们首先会使用一个密钥(也可以称之为密码)来转换或"加密"原始信息。接收者在收到加密消息后,需要用同一个密钥来"解密"这些信息,以获取原始的明文内容。
1.3 场景分析
假设Alice想要向Bob发送一个加密的消息,但是他们只能通过不安全的通信渠道交流。他们可以选择对称加密方法,步骤如下:
-
密钥生成:首先,Alice需要生成一个秘密密钥。这个密钥可以是随机生成的一串字节,其长度取决于所选的加密算法。例如,如果他们使用AES-128,那么密钥就应该是128位(或16字节)。
-
加密消息:然后,Alice使用这个密钥和加密算法(如AES)对她想要发送的消息进行加密。
-
密钥共享:为了让Bob能够解密这个消息,Alice需要找到一种安全的方式把密钥传给他。这可能需要另外的安全通信渠道(比如直接口头告知,小声点不要被人听到,因为我们要发送的是私㊙消息,防止被人窃取),或者他们之前就已经共享过密钥。
-
解密消息:Bob收到加密的消息和密钥后,就可以使用相同的加密算法和密钥对消息进行解密,从而获得原始的明文消息。
1.4 算法示例(以AES为例)
常见的对称加密算法有AES(高级加密标准)、DES(数据加密标准)、3DES、Blowfish等。其中,AES是目前最常用的对称加密算法。
# Import the AES module from Crypto.Cipher. This will be used to create the cipher objects for encryption and decryption.
# pip install pycryptodome
from Crypto.Cipher import AES# Import base64 module for encoding the encrypted text into ASCII so that it can be printed and stored easily.
import base64# The key used for encryption and decryption. It should be 16 bytes (128 bits), 24 bytes (192 bits) or 32 bytes (256 bits) long.
# Here we're using a 16-byte key, which means our AES cipher is operating in 128-bit mode.
key = b'abcdefghabcdefgh'
print("Encryption Key: ", key)# The data that we want to encrypt. In a real use case, this could be sensitive information like a password or a secret message.
data = "Hello, World!"
print("Original Data: ", data)# AES encryption requires the input to be a multiple of 16 bytes in length. If our data is not long enough, we need to pad it.
# Here we're padding the data with spaces on the right until it's 32 bytes long.
# We also need to convert our data into bytes, since AES works on bytes, not strings.
data_bytes = data.ljust(32).encode()
print("Padded and Encoded Data: ", data_bytes)# Create a new AES cipher object with our key, using ECB (Electronic Codebook) mode.
cipher = AES.new(key, AES.MODE_ECB)# Encrypt the data using our cipher, then encode the encrypted data into base64 so it can be printed and stored easily.
encrypted_text = base64.b64encode(cipher.encrypt(data_bytes))
print("Encrypted Text: ", encrypted_text)# Now let's decrypt the data. We'll create another AES cipher with the same key.
cipher2 = AES.new(key, AES.MODE_ECB)# Decrypt the data using our second cipher. First we need to decode the base64 back into bytes.
# After decryption, we strip any trailing spaces that were added during the padding process.
decrypted_text = cipher2.decrypt(base64.b64decode(encrypted_text)).strip()# Finally, print the decrypted text. We need to decode it from bytes back into a string.
print("Decrypted Text: ", decrypted_text.decode())
# 导入Crypto.Cipher模块下的AES。这将被用来创建加密和解密的密码对象。
from Crypto.Cipher import AES# 导入base64模块以将加密的文本编码为ASCII,以便可以轻松地打印和存储。
import base64# 用于加密和解密的密钥。它应该是16字节(128位)、24字节(192位)或32字节(256位)长。
# 这里我们使用了一个16字节的密钥,这意味着我们的AES密码器工作在128位模式下。
key = b'abcdefghabcdefgh'
print("加密密钥: ", key)# 我们想要加密的数据。在真实的使用场景中,这可能是敏感信息,如密码或秘密消息。
data = "Hello, World!"
print("原始数据: ", data)# AES加密要求输入的长度是16字节的倍数。如果我们的数据不够长,我们需要对其进行填充。
# 这里我们通过右边添加空格来填充数据,直到它达到32字节的长度。
# 我们还需要将数据转换为字节,因为AES处理的是字节,而不是字符串。
data_bytes = data.ljust(32).encode()
print("填充和编码后的数据: ", data_bytes)# 使用我们的密钥创建一个新的AES密码对象,使用ECB(电子密码本)模式。
cipher = AES.new(key, AES.MODE_ECB)# 使用我们的密码对数据进行加密,然后将加密的数据编码为base64,以便可以轻松地打印和存储。
encrypted_text = base64.b64encode(cipher.encrypt(data_bytes))
print("加密文本: ", encrypted_text)# 现在让我们解密数据。我们将使用相同的密钥创建另一个AES密码器。
cipher2 = AES.new(key, AES.MODE_ECB)# 使用我们的第二个密码对数据进行解密。首先我们需要将base64解码回字节。
# 解密后,我们去掉在填充过程中添加的任何尾随空格。
decrypted_text = cipher2.decrypt(base64.b64decode(encrypted_text)).strip()# 最后,打印解密的文本。我们需要将其从字节解码回字符串。
print("解密文本: ", decrypted_text.decode())
运行结果:
(可以看到,每次结果都一样,不带随机的)

1.5 对称加密的优点与缺点
优点
- 效率高:对称加密算法比非对称加密算法快得多。
- 简单易用:对称加密很容易实施,只需要管理一个密钥。
缺点
- 密钥分发问题:对称加密的最大问题是如何安全地将密钥传输给接收者。如果密钥在传输过程中被截获,那么加密的信息就可能被解密和滥用。
非对称加密
2.1 定义
非对称加密,也被称为公钥加密,它使用一对密钥进行加密和解密操作。这两个密钥通常被称为公钥和私钥。其中,公钥可以公开给任何人,而私钥必须保持秘密。
2.2 工作原理
发送者使用接收者的公钥对消息进行加密,只有使用匹配的私钥才能解密这些消息。因此,即使攻击者截获了加密消息,他们也无法解密它,除非他们有接收者的私钥。
注意:每次生成的RSA密钥对都会不一样
每次生成的RSA密钥对都会不一样。这是因为在生成密钥对的过程中,涉及到了随机数的产生。
具体来说,RSA密钥对的生成包括以下步骤:
- 随机选择两个大素数p和q。
- 计算n = p * q和φ(n) = (p - 1) * (q - 1)。
- 选择一个整数e,使得1 < e < φ(n),且e和φ(n)互质。
- 计算d,使得d * e ≡ 1 (mod φ(n))。
其中,公钥就是(e, n),私钥就是(d, n)。
因为步骤1中的素数p和q是随机选择的,所以每次生成的密钥对都会不同。这也是为什么RSA加密算法能够提供高安全性的原因之一:即使攻击者知道了你的公钥和加密算法,他们也无法预测你下一次生成的密钥对会是什么。
2.3 场景分析
非对称加密的过程比对称加密稍微复杂一些。假设Alice想要安全地向Bob发送一个消息,他们选择非对称加密方法,步骤如下:
-
密钥对生成:首先,Bob需要生成一对公钥和私钥。私钥必须保密,而公钥可以公开。
-
公钥共享:然后,Bob把他的公钥发送给Alice。因为即使公钥被别人获取,没有对应的私钥,他们也无法解密经过公钥加密的信息,所以这个步骤不需要额外的安全通信渠道。
-
加密消息:Alice收到Bob的公钥后,就可以用它来加密她想要发送的消息。
-
解密消息:Alice将加密的消息发送给Bob,只有Bob可以使用他的私钥对消息进行解密。
2.4 算法示例(以RSA为例)
RSA和ElGamal是最常见的非对称加密算法。以下是一个使用RSA进行加密和解密的Python示例:
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
import base64# 创建密钥对
# RSA.generate函数用于生成新的RSA密钥对。2048是密钥长度,单位是比特。
key = RSA.generate(2048)
print("Raw Key: ", key)# 使用export_key方法将原始密钥转换为可以存储或传输的格式
private_key = key.export_key()
print("Private Key: ", private_key)public_key = key.publickey().export_key()
print("Public Key: ", public_key)# 将消息用公钥加密
# RSA.import_key方法用于从字符串形式的密钥恢复为原始的密钥格式
recipient_key = RSA.import_key(public_key)# PKCS1_OAEP是一种填充方案,用于将明文扩展到合适的长度以便进行RSA加密
cipher_rsa = PKCS1_OAEP.new(recipient_key)# 加密后的数据通常包含不可打印的字符,所以我们用base64编码将其转换为可打印的字符串形式
encrypted_data = base64.b64encode(cipher_rsa.encrypt(b"Hello, World!"))
print("Encrypted Text: ", encrypted_data)# 使用私钥解密消息
private_key = RSA.import_key(private_key)
cipher_rsa = PKCS1_OAEP.new(private_key)# 解密时,首先要将数据从base64编码的字符串形式恢复为原始的字节串形式
decrypted_data = cipher_rsa.decrypt(base64.b64decode(encrypted_data))# 最后,我们将解密得到的字节串转换为字符串形式以便阅读和处理
print("Decrypted Text: ", decrypted_data.decode())
运行结果:

(每次结果都不一样的)
2.5 非对称加密的优点与缺点
优点
- 安全性高:由于公钥可以公开分发,因此不需要像对称加密那样安全地传输密钥。
缺点
- 效率低:相比对称加密,非对称加密的速度较慢。
- 复杂性高:非对称加密需要更复杂的管理和实施。
结论
对称加密和非对称加密都有各自的优点和缺点。在选择加密方法时,需要考虑到数据安全性、性能、可用性等因素。在许多情况下,这两种加密技术会结合使用,以充分利用各自的优点,例如SSL/TLS协议就是一个很好的例子。
相关文章:
对称加密(symmetric encryption)和非对称加密(Asymmetric Encryption)(密钥、公钥加密、私钥解密)AES、RSA
文章目录 对称加密与非对称加密对称加密1.1 定义1.2 工作原理1.3 场景分析1.4 算法示例(以AES为例)1.5 对称加密的优点与缺点优点缺点 非对称加密2.1 定义2.2 工作原理注意:每次生成的RSA密钥对都会不一样 2.3 场景分析2.4 算法示例ÿ…...
iOS 16.4 之后真机与模拟器无法使用Safari调试H5页面问题
背景 iOS 16.4之后用真机调试H5时候发现,Safari中开发模块下面无法调试页面 解决方案 在WKWebView中设置以下代码解决 if (available(iOS 16.4, *)) {[_webView setInspectable:YES];}然后再次调试就可以了...
野火霸天虎 STM32F407 学习笔记_3 尝试寄存器映射方式点亮 LED 灯
新建工程 寄存器方式 要命啊,一看名字我就不想试。寄存器新建不得麻烦死。 哎算了为了学习原理,干了。 我们尝试自己写一个寄存器的库函数来引用。 首先我们需要引用 st 官方启动文件 stmf4xx.s,具体用途后面章节再展开讲解。然后我们自…...
ZZ308 物联网应用与服务赛题第F套
2023年全国职业院校技能大赛 中职组 物联网应用与服务 任 务 书 (F卷) 赛位号:______________ 竞赛须知 一、注意事项 1.检查硬件设备、电脑设备是否正常。检查竞赛所需的各项设备、软件和竞赛材料等; 2.竞赛任务中所使用…...
怎样选择文件外发控制系统,让数据实现高效安全交换?
制造型企业都非常重视其知识产权(IP)的安全性,尤其是其最有价值的产品设计数据的安全问题。基于复杂的供应链生态,每天可能要与几十家甚至上百家供应商及合作伙伴进行数据交换。不管是一级还是二级供应商,合作伙伴还是…...
专访 SPACE ID:通往 Web3 无许可域名服务协议之路
Web3 行业发展风起云涌,对于初创项目而言,如何寻找适合自己的赛道是首要问题。当前伴随用户交互和跨平台操作需求日渐兴起,如何更迅速地使用一站式域名实现便捷验证成为大众的心头期盼。 这一背景下,SPACE ID 于众星林立的 Web3 …...
合并分支--将自己的分支合并到master分支
在版本控制系统(例如Git)中,将自己的分支合并到master(或者主分支)通常需要以下步骤: ### 1. 切换到主分支 首先,确保你的本地仓库当前处于主分支。你可以使用以下命令切换到主分支࿱…...
力扣:153. 寻找旋转排序数组中的最小值(Python3)
题目: 已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums [0,1,2,4,5,6,7] 在变化后可能得到: 若旋转 4 次,则可以得到 [4,5,6,7,0,1,2]若旋转…...
matlab中实现画函数图像添加坐标轴
大家好,我是带我去滑雪! 主函数matlab代码: function PlotAxisAtOrigin(x,y); if nargin 2 plot(x,y);hold on; elsedisplay( Not 2D Data set !) end; Xget(gca,Xtick); Yget(gca,Ytick); XLget(gca,XtickLabel); YLget(gca,YtickLabel)…...
C语言求解一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
完整代码: /* 一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问 该数是多少?*/ #include<stdio.h>int main(){//num为最终所求那个数int num;//i*i为第一个完全平方数for (int i 10; …...
AtCoder abc148
C题 求GCD D题 顺序遍历 E题 trailing zero只与5的个数有关,因此算一下5/25/125…的倍数 # -*- coding: utf-8 -*- # time : 2023/6/2 13:30 # file : atcoder.py # software : PyCharmimport bisect import copy import sys from itertools import perm…...
k8s、docker 卸载
k8s卸载 k8s 重置 kubeadm reset -f如果kubernets是1.24以上版本,请先单独卸载containerd sudo apt purge containerd.iok8s软件卸载 ubuntu #apt卸载 apt purge kubelet kubeadm kubectlcentos yum erase -y kubelet kubectl kubeadm 删除kubelet相关信息&am…...
【Linux】Shell命令行的简易实现(C语言实现)内键命令,普通命令
文章目录 0.准备工作1.大体框架 一、获取命令行二、解析命令行三、进程执行1.普通命令2.内建命令 四、完整代码: 0.准备工作 1.大体框架 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h> #include <u…...
Kafka -- 架构、分区、副本
1、Kafka的架构: 1、producer:消息的生产者 2、consumer:消息的消费者 3、broker:kafka集群的服务者,一个broker就是一个节点,主要是负责处理消息的读、写的请求和存储消息。在kafka cluster中包含很多的br…...
CSS特效001:鼠标放div上,实现旋转、放大、移动等效果
GPT能够很好的应用到我们的代码开发中,能够提高开发速度。你可以利用其代码,做出一定的更改,然后实现效能。 css实战中,经常会看到这样的场景,鼠标放到一个图片或者一个div块状时候,会出现旋转、放大、移动…...
gin 快速入门手册
文章目录 安装URL和路由分组2. 带参数的url3. 获取路由分组的参数 获取参数1. 获取get参数2. 获取post参数3. get、post混合 JSON 、 ProtoBuf渲染1. 输出json和protobuf2. PureJSON 表单验证1. 表单的基本验证 中间件和next函数1. 无中间件启动2. 使用中间件3. 自定义组件 设置…...
Window下安装 Mongodb,并实现单点事务
在window操作系统下安装Mongodb,并让单点mongodb支持事务,mongodb5以上时才支持事务,所以必须时mongodb5及以上版本才支持。 1、下载mongodb安装文件 (1) 下载mongodb msi 安装文件 地址:mongocommunity &…...
【通信原理】第三章 随机过程——例题
一、随机过程 1. 数学特征 ① 随机信号(三角函数表达式) ② 随机信号(求和表达式) 2. 功率谱密度 ① 相位确定,求功率谱密度 ② 已知相位分布,求功率谱密度 ③ 信号为两信号之和,求功率谱密度…...
线性【SVM】数学原理和算法实现
一. 数学原理 SVM是一类有监督的分类算法,它的大致思想是:假设样本空间上有两类点,如下图所示,我们希望找到一个划分超平面,将这两类样本分开,我们希望这个间隔能够最大化来使得模型泛化能力最强。 如上图所…...
R语言中的函数26:polyroot多项式求根函数
目录 介绍函数介绍参数含义 示例 介绍 R语言中的base::polyroot()可以用于对多项式求根,求根的多项式可以是复数域上的。 函数介绍 polyroot(z)该函数利用Jenkins-Traub算法对多项式 p ( x ) p(x) p(x)进行求根,其中 p ( x ) z 1 z 2 x ⋯ z n x…...
为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...
Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换
目录 关键点 技术实现1 技术实现2 摘要: 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式(自动驾驶、人工驾驶、远程驾驶、主动安全),并通过实时消息推送更新车…...
vue3 daterange正则踩坑
<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...
上位机开发过程中的设计模式体会(1):工厂方法模式、单例模式和生成器模式
简介 在我的 QT/C 开发工作中,合理运用设计模式极大地提高了代码的可维护性和可扩展性。本文将分享我在实际项目中应用的三种创造型模式:工厂方法模式、单例模式和生成器模式。 1. 工厂模式 (Factory Pattern) 应用场景 在我的 QT 项目中曾经有一个需…...
恶补电源:1.电桥
一、元器件的选择 搜索并选择电桥,再multisim中选择FWB,就有各种型号的电桥: 电桥是用来干嘛的呢? 它是一个由四个二极管搭成的“桥梁”形状的电路,用来把交流电(AC)变成直流电(DC)。…...
