加密、解密、签名、验签、数字证书、CA浅析

news2025/1/16 14:11:02

一、加密和解密

加密和解密应用的很广,主要作用就是防止数据或者明文被泄露。

加解密算法主要有两大类,对称加密和非对称加密。对称加密就是加密和解密的密钥都是一个,典型的有AES算法。非对称加密就是有公钥和私钥,公钥可以发布出去,私钥只对自己可见,私钥的拥有者需要对通过公钥加密的数据或者信息通过私钥进行解密,这样保证数据不被泄露,典型的非对称加密算法是RSA。下面通过代码实现一下上述过程

from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
import binascii

# 生成密钥对
key = RSA.generate(2048)
private_key = key.export_key()
file_out = open("private.pem", "wb")
file_out.write(private_key)
file_out.close()

public_key = key.publickey().export_key()
file_out = open("public.pem", "wb")
file_out.write(public_key)
file_out.close()

# 加载密钥
private_key = RSA.import_key(open("private.pem").read())
public_key = RSA.import_key(open("public.pem").read())

# 加密数据
message = "Hello, World!"
cipher_rsa = PKCS1_OAEP.new(public_key)
encrypted_message = cipher_rsa.encrypt(message.encode())

# 解密数据
decipher_rsa = PKCS1_OAEP.new(private_key)
decrypted_message = decipher_rsa.decrypt(encrypted_message).decode()

print("Original Message: ", message)
print("Encrypted Message: ", binascii.b2a_hex(encrypted_message))
print("Decrypted Message: ", decrypted_message)

运行结果如下

二、加密和解密存在的问题

在上述加密数据的代码后面添加两行代码

message = "Hello, World!"
cipher_rsa = PKCS1_OAEP.new(public_key)
encrypted_message = cipher_rsa.encrypt(message.encode())

tmp = "Hello, Python!"
encrypted_message = cipher_rsa.encrypt(tmp.encode())

再次运行后,输出如下

可见,解密后的数据发生了变化。

所以,只对数据加解密只能保证数据不被泄露,但是无法保证数据不被修改,就比如上述代码中的message,一旦被截获,就可以对原先数据的密文进行替换,虽然明文被加密的很好,但是最终得到的明文数据也出错

三、摘要、签名、签名验证

摘要、签名和签名验证就是为了解决加解密存在的问题

摘要就是通过特定的算法对一段数据进行概括,摘要算法有SHA(security hash algorithm),MD5(Message-Digest Algorithm),CRC(Cyclic Redundancy Check)等等。摘要算法的特点有三个:1、快。2、同样数据的摘要一样。3、无法通过摘要逆向得出原始数据

签名和签名验证也需要公钥和私钥。签名就是先对明文数据进行摘要计算,然后使用发送方的私钥对摘要进行加密,之后使用接收方的公钥对明文数据进行加密。最后将加密的摘要和加密的内容一起发出。

签名验证就是通过发送方的公钥对加密的摘要进行解密,得到明文数据的摘要,再通过接收方的私钥对明文数据进行解密,对解密后的明文再进行摘要计算,得到另一个明文数据的摘要,两个摘要做对比,一致,表示数据没被修改,否则表示数据被修改。

通过加密和签名可以保证数据既不被泄露,也不会被修改

下面通过代码实现一下上述过程(使用RSA2048对数据进行加解密,RSA4096对数据进行签名和验签)

from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
from Crypto.Signature import PKCS1_v1_5
from Crypto.Hash import SHA256
import binascii

# 生成加解密密钥对
key = RSA.generate(2048)
private_key2048 = key.export_key()
file_out = open("private2048.pem", "wb")
file_out.write(private_key2048)
file_out.close()

public_key2048 = key.publickey().export_key()
file_out = open("public2048.pem", "wb")
file_out.write(public_key2048)
file_out.close()

# 生成签名验签密钥对
key2 = RSA.generate(4096)
private_key4096 = key2.export_key()
file_out = open("private4096.pem", "wb")
file_out.write(private_key4096)
file_out.close()

public_key4096 = key2.publickey().export_key()
file_out = open("public4096.pem", "wb")
file_out.write(public_key4096)
file_out.close()

# 加载密钥
private_key2048 = RSA.import_key(open("private2048.pem").read())
public_key2048 = RSA.import_key(open("public2048.pem").read())

private_key4096 = RSA.import_key(open("private4096.pem").read())
public_key4096 = RSA.import_key(open("public4096.pem").read())

