【问题标题】:Asymmetric cryptography - Plaintext size error非对称加密 - 明文大小错误
【发布时间】:2014-10-17 05:53:48
【问题描述】:

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

使用不同的 python 库后,例如 M2Crypto 和 Pycrypto(有几个变体),我遇到了明文大小问题:ValueError: Plaintext is too long。 发生这种情况是因为我试图加密数据,然后加密最后一次加密(加密上的加密),例如:

加密: EKpuuser(EKprown(Data)) -> EData

用户:公钥用户, 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)

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

【问题讨论】:

  • 您尝试加密的明文有多长?
  • 我正在使用非常小的数据进行测试。例如像“今天”这样的字符串。

标签: python encryption cryptography private-key public-key


【解决方案1】:

非对称加密不是为你想做的事情而设计的......

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

所以你通常有这样的东西:

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

K + 接收者的不对称公钥 -> 不对称密码 -> Ke

然后你将密文和 Ke 传送给收件人

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

K 通常远小于非对称密码的最大数据大小,而普通纯文本数据则不然

【讨论】:

  • 我已经按照你说的做了,例如:1) 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) -------------- -- 2) 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) 但是我总是有明文大小的问题。
  • @Psycho_Mind 通过澄清更新您的问题,而不是在评论中发布不可读的代码。
【解决方案2】:

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

你为什么要加密两次?它并没有让它变得更安全。你在设计你自己的方案吗?那会有风险。

你为什么要签署密文?密文上的数字签名正在签署一份难以理解的胡言乱语的文件——试着在法庭上拿那个签名。为什么不直接添加 MAC?

【讨论】:

  • 我正在尝试做的是来自一篇科学文章,所以我必须复制上面描述的所有内容(除了文章中没有明确说明的内容,如果我必须采取个人选择我认为是最好的解决方案)。使用加密之上的加密是为了保证真实性,这就是为什么首先使用私钥进行加密,然后使用公钥而不是第一次加密。但即使使用更大的钥匙,我也有同样大小的问题。你有什么建议可以解决这个问题吗?我正在使用 RSA,也许有更好的解决方案可以使用。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-05
    • 1970-01-01
    • 2019-07-29
    • 1970-01-01
    • 1970-01-01
    • 2010-10-30
    • 2017-02-22
    相关资源
    最近更新 更多