【问题标题】:RSA code written with PyCrypto doesn't work with PyCryptodome使用 PyCrypto 编写的 RSA 代码不适用于 PyCryptodome
【发布时间】:2019-03-03 00:11:26
【问题描述】:

我正在尝试使用 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 的代码?提前致谢!

【问题讨论】:

    标签: pycrypto pycryptodome


    【解决方案1】:

    这不是您提出的问题,但请注意您的 EncryptText 存在严重的加密漏洞。你将你的消息分成几块并加密每一块。这种方法与对称加密的ECB模式大致相同,因此也有相同的弱点:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 这可以让我解密旧的加密数据吗?如果是,是否有任何资源可以指导我执行迁移?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-23
      • 2018-11-04
      • 2018-08-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多