最优非对称加密填充(OAEP)

10.2.6 最优非对称加密填充(OAEP)

2009-01-11 14:14 马振晗/贾军保 清华大学出版社 字号: T |  T

《密码学与网络安全》第10章非对称密钥密码学,本章中讨论几种非对称密钥加密系统:RSA、Rabin、E1Gamal和ECC。本小节为大家介绍最优非对称加密填充(OAEP)。

AD:2013云计算架构师峰会课程资料下载

10.2.6  最优非对称加密填充(OAEP)

就像我们前面提到的那样,RSA中的一个短信息可以导致密文易遭受短信息攻击。也已经说明简单地给信息填充伪数据(填充位)也许就会使伊夫的工作变得十分困难,但是通过更进一步的努力,她还可以对密文进行攻击。由RSA群和一些厂商提出的解决办法就是应用称为最优非对称加密填充(OAEP)的过程。图10-9所示,就是该过程的简单版本,执行时也许要用更为完善的版本。

 
(点击查看大图)图10-9  最优非对称加密填充(OAEP)

图10-9中的全部概念就是P = P1 || P2,这里P1就是填充信息的掩模版M;P2发送以便允许鲍勃找出掩模。

加密  下面就是加密的过程:

(1) 爱丽丝填充这个信息来制成一个m比特的信息,我们称之为M。

(2) 爱丽丝选择一个k比特的随机数r。注意r只能使用一次然后就要销毁。

(3) 爱丽丝运用一个公共单向函数G,这个单向函数用一个r比特的整数并且创建一个m比特的整数(m表示M的大小,并且r   m)。这就是掩模。

(4) 爱丽丝运用掩模G(r)来创建明文 的第一部分。 是掩模信息。

(5) 爱丽丝创建明文 的第二部分。函数H是另一个公共函数,这个公共函数用一个m比特的输入创建一个k比特的输出。这个函数可以是一个加密的散列函数(参看第12章)。运用 以使鲍勃解密后重新创建掩模。

(6) 爱丽丝创建 并且把C发送给鲍勃。

解密  如下所示就是解密过程:

(1) 鲍勃创建 。

(2) 鲍勃首先运用H 重新创建r的值。

(3) 鲍勃运用 重新创建填充信息的值。

(4) 从M当中取消填充后,鲍勃得到了原信息。

1. 传输错误

即使在传输过程中有一个单比特的错误,RSA也会崩溃。如果收到的密文与所发送的不同,接收者就不能确定原明文。在接收方计算出来的明文也许和发送方发送出去的有很大的不同。传输媒介必须通过在密文上增加错误探测或错误纠正冗余比特使其没有错误。

例10.8

 
 
 
【责任编辑: 云霞 TEL:(010)68476606】
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RSA是一种非对称加密算法,它由三个部分组成:密钥生成、加密和解密。其中密钥生成阶段包括选择两个大素数p和q,计算它们的积N=pq,并选择一个整数e,满足e与(p-1)(q-1)互质。接着,计算d,使得(e×d) mod ((p-1)(q-1)) = 1。最后,公钥为(N,e),私钥为(N,d)。 在加密阶段,消息被转换为一个整数m(通常小于N),然后计算c = m^e mod N,密文即为c。 在解密阶段,接收方使用私钥(N,d)来计算m = c^d mod N,得到原始消息。 Python提供了内置模块`cryptography`来实现RSA加密和解密。我们可以使用`cryptography.hazmat.primitives.asymmetric.rsa`模块来生成密钥对,使用`cryptography.hazmat.primitives.asymmetric.padding`模块来进行填充,并使用`cryptography.hazmat.primitives.asymmetric.rsa.RSAPublicKey`和`cryptography.hazmat.primitives.asymmetric.rsa.RSAPrivateKey`类来表示公钥和私钥。下面是一个简单的例子: ```python from cryptography.hazmat.primitives.asymmetric import rsa, padding from cryptography.hazmat.primitives import serialization, hashes # Generate a key pair private_key = rsa.generate_private_key( public_exponent=65537, key_size=2048 ) public_key = private_key.public_key() # Serialize the keys private_key_pem = private_key.private_bytes( encoding=serialization.Encoding.PEM, format=serialization.PrivateFormat.PKCS8, encryption_algorithm=serialization.NoEncryption() ) public_key_pem = public_key.public_bytes( encoding=serialization.Encoding.PEM, format=serialization.PublicFormat.SubjectPublicKeyInfo ) # Encrypt a message message = b"Hello, world!" ciphertext = public_key.encrypt( message, padding.OAEP( mgf=padding.MGF1(algorithm=hashes.SHA256()), algorithm=hashes.SHA256(), label=None ) ) # Decrypt the message plaintext = private_key.decrypt( ciphertext, padding.OAEP( mgf=padding.MGF1(algorithm=hashes.SHA256()), algorithm=hashes.SHA256(), label=None ) ) print(plaintext) ``` 这里使用了OAEP填充方案进行加密和解密。需要注意的是,RSA加密的消息长度不能超过密钥长度减去一定的填充长度,否则会抛出`ValueError`异常。因此,在实际应用中,需要将消息分块加密。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值