我正在尝试运行两个我用PyCryptodome为PyCrypto编写的简单函数。以下是具有相关类成员定义的函数:
import Crypto.PublicKey.RSA as RSA
class MyRSA():
n = "123..." # these are actually very long string...
p = "345..."
u = "567..."
q = "789..."
e = long(65537)
t = (long(n), e, long(d), long(p), long(q), long(u))
key = RSA.construct(t)
def DecryptText(self, text):
chunk_size = 128
enc_vec = [text[i:i+chunk_size] for i in range(0, len(text),
chunk_size)]
plain_text = ''
for x in enc_vec:
plain_text += MyRSA.key.decrypt(x)
return plain_text
def EncryptText(self, text):
chunk_size = 128
text_vec = [text[i:i+chunk_size] for i in range(0, len(text),
chunk_size)]
enc_text = ''
for x in text_vec:
enc_text += MyRSA.key.encrypt(x, '')[0]
return enc_text
EncryptText和DecryptText这两个函数使用PyCrypto方法加密和解密,这些方法在PyCryptodome中不再存在(当外部代码调用时会引发NotImplemented错误)。任何人都可以帮助我将它们转换为符合PyCryptodome的代码吗?提前致谢!
RSA加密的基本组成部分是填充。 Pycrypto用于暴露RSA密钥对象(您使用的)的原始decrypt
和encrypt
方法,但这是错误和不安全的,因为它们没有实现任何填充。
相反,你应该使用模块Crypto.Cipher.PKCS1_OAEP
(pycryptodome中的唯一选项),它可以安全地处理填充。
这不是你问的问题,但请注意你的EncryptText
存在明显的加密弱点。您将邮件拆分为块并加密每个邮件。此方法与对称加密的ECB模式大致相同,因此它具有相同的弱点:
a)攻击者能够重新排序消息的块,或者在不同的加密之间交换它们。
b)重复的块是可见的,为攻击者提供了如何解密消息的线索。