【问题标题】:Verify the passphrase for RSA private key验证 RSA 私钥的密码
【发布时间】:2023-03-10 22:12:01
【问题描述】:

如何在 python 中验证 RSA 私钥(PEM 格式)的密码? 我想蛮力使用我自己的字典。

我在 MacOS 中通过这个命令创建了密钥:

ssh-keygen -t rsa -C "your_email@example.com" 

私有 RSA 密钥详细信息:

强度:2048 位

算法:RSA

尺寸:2048

指纹

SHA1:80 09 90 30 96 8E 24 FC A9 4B 46 E1 BE B7 23 2D EC 16 2C EB

SHA256:67 93 E2 0A 9F E7 C9 7E A9 66 AD 05 52 FD 19 8B 3E CB 8A 59 9F 51 F0 A6 65 6F 6F 9A 9D 7B 35 B9

密码是:'testing'

正如@Hannu 建议的那样,我运行了这段代码,但它拒绝了正确和错误的密码短语

from Crypto.PublicKey import RSA
kf = open("testing", "r")
kt = kf.read()
kf.close()
dlist = ["foo", "bar", "testing"]
for d in dlist:
    try:
        nk = RSA.importKey(kt, passphrase=d)
        print "success", d
        break
    except ValueError:
        print "nosuccess", d
        pass

【问题讨论】:

  • 使用了哪种加密算法来创建您的私钥?您可以在 pem 文件中看到它。
  • @Hannu 您在寻找这些数据 ==> 算法:RSA 和大小:2048 还是其他?
  • 您能否发布您的私钥文件的第一行?我尝试用 ssh-keygen 生成一个 pem 密钥,然后用 pyCrypto 打开它,但它失败了,因为密钥是 AES 加密而不是 DES,而且 pyCrypto 似乎由于某种原因失败了。
  • ... 或者更确切地说,使用关键信息修改您的原始帖子。
  • @Hannu 我做到了。是你要找的东西吗?

标签: python rsa brute-force passphrase


【解决方案1】:

我建议看一下 Crypto 中的 RSA 模块

https://www.dlitz.net/software/pycrypto/api/current/Crypto.PublicKey.RSA-module.html

以下内容将是一个很好的起点

>>> from Crypto.PrivateKey import RSA
>>>
>>> key = RSA.generate(2048)
>>> f = open('mykey.pem','w')
>>> f.write(RSA.exportKey('PEM'))
>>> f.close()
...
>>> f = open('mykey.pem','r')
>>> key = RSA.importKey(f.read())

【讨论】:

    【解决方案2】:

    使用 Paramiko 而不是 pycrypto 来做到这一点:

    import paramiko
    from paramiko import rsakey
    
    kf = open("sshk", "r")
    
    dlist = ["foo", "bar", "foobar", "klunssi", "xyzzy"]
    
    for d in dlist:
        kf.seek(0)
        try:
            nk = rsakey.RSAKey.from_private_key(kf, password=d)
            print "success", d
        except paramiko.ssh_exception.SSHException:
            print "fail", d
    

    这至少对我有用。希望这可以帮助。

    汉努

    【讨论】:

    • 我运行了代码,它不接受正确的密码!它拒绝所有密码短语(正确和错误的密码)
    • 好的,那么这不适用于 ssh-keygen 生成的密钥。让我想想。如果我能弄清楚,我会更新。
    • 谢谢,创建随机字符串很容易,我只想找到一种方法(在 Python 甚至 mac 或 linux 命令行或 Java 或 C 或 C++ 中)将其作为密码输入密钥(以自动方式)
    • 我刚刚检查了我的 pycrypto 代码。它不接受 AES-128-CBC 作为密钥加密方法。只有 DES。奇怪的是,我通过谷歌搜索找到了一个接受它的版本,但它似乎很旧并且没有合并到当前的加密包中。可能需要从 pycrypto 寻找其他地方。
    • 更新了我的答案。 Paramiko 似乎能够处理这些文件。