我在从私钥生成公钥时遇到了问题,私钥被故意削弱,在使用PyCryptoDome时尝试加密/解密消息。解密似乎是无限期的。你知道吗
注意:显然这不是我真正的私钥。以下键故意被削弱:
-----BEGIN RSA PRIVATE KEY-----
MIIFJAIBAAKCAQEAzdoCzKqtgJs+n66H89khIqgqg4LxAq56FkU0wP9TgcStI0R8
lswVoAep0bC+2Hs1gwwZJBPH1UHn9NcmYHcxUCboemEZGCdfw+3jBGd7EPJx02Av
0QVSHmKTyOh9e/Cc1z+lyI4042T3Tm2Q6xFQOtunzSKrgViN2zMD2sCar7lBM6Kd
5ckBiHs/etgT+mZAW7QkSNb/jOz3Uuhw4z7vey5YewtekfVpGcdkI/XsyVc7TSqk
iBLd8bNyE0XebAp27yB7/RoUf2yPQ0jrIk4IRk7ecWESSgeDswa28a7Np8OGPGtu
Z2ev4SQOQEbbXFEofIjDcxJZvhvVPiNeVI9WIwIDAQABAoIBAQCRUVIHAbllJjLz
SKMY9Zl6sC4y+mdn3Gi7YZrek/oNJenD3j+ShMgCjOZiug8MuKdyHg9+QUIhvidT
1+TaCWRHXPAvVG4B3lBKLgLEKfkRLm93jlnmVYc/HZmOWItQYokvoVlIJEiALqQw
oKn2B+bg/6eM6bWBCu6f/q3xHP6v0ziM890O4vNK630VgrlRXCKBM/S/2jPVXIOZ
HhYMyXHUcUc56MpkgSAmeEF6HjKzGZP3fOvH7VAlphp/ZVduYrf+eRD0zOOjgK0y
DQvqaVCJS0WlBg3ozNBs7yFYdzpSY3XwuTZ0yrG4+I16ISTbt6W8V4Y1rPXfF7u8
Ssn3KXWpAoIBACkrmiju74AfDIZWGzDFBqCICICzyc1WGGrapCaZdxn0IqCnTB4o
0SABiF0jWV5/CrPPODpqWyqmx/3EoUZ+PRAHyBh50dGheY2V+jQUsjaW45Cs1l0B
EGx6HY6U5eWWhcSmVFtPpC16l9x8UC8DdnIr7lw6Ik0RtfijzZImhVZYQD2G7GEo
M4GyP+VeamVHpni9oNteMxwvZKoufPo/yX8JROVorIOXe2uORzpkYo6rC9w7uoGd
X5a9fTcN+UjO5JY5smXSBBl8HKcOlW1CznR2LH0Tag7OTYo0iv0i9e5aTgwVfHsU
vMagz6Z0kkWp1OW08+PQeFk4xD+grHdP3gcCAQUCggEAFc6DjDTq5MkNYEZRhqaF
mRgUsN8J/9ofetGuaseUv0mB4ehbOApUoohNS1AC8TuHVrBmzwIwocnPWooBBo6t
F0WX5eb4jPnjoWwUJ+vibWnExYfWz1JV+a9A4pnZn5734a5cNjVb977cmyu5aP2D
invceDtOmdXMthNFOqlurMp31F8X62pYxdS9ZWd6IYUvFvsSLb+agM5VmpKfHgoV
V1V4ia7E2bqt481ryvELBxhwYsm8QxUxYW2i2jtrk/YKO8v5w1bXVwxXPOFLoqDl
K+jALcvPvGHnzlGAYQ5Yh1SLzHjBA4x7ZRYehsNuCronCziqijuM021u/WjEkTnb
lwIBAQKCAQAg766HJYxmfz04ROKNamuzoAbNXKFxEa0iSINSFF9H9oIaH3AYIKdM
zgaw6RRLmNVcpcaVIeKIhWzLA7Q4ZP2mbKATlKfa55RxRMgpqigrq+lAikUXNA0j
lORyELfq3tFqHqniphzxLt/jlqaMAsUoIyUWlOg9p8TG6XFBuGqrecz+BYnnU1xn
wcy3fruEOVH6MU18S1wWjFCIJTDIMweY1Dcd7VbPrGK8cdKVHRulVaMWli7OF3+r
ysqScZQ6Px1E+vUeQZzhMBbsC6q9zwuQXon9qSGlcdehw6JkG/fx4dgJqsn8EJcF
TXLrkHUEh92EkMMcpsatxwNmGiOSpks5
-----END RSA PRIVATE KEY-----
以下代码段用于读取私钥、派生公钥、加密消息,然后再次解密:
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
import Crypto.Util
from base64 import *
def encryptMsg(rsakey, message):
cipher = PKCS1_OAEP.new(rsakey)
ct = cipher.encrypt(message)
return ct
def decryptMsg(rsakey, message):
cipher = PKCS1_OAEP.new(rsakey)
pt = cipher.decrypt(message)
return pt
key = RSA.importKey(open('private.key').read())
testpk = key.publickey()
message = b64encode(encryptMsg(testpk, b"test message"))
print(message)
print(decryptMsg(key, b64decode(message)))
调用decryptMsg()
时,这似乎挂起了。你知道吗
你给了PyCryptodome一个素数非常不相称的私钥,这个密钥的安全性就因为这个而被破坏了。你在你的问题中注意到了这一点,但这一点在这里很重要,因为PyCryptodome似乎对素数的大小做出了假设。你知道吗
为了安全起见,RSA公钥加密通常需要使用两个素数that are close in magnitude:
通过将第二个素数设为一位数值,似乎削弱了键:
prime1
(p值)是一个使用617位数字的“适当”大素数,而第二个q素数是一个数字值,因此p大约大10^616倍。使用这个密钥会触发最坏的情况,就像PyCryptodome处理RSA解密一样。你知道吗在解密过程中,实现是trying to make a negative number positive by repeatedly adding the second prime number:
在上面的代码中,
_p
和_q
属性是两个素数,_d
是私钥指数因为给定的私钥使用的是两个素数,这类素数非常不相称(1位数对616位数),所以
m2
的值是3,而m1
是616位数的短值。因此,尝试将q(5)添加到一个616位的负整数将花费很长时间。在我老化的Macbook Pro笔记本电脑上,PyCryptodome使用的GMP包装器可以在大约6秒内将一个小整数添加到这个大整数上100万次:要完成这个
while
循环就必须再迭代10^609次,而我的笔记本电脑所用的总时间将需要603位数字来表示所需的数百万年数。我不指望宇宙能维持那么久,更不用说我的笔记本了。你知道吗它应该只使用模运算;您可以在这里用模运算替换
while h < 0: h += self._q
循环:这是版本3.9.3中第162行的
Crypto/PublicKey/RSA.py
。随着这一变化,解密又几乎是瞬间的。你知道吗我已经提交了这个as a bug with the PyCryptodome project(现在关闭为fixed),项目发布了version 3.9.4,循环被一个模运算替换。你知道吗
如果您不想更改已安装的PyCryptodome副本并且被阻止,您可以切换到使用^{} project ,因为它没有这个问题。PyCryptodome本身实现RSA算法,而
cryptography
将解密委托给openssl
库。你知道吗相关问题 更多 >
编程相关推荐