代码之家  ›  专栏  ›  技术社区  ›  Psycho_Mind

非对称加密-明文大小错误

  •  1
  • Psycho_Mind  · 技术社区  · 10 年前

    我正在尝试用python使用非对称加密技术加密小数据。我目前正在使用M2Crypto生成1024位私钥/公钥对。

    在使用了不同的python库之后,比如M2Crypto和Pycrypto(上面有几个变体),我遇到了明文大小问题: ValueError:明文太长 . 发生这种情况是因为我正在尝试加密数据,然后加密最后一个加密(加密之上的加密),例如:

    加密: EKpuuser(EKprown(数据))->ED数据

    puser:公钥用户, prown:私钥(数据)所有者

    解密: DKpruser(DKpuown(EData))->数据

    pruser:私钥用户, puown:公钥(数据)所有者

    我已经尝试了许多在网络上找到的解决方案,但唯一帮助我解决这个问题的是在加密之前使用签名:

    ciphertext = 'xpto'
    m_EOi = hashlib.sha1()
    m_EOi.update(ciphertext_EOi)
    sig_EOi = (m_EOi.hexdigest())
    

    但这个解决方案不是我需要的,因为在我使用它并加密签名(并加密加密)之后,再进行解密,无法解密签名,所以我无法获得初始消息。

    编辑日期:

    我已经做了一些事情,例如:

    BLOCK_SIZE = 32 
    PADDING = '{' 
    message = 'today' 
    key = 'aaaaaaaaaa123456' 
    pad = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * PADDING 
    EncodeAES = lambda c, s: base64.b64encode(c.encrypt(pad(s))) cipher = AES.new(key) 
    encoded = EncodeAES(cipher, message)
    

    key = 123 
    h1 = SHA256.new() 
    h1.update(key) 
    key1 = h1.digest()[0:16] 
    iv1 = Random.new().read(16) 
    cipher1 = AES.new(key1, AES.MODE_CFB, iv1) 
    criptogram1 = iv1 + cipher1.encrypt(data1)
    

    但我总是有明文大小的问题。

    3 回复  |  直到 10 年前
        1
  •  3
  •   DarkSquirrel42    10 年前

    不对称加密不是为你所尝试的而设计的。。。

    不对称密码通常用于混合解决方案中,以加密对称密码系统的密钥,该系统用于加密实际数据

    所以你通常会这样:

    您的数据+对称(随机)密钥(K)->对称密码(例如AES)->密码文本

    K+接收方的公共非对称密钥->不对称密码->柯

    然后你把密文和Ke传送给接收者

    如果你想问这与你的问题有什么关系:

    K通常比不对称密码的最大数据大小小得多,而普通的纯文本数据则不是

        2
  •  1
  •   Jim Flood    10 年前

    例如,当您使用RSA密钥加密数据时,您希望使用OAEP填充填充数据。无论你的明文有多小,比如“今天”,它都会被填充到密钥的完整模数,例如1024位。如果您接下来尝试使用相同大小的密钥对其进行加密,它将不适用。再也没有地方垫了。你需要一把更大的钥匙,否则,你就不需要键盘了。不填充将是一个很大的错误——你需要填充物是安全的。

    为什么要加密两次?这不会让它更安全。你在设计自己的计划吗?这是有风险的。

    你为什么要签署密文?密文上的数字签名是在一份难以理解的胡言乱语文档上签名——试着在法庭前签名。为什么不添加MAC?

        3
  •  1
  •   Psycho_Mind    10 年前

    经过更多的研究,我终于找到了一些对我有帮助的东西。它并不是我所寻找的100%(与明文大小错误有关),而是在我使用签名解决问题的方式上对我有所帮助。以下是我找到信息时的链接:

    http://e1ven.com/2011/04/06/how-to-use-m2crypto-tutorial