【问题标题】:Python Crypto RSA, 127 bytes length cipher with a 1024 bits keyPython Crypto RSA,127 字节长度密码和 1024 位密钥
【发布时间】:2015-02-16 21:48:03
【问题描述】:

当我在笔记本电脑上使用 PyCrypto(Archlinux,包:python-crypto/python2-crypto)测试 RSA 加密时,我使用 RSA 模块生成的 1024 密钥来加密随机数据,它产生了一个 127 字节长度的密码.

一个简单的代码如下:(我在调试时得到了值)

from Crypto.PublicKey import RSA
pubkey = b'-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDq+qbaMTZtPH3LuXLrAn37YGzc\ngrL7ieTILtkXTl5PIozJUQZ06bQXr/uS+FtvYNSvaT53ZpSyKmVmWtoX7lFzA6FW\nsILFTgFUDNRnPIQv1rQb16wi694rKPRe1uIr8/hthXtTec8b2aJovizQOlkXY0Pq\nZohNGofi02xlUD8KsQIDAQAB\n-----END PUBLIC KEY-----'
prikey = b'-----BEGIN RSA PRIVATE KEY-----\nMIICXgIBAAKBgQDq+qbaMTZtPH3LuXLrAn37YGzcgrL7ieTILtkXTl5PIozJUQZ0\n6bQXr/uS+FtvYNSvaT53ZpSyKmVmWtoX7lFzA6FWsILFTgFUDNRnPIQv1rQb16wi\n694rKPRe1uIr8/hthXtTec8b2aJovizQOlkXY0PqZohNGofi02xlUD8KsQIDAQAB\nAoGBAMkKEI0ng8Br+9i8XqTQ6gaTVjBHpmhtbw8SfexhwXCFR9zJ9PM8LDgD+gKh\neGFPgEhfi/FOE7Rnb3/mBShqXsWbqz7STJ05GOxtKo+L1z5K7X4E9WmVjIEVU46I\nhF43LJQvoDjQRbZh2cUMSYUR8+LqJJd6MFdhLJhEIf+LhCbBAkEA71lRBiSwZH/8\nsaUE4qZ/vxkS65czBcWLSCgn+7D/kvunX1hxqi3zTxMn4gyluw3IICzvLFgdDG6f\nUZk23aDcyQJBAPtTgvi4lYAIoeh6Xx8NZxroVNVBlP9BzJTBCcnX1Ym0aC/p+6n8\n7Lu9bkKk/hb0r7Oy76wzxObWv9uvRQNp+qkCQQCoOy8oEkGpYgxLEKIObNj9iLIz\nxWKne+IaJZ902UPKG/fYnGHIK+QIgH5X9GvIvjcb5nl1wbkpM9fnkrltrdOBAkBe\n7LbuHEGTHy+P8BBXWSeVOSU5etC87GxJzvNUginMHhCv8C82kCoV6sFneIvjvb1T\nIQV3RAJdscS7Q+LMHE4pAkEAzp2o8+2+9QJwzkpxGyNjJ7ZECQsZIb7MOH7LYhX0\ncnwffXFt4ttcwbyX2SdhCVPBDkczkJkOzcnEqtjoWt+dBw==\n-----END RSA PRIVATE KEY-----'

pub = RSA.importKey(pubkey)
data = b'\xc9\xc5\xa9\x1b\xc2\x0f\x05\xf0\xe3\xe1W\x9d\x94b\xc6 '
cipher = pub.encrypt(data, 0)[0]
print(len(cipher))

这将打印 127(对于 1024 位密钥,通常为 128),我不知道为什么。

【问题讨论】:

  • encrypt 方法简单地抑制所有前导零字节。如果你愿意,你可以很容易地重组这些。
  • 哦,我明白了。这就是为什么它会建议使用 Crypto.Cipher.PKCS1_OAEP/PKCS1_v1_5 来代替。谢谢~
  • @GregS 这不是一个真正的解决方案,因为它会给你留下一个不安全的算法,尽管 totran 似乎已经找到了它。

标签: python encryption rsa pycrypto


【解决方案1】:

您没有使用正确的加密方案。来自文档:

尽管您可以选择直接使用 RSA 密钥对象的方法来执行原始加密操作(例如 _RSAobj.encrypt),但还是建议使用其中一种标准化方案(例如 Crypto.Cipher.PKCS1_v1_5 或 @987654323 @)。

虽然现在更现代/更安全的Crypto.Cipher.PKCS1_OAEP 应该比Crypto.Cipher.PKCS1_v1_5 更受欢迎。

如果您使用其中一种方案,则输出将始终为 128 字节。原因是 PKCS#1 指定了一个名为 I2OSP 的函数,它将模幂运算的结果(它是一个以模数/密钥大小为界的数字)转换为八位字节的静态数量,确切地说是密钥大小.

直接加密函数的输出是所谓的原始或教科书 RSA:只是模幂运算。这将只返回可能有前导零位的数字。多少取决于机会,(某种程度上)取决于模数的值以及是否使用有符号或无符号编码。

【讨论】:

  • 好的,所以你已经找到了替代方案,但我想一些额外的解释是为了,特别是对于其他读者:)
猜你喜欢
  • 2014-06-24
  • 2017-04-26
  • 2018-04-15
  • 2013-07-16
  • 1970-01-01
  • 2013-12-26
  • 1970-01-01
  • 2017-01-05
  • 1970-01-01
相关资源
最近更新 更多