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

一、加密和解密

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

加解密算法主要有两大类,对称加密和非对称加密。对称加密就是加密和解密的密钥都是一个,典型的有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.mzph.cn/web/2292.shtml

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

相关文章

【Web】DASCTF X GFCTF 2024|四月开启第一局 题解(全)

目录 EasySignin cool_index SuiteCRM web1234 法一、条件竞争(没成功) 法二、session反序列化 EasySignin 先随便注册个账号登录,然后拿bp抓包改密码(username改成admin) 然后admin / 1234567登录 康好康的图片功能可以打SSRF,不能直接读本地文…

最详细步骤解决:Apps targeting Android12 and higher are required to specify...

问题原因: 当targetSdkVersion>31时,需要在AndroidManifest.xml中配置android:exported的值,该值为boolean类型。 android:exported解释: activity 是否可由其他应用的组件启动: 如果设为 "true"&#…

持续更新。。。

1、JAVA面试指南 https://javaguide.cn/ 简历优化:突出与应聘职位相关的项目经验、技术栈、技能证书和专业成就。确保简历中的技术关键词与JD(Job Description)相符。 自我评估:对照目标职位要求,梳理自身Java技能树&…

【磁盘根目录扩容】

目的 给磁盘的根目录扩容,每个人在服务器上在根目录操作的可能性更大,如果单独指定一个目录扩容,很有可能使用不当 步骤 未扩容时,查看到sda下有两个分区,目前要扩展追加一个分区 使用fdisk -l查看到sda有4.9T&…

AI写作助手:一键智能改写文章质量高

无论是自媒体人写作文章、还是企业撰写宣传资料,文字都是表达思想和传递信息的重要介质。然而,有时候我们在工作中可能会遇到写作困难,或者想要对文章进行一定程度的改写以增加独特性和质量。而在这样的背景下,智能改写文章成为了…

VS2019编译OSG3.7.0+OSGEarth3.3+OSGQt

原文链接:VS2019编译OSG3.7.0OSGEarth3.3OSGQt-CSDN博客 工具与环境 这里使用的 cmake-3.18.3 、 VS2019 和 Qt5.15.2 进行编译。 一、编译OSG3.7.0 1、下载 下载不多赘述,在github上下master版本就是3.7.0版本。 另外还需要 3rdParty_VS2017_v141_…

Maxwell安装使用和简单案例

一、解压 cd /opt/software/ ​ tar -zxvf maxwell-1.29.2.tar.gz -C /opt/module/ ​ cd /opt/module/ 二、MySQL 环境准备 1、修改 mysql 的配置文件 修改 mysql 的配置文件,开启 MySQL Binlog 设置 vi /etc/my.cnf 添加以下内容 server_id1 log-binmysql-…

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

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

把 WordPress 变成 BaaS 服务:API 调用指南

有了前面两篇内容的铺垫,我们来聊聊 WordPress 作为 CMS / BaaS 服务使用时绕不开的问题,API 调用。 这篇内容同样的,会尽量少贴代码,简单的讲清楚一件事,降低阅读负担。 写在前面 首先,我们需要进行清晰…

Docker Compose 的安装和使用详解

Docker Compose 是 Docker 官方开源的容器编排(Orchestration)项目之一,用于快速部署分布式应用。本文将介绍 Docker Compose 的基本概念、安装流程及使用方法。 简介 Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。从功能上看,Docker C…

卡车卫星定位系统 user/create 未授权密码重置漏洞复现

0x01 产品简介 卡车卫星定位系统是一种基于卫星通信和导航技术的系统,用于对卡车的位置进行精确测定。该系统主要由一组卫星、地面控制站和接收器组成。通过测量卫星信号的传播时间,可以确定接收器(即卡车上的定位设备)所在的位置。具有高精度、高可靠性、全球覆盖等特点,…

上位机图像处理和嵌入式模块部署(树莓派4b的一种固件部署方法)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 如果软件开发好了之后,下面就是实施和部署。对于树莓派4b来说,部署其实就是烧录卡和拷贝文件。之前我们烧录卡,…

服务器防入侵的方案浅析

随着物联网技术和互联网技术的日益发展,勒索病毒、工控安全、产线作业都面领着极大的威胁。智慧互联正在成为各个行业未来的发展方向,智慧互联包括物联网、万物互联,机器与机器,工业控制体系,信息化,也就是…

FLStudio怎么冻结轨道以及如何批量复制音符

FLStudio是一款功能强大的音乐制作软件,广泛用于音乐制作和打谱当中。我们在制作音乐时,经常会遇到处理大量音频轨道的情况,过多的音频轨道可能会导致电脑性能受限,从而影响工作流程。为了应对这个问题,FLStudio提供了…

ctfshow web入门 SQl注入 web185--web190

web185 这道题还有另外一个脚本就是用concat的拼接达到有数字的目的 concat(truetrue) 2 concat(true) 1 concat(true, true) 11 然后上脚本(Y4tacker这个师傅的) # Author:Y4tacker import requestsurl "http://341e93e1-a1e7-446a-b7fc-75beb…

目标检测——行人交通信号灯数据集

一、重要性及意义 行人交通信号灯检测的重要性及意义主要体现在以下几个方面: 首先,行人交通信号灯检测对于提高道路安全性至关重要。通过准确识别交通信号灯的状态,行人可以更加清晰地了解何时可以安全地过马路,从而避免与车辆…

node.js版本降级/升级

第一步.先清空本地安装的node.js版本 按健winR弹出窗口,键盘输入cmd,然后敲回车(或者鼠标直接点击电脑桌面最左下角的win窗口图标弹出,输入cmd再点击回车键) 进入命令控制行窗口,输入where node,查看本地…

Android Studio历史版本下载地址

https://developer.android.com/studio/archive?hlzh-cn https://blog.csdn.net/crasowas/article/details/130304836

STM32F4使用FPU/DSP核心启用与测试

STEP1、下载DSP库 具体链接如下: https://www.st.com/en/embedded-software/stsw-stm32065.html?dl9w6sdOSAKySFxBhN764Stg%3D%3D%2CIS1vzyA84KLAefK%2B0DawUl0FScREpiT6AdC3qFjIMJnCIgXIwr82G2XUFo6w43Wp5L5CUyrX3vZAoaHRE3nsTmRsArV3hnQOEgX73SKt8ss1vGrLlfXT24j…

js获取某月往前推一年或半年的年月数组

前言 需求:需要显示某月份往前推一年或者半年的费用情况,显示到柱形图上,后台接口只返回有数据的年份,这就需要前端拿全部月份数组去比对并显示。 开始 上代码: // date:选择的月份,比如:2024-04,//n:半年或者1年,…