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

问题描述 投票:1回答: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方法加密和解密,这些方法在PyCryptodome中不再存在(当外部代码调用时会引发NotImplemented错误)。任何人都可以帮助我将它们转换为符合PyCryptodome的代码吗?提前致谢!

pycrypto pycryptodome
2个回答
1
投票

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

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


1
投票

这不是你问的问题,但请注意你的EncryptText存在明显的加密弱点。您将邮件拆分为块并加密每个邮件。此方法与对称加密的ECB模式大致相同,因此它具有相同的弱点:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.