# 创建一个用于签名验签的对象
signer = PKCS1_v1_5.new(private_key4096)
verifier = PKCS1_v1_5.new(public_key4096)

# 加密数据
message = b"Hello, World!"
cipher_rsa = PKCS1_OAEP.new(public_key2048)
encrypted_message = cipher_rsa.encrypt(message)

# 计算摘要并签名
hash_object = SHA256.new()
hash_object.update(message)
print(hash_object.hexdigest())
signature = signer.sign(hash_object)

# tmp = b"Hello, Python!"
# encrypted_message = cipher_rsa.encrypt(tmp)

# 解密数据
decipher_rsa = PKCS1_OAEP.new(private_key2048)
decrypted_message = decipher_rsa.decrypt(encrypted_message).decode()

print("Original Message: ", message)
print("Encrypted Message: ", binascii.b2a_hex(encrypted_message))
print("Decrypted Message: ", decrypted_message)

# 计算明文摘要
hash_object2 = SHA256.new()
hash_object2.update(decrypted_message.encode())

print(hash_object2.hexdigest())

# 数据完整性检验,签名验证
try:
    flag = verifier.verify(hash_object2, signature)
    if not flag: 
        print(flag, "verification not ok")
    else:
        print(flag, "verification ok")
except ValueError:
    print("signature is not vaild")

运行结果如下

如果对明文数据进行修改,将下面两行代码注释解除

# tmp = b"Hello, Python!"
# encrypted_message = cipher_rsa.encrypt(tmp)

输入如下

可见,加了签名和签名校验后,即使数据被篡改,也能检查出来。这样,就弥补了只有加密算法的而产生的缺陷

四、数字证书和CA

上述的加解密和签名验签都基于一个假设:就是数据的接收方和发送发所持有的公钥都是正确的。但是,公钥也是数据,在收发公钥的过程中,公钥也可以被修改,为了防止公钥数据被篡改,就引入了一个第三方:CA(证书颁发机构(Certificate Authority))。数据的收发双方都从CA获取证书,从证书中提取公钥,保证公钥的正确性。

在嵌入式开发中,虽然没有第三方CA,但是也有类似的机制,把公钥的摘要存储在一块只能写入一次的区域,在程序执行时,计算公钥的哈希,与事先存储的摘要做对比,摘要一致,公钥正确,否则,公钥不正确。这样可以起到一个第三方发布公钥的作用

参考

签名、加密、证书的基本原理和理解 - 知乎

加密、摘要、签名、证书,一次说明白! - 掘金

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++/Qt 小知识记录5

工作中遇到的一些小问题,总结的小知识记录:C/Qt 小知识5 Windows下查看端口占用情况C调用Python三方库测试库有没有被加上的测试方法初始化使用Python的env环境,用Py_SetPythonHome设置GDAL相关的,需要把osgeo、rasterio的路径加入…

Linux 操作系统的引导过程

Linux系统开机引导过程: 开机自检 检测硬件设备,找到能够引导系统的设备,比如硬盘MBR引导 运行MBR扇区里的主引导程序GRUB启动GRUB菜单 系统读取GRUB配置文件(/boot/grub2/grub.cfg)获取内核的设置和…

基于WOA优化的CNN-GRU-Attention的时间序列回归预测matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1卷积神经网络(CNN)在时间序列中的应用 4.2 GRU网络 4.3 注意力机制(Attention) 4.4 WOA优化算法 5.算法完整程序工程 1.算法运行效果图…

java 学习一

jdk下载地址 配置环境变量

【RAG 论文】Query2doc — 使用 LLM 做 Query Expansion 来提高信息检索能力

论文:Query2doc: Query Expansion with Large Language Models ⭐⭐⭐⭐⭐ Microsoft Research, EMNLP 2023 文章目录 背景介绍Query2doc 论文速读实现细节实验结果和分析总结分析 背景介绍 信息检索(Information Retrieval,IR)指…

离线数仓数据导出-hive数据同步到mysql

离线数仓数据导出-hive数据同步到mysql MySQL建库建表数据导出 为方便报表应用使用数据,需将ads各指标的统计结果导出到MySQL数据库中。 datax支持hive同步MySQL:仅仅支持hive存储的hdfs文件导出。所以reader选hdfs-reader,writer选mysql-wri…

新手小白能做视频号小店吗?可以,但这几点一定要搞清楚

大家好,我是电商笨笨熊 视频号小店的推出吸引了不少的电商玩家,其中也有很多新手小白,大家对于此项目充满好奇,尤其是其私域电商的模式和中年以上的未被开发的用户群体,处处都充满着新风口。 但正所谓拿着旧地图找不…

【好书推荐7】《机器学习平台架构实战》

【好书推荐7】《机器学习平台架构实战》 写在最前面《机器学习平台架构实战》编辑推荐内容简介作者简介目  录前  言本书读者内容介绍充分利用本书下载示例代码文件下载彩色图像本书约定 🌈你好呀!我是 是Yu欸 🌌 2024每日百字篆刻时光&…

ONLYOFFICE协作空间:团队高效协作的终极武器!

文章目录 ONLYOFFICE协作空间初创版专业版(云端)企业版(内部部署) 亮点功能实时多人协作编辑高效的项目管理工具无缝集成第三方存储服务安全性和合规性支持Markdown文件群组功能和存储配额管理嵌入功能和数据导入自托管协作空间支…

YOLOv8 关键点检测模型训练部署

文章目录 1、YOLOv8安装及使用1.2、命令行使用1.3、使用python-API模型预测1.4、pt转换ONNX 2、训练三角板关键点检测模型2.1、训练命令 3、ONNX Runtime部署 1、YOLOv8安装及使用 参考链接: 同济子豪兄视频 github原文链接 # 安装yolov8 pip install ultralytics --upgrade …

操作系统:进程间通信 | 管道

目录 1.进程间通信介绍 1.1.简要介绍 1.2.进程间通信的目的 1.3.进程间通信的本质 2.管道 2.1.管道的通信原理 2.2.匿名管道 2.3.命名管道 2.4.基于匿名管道的进程池demo 2.4.1.进程池的相关引入 2.4.2.整体框架的分析 2.4.3.代码的实现 1.进程间通信介绍 1.1.简…

Etsy多账号关联怎么办?Etsy店铺防关联解决方法

Etsy虽然相对于其他跨境电商平台来说比较小众,但因为平台是以卖手工艺品为主的,所以成本较低,利润很高。许多跨境卖家都纷纷入驻,导致平台规则越发严格,操作不当就会封号,比如一个卖家操作多个账号会出现关…

kubernetes部署控制器Deployment

一、概念 在学习rc和rs控制器资源时,这两个资源都是控制pod的副本数量的,但是,他们两个有个缺点,就是在部署新版本pod或者回滚代码的时候,需要先apply资源清单,然后再删除现有pod,通过资源控制&…

赛氪网参与第61届中国高等教育博览会,助力产教融合与科教融汇

为深入贯彻党的二十大精神,落实立德树人根本任务,推动高等教育装备现代化,第61届中国高等教育博览会(以下简称“高博会”)于近日在福建省福州市隆重开幕。作为高等教育领域内的综合性品牌博览会,此次高博会…

达梦(DM)数据库表索引

达梦DM数据库表索引 表索引索引准则其他准则 创建索引显式地创建索引其他创建索引语句 使用索引重建索引删除索引 表索引 达梦数据库表索引相关内容比较多,常用的可能也就固定的一些,这里主要说一下常用的索引,从物理存储角度进行分类&#…

【声呐仿真】学习记录0.5-配置ssh远程连接docker、在docker中使用nvidia显卡

【声呐仿真】学习记录0.5-配置ssh远程连接docker、在docker中使用nvidia显卡 配置ssh远程连接docker1.端口映射2.配置ssh 在docker中使用nvidia显卡配置CUDA 注意:之前已经创建过容器的,需要打包成镜像,重新创建容器,因为要在创建…

# IDEA2019 如何打开 Run Dashboard 运行仪表面板

IDEA2019 如何打开 Run Dashboard 运行仪表面板 段子手168 1、依次点击 IDEA 上面工具栏 —> 【View】 视图。 —> 【Tool Windows】 工具。 —> 【Run Dashboard】 运行仪表面板。 2、如果 【Tool Windows 】工具包 没有 【Run Dashboard】 运行仪表面板 项 依次…

uniapp制作多选下拉框和富文本(短信页面)

实例 多选下拉框实现 http://t.csdnimg.cn/TNmcF 富文本实现 http://t.csdnimg.cn/Ei1iV

网络带宽相关

1.tcp重传率计算 watch -n 5 “cat /proc/net/snmp” 如下博客所讲 https://blog.csdn.net/michaelwoshi/article/details/121189743 2.iperf测试网络带宽 #客户端 #tcp iperf -c 服务端ip -P 4 -b 200M #udp iperf -c 服务端ip -u -P 4 -b 1000M -l 10K #服务端 iperf -s