公钥密码体制

公钥密码体制#

公钥密码体制是为了解决对称密码体制中最难解决的2个问题而提出的:

  • 密钥分配问题:在对称密码中,接受方和发送方使用相同密钥。一般情况下该密钥通过加密信道进行传输。但是加密信道可能会被攻击者攻击。
  • 数字签名问题:如果使用对称加密来进行数字签名,那么在对密钥进行管理和分发时带来被攻击者攻击的问题。

在公钥密码体制中存在2个密钥:公钥,私钥。公钥和加密算法是公开的,公钥用于加密数据;私钥是保密的,用于解密。

下面是加密过程

image-20230304122928878

  • 步骤1:接受者B产生一对公钥PKB,私钥SKB。接收者B将公钥PKB发送给发送者A。
  • 步骤2:发送者A发送消息m,则将消息m利用公钥PKB进行加密:c=EPKB[m],其中E是加密算法。
  • 步骤3:接收者B收到消息后,使用私钥SKB对密文c进行解密:m=DSKB[c],其中D为解密算法。

RSA算法#

算法描述#

密钥产生

  • 选择2个保密的大素数p,q
  • 计算n=pq,ϕ(n)=(p1)(q1),ϕ(n)为n的欧拉函数值。
  • 选择一个数e, 满足e与ϕ(n)互素,既gcd(e,ϕ(n))=1
  • 计算e在模ϕ(n)下的逆元d,既:de1 mod ϕ(n)

则公钥为(e, n),密钥为(d, n)

加密

加密时首先将明文比特串分组,使得每个分组对应的十进制小于n,既分组长度小于log2(n),然后对每个明文分组m,作加密操作:

cmemod n

解密

对密文分组的解密运算如下:

mcdmod n

RSA算法的安全性#

RSA算法的安全性是依赖于分解大数的困难性所决定的,换句话说一个大整数n,如何被分解为两个数字p, q。如果在产生密钥的过程中,p,q选取10100左右的大素数, 那么n的阶为10200。想要分解这样的数字还是有困难的。估计在很长的一段时间,密钥长度介于1024bit到2048bit之间的RSA是安全的。

实验#

from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
from Crypto.Util.Padding import pad, unpad

# 生成RSA密钥对
key = RSA.generate(2048)
private_key = key.export_key()
public_key = key.publickey().export_key()

# 显示密钥对
print("私钥:", private_key.decode())
print("公钥:", public_key.decode())

# 初始化加密器和解密器
cipher = PKCS1_OAEP.new(RSA.import_key(public_key))
decryptor = PKCS1_OAEP.new(RSA.import_key(private_key))

# 加密明文
plaintext = b"Hello, world!".ciphertext = cipher.encrypt(pad(plaintext, 256))
print("密文:" ,ciphertext.hex())

# 解密密文
decrypted_text = unpad(decryptor.decrypt(ciphertext), 256)
print("解密后的明文:", decrypted_text.decode())

作者:ALINGMAOMAO

出处:https://www.cnblogs.com/ALINGMAOMAO/p/17178138.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   青山新雨  阅读(354)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· 【.NET】调用本地 Deepseek 模型
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
历史上的今天:
2021-03-04 Scala对日期处理笔记--Calendar类的使用
more_horiz
keyboard_arrow_up light_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示