我正在尝试运行为PyCrypto和PyCryptodome写的两个简单函数。以下是带有相关类成员定义的函数:
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这两个函数使用PyCryptodome不再拥有的PyCrypto方法加密和解密(当由外部代码调用它们时会引发NotImplemented错误)。谁能帮助我将它们转换为与PyCryptodome兼容的代码?预先感谢!
答案 0 :(得分:1)
RSA加密的基本组成部分是填充。 Pycrypto曾经公开了RSA密钥对象(您使用的方法)的原始decrypt
和encrypt
方法,但这是错误且不安全的,因为它们没有实现任何填充。
相反,您应该使用模块Crypto.Cipher.PKCS1_OAEP
(pycryptodome中的唯一选项),该模块可以安全地处理填充。
答案 1 :(得分:1)
这不是您要问的问题,但是请注意,您的EncryptText
中存在严重的加密漏洞。您将消息分成多个块并加密每个消息。此方法与对称加密的ECB模式大致相同,因此存在相同的弱点:
a)攻击者能够对消息的大块进行重新排序,或在不同的加密之间交换它们。
b)可以看到重复的块,从而为攻击者提供了有关如何解密消息的线索。