Python算法053RSA加密体系

RSA加密体系

 

过去的理论都太生硬了,今天咱们终于可以完成RSA加密体系的算法了!

此处有一份免责声明需查收:不要理所当然地认为我的代码就是安全的;不要认为任何来自非专家的密码系统就是安全的;别独自实现任何密码系统;别以任何的方式干扰你的密码系统安全性;我们做的这个系列适用于愉快地玩耍,因此发出这样一份免责声明。

我已经有了大素数、如何生成RSA密钥及如何使用它们的方法。

不过,咱们还需要一个强大的伪随机生成器。咱们将要用SHA-512。它是一个安全的散列函数,并且为了安全起见,它必须满足一些特殊的要求。如:必须是一个稳定的伪随机数生成器。

我的方法是受到在实践中应用的RSA OAEP的启发。

图片

设想一下,我有两个1024位素数,2048位模数,随机生成器和SHA-512,那么我可以传输多达192字节的消息.。

以下是步骤:

  • IV: 生成64字节的随机值块。
  • H1, H2, H3: 重复使用SHA-512生成64字节的均匀随机值块。
  • X192: 带有级联块H1|H2|H3的XOR明文消息。
  • X64: 在X192上使用SHA-512生成另一个64字节的均匀随机值块,并使用XORIV
  • 加密:RSA(X192|X64, public_key)。

此核心思想是原始消息的随机化使得加密不确定以及选择密文安全。最后的256字节消息X192X64是完全随机切分布均匀的。这是可以证明的,但咱们说好了今天不学数学。

在文章的最后将有两个小样展示出来,在这两个小样中,明文 0 都是被加密的,并且每一次都会产生不同的密文。

我的编码实现一定是安全的吗?我当然不能确定因为我没办法证明它,但是我肯定我不会将它应用在实际的加密系统中 :-)

 

from os import urandomfrom hashlib import sha512
def rsa_generate_keys():    return [        65537,        58967658369561163583995664151705537612631456941226585145001736155445085885436956133402962616775555500479429922140321605063456075222335023020218578571558003435174909963319619244821157746252197885628802071763470174413201522569356053296685834595362968800778468737693074613267684084217204017873750446802044584084498581219849973790017343888256411013653688556278788070745635045095995056877259642839730825907965544973672656542601570609068817838234644958846427643088478240335082249677864789882511592486797239674160452077169411971273434857626735582274817190984442183721945999865859466422472845277588368259261760233826535480137    ], [        32639742054323523661031580828650534544392003478949839063736255562124081596351847364013089886417596950354636310108218358259943735367279937975211699593540109138569129405212055903155962561652878992005591100527818545966603574053221236696683939389678915058929150433015761702105657992264877747720954135956649973789334911071168428227464085150820871588160770978551544646965210798269197906675922224772713666123225990305644372957419486169245295190574189157389340237417783311258488777336686103120891002317113842264416737708675921812070527474901946450952078789439410581693777829144977217172397092723130874770379072485175449578961,        58967658369561163583995664151705537612631456941226585145001736155445085885436956133402962616775555500479429922140321605063456075222335023020218578571558003435174909963319619244821157746252197885628802071763470174413201522569356053296685834595362968800778468737693074613267684084217204017873750446802044584084498581219849973790017343888256411013653688556278788070745635045095995056877259642839730825907965544973672656542601570609068817838234644958846427643088478240335082249677864789882511592486797239674160452077169411971273434857626735582274817190984442183721945999865859466422472845277588368259261760233826535480137    ]
def bxor(x, y):     return bytes(i ^ j for i, j in zip(x, y))
def rsa_encrypt(plaintext, public_key):    # iv[64] -> h1[64] -> h2[64] -> h3[64]    iv = urandom(64)    h1 = sha512(iv).digest()    h2 = sha512(h1).digest()    h3 = sha512(h2).digest()        # x[192] := pt[192] ^ (h1|h2|h3)[192]    pt = int.to_bytes(plaintext, 192, 'big')    x192 = bxor(pt, h1 + h2 + h3)        # x[64] := iv[64] ^ x[192->64]    h4 = sha512(x192).digest()    x64 = bxor(iv, h4)    # x[256] := x[192]|x[64]    x256 = int.from_bytes(x192 + x64, 'big')    # rsa    return pow(x256, *public_key)
def rsa_decrypt(ciphertext, secret_key):    # rsa    x256 = pow(ciphertext, *secret_key)        # x[192]|x[64] := x[256]    x256 = int.to_bytes(x256, 256, 'big')    x192, x64 = x256[:192], x256[192:]        # iv[64] := x[64] ^ x[192->64]    h4 = sha512(x192).digest()    iv = bxor(x64, h4)    # iv[64] -> h1[64] -> h2[64] -> h3[64]    h1 = sha512(iv).digest()    h2 = sha512(h1).digest()    h3 = sha512(h2).digest()        # pt[192] := x[192] ^ (h1|h2|h3)[192]    pt = bxor(x192, h1 + h2 + h3)        # plaintext    return int.from_bytes(pt, 'big')    public_key, secret_key = rsa_generate_keys()

原创文章,作者:guozi,如若转载,请注明出处:https://www.sudun.com/ask/89486.html

(0)
guozi's avatarguozi
上一篇 2024年6月4日 下午3:41
下一篇 2024年6月4日 下午3:45

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注