用PyCrypto编写的RSA代码不适用于PyCryptodome

时间:2019-03-03 00:11:27

标签: pycrypto pycryptodome

我正在尝试运行为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兼容的代码?预先感谢!

2 个答案:

答案 0 :(得分:1)

RSA加密的基本组成部分是填充。 Pycrypto曾经公开了RSA密钥对象(您使用的方法)的原始decryptencrypt方法,但这是错误且不安全的,因为它们没有实现任何填充。

相反,您应该使用模块Crypto.Cipher.PKCS1_OAEP(pycryptodome中的唯一选项),该模块可以安全地处理填充。

答案 1 :(得分:1)

这不是您要问的问题,但是请注意,您的EncryptText中存在严重的加密漏洞。您将消息分成多个块并加密每个消息。此方法与对称加密的ECB模式大致相同,因此存在相同的弱点:

a)攻击者能够对消息的大块进行重新排序,或在不同的加密之间交换它们。

b)可以看到重复的块,从而为攻击者提供了有关如何解密消息的线索。