2

我正在尝试使用 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 方法 encrypt 和 decrypt 不再在 PyCryptodome 中维护(外部代码调用它们时会引发 NotImplemented 错误)。谁能帮我将它们转换为符合 PyCryptodome 的代码?提前致谢!

4

2 回答 2

2

这不是您问的问题,但请注意您的EncryptText. 你将你的消息分成几块并加密每一块。该方法与对称加密的 ECB 模式大致相同,因此具有相同的弱点:

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

b) 重复的块是可见的,为攻击者提供了如何解密消息的线索。

于 2019-03-13T03:38:48.113 回答
1

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

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

于 2019-03-03T22:55:06.500 回答