【问题标题】:How add/change password for RSA priv key using PyCrypto如何使用 PyCrypto 添加/更改 RSA 私钥的密码
【发布时间】:2011-10-17 09:28:13
【问题描述】:

也许有人可以帮助我。 我正在使用 PyCrypto 生成一对 RSA 密钥。公钥和 私钥。 我尝试向私钥添加/更改密码,但我不知道如何 去做吧。

这是我的一段代码。

#encoding:utf-8
from Crypto.PublicKey import RSA

pass_alice='ala'
private_alice_key = RSA.generate(1024)
public_alice_key  = private_alice_key.publickey()

str_priv = private_alice_key.exportKey()
str_pub  = public_alice_key.exportKey()

print str_priv
print str_pub

# HOW ADD OR CHANGE PASSWORD FOR private_alice_key

在 M2Crypt 中,函数生成对密钥 RSA.gen_key 接受给函数回调参数,我可以返回我自己的密码。

#example in M2Crypt:
from M2Crypto import RSA
key = RSA.gen_key(1024, 6528, lambda pass:'my_password')

如何在 PyCrypto 中进行操作。 谢谢回复

【问题讨论】:

标签: python cryptography rsa


【解决方案1】:

PyCrypto 没有可以管理 RSA 密码的功能。

相反,您可以使用构建在 PyCrypto 模块之上的 ezPyCrypto (homepage) 模块。它具有更简单的界面,让您:

  • 生成、导出和导入公钥和私钥
  • 轻松加密和解密字符串
  • 可选择将加密数据创建为电子邮件友好文本
  • 签署和验证字符串(包括文档)
  • 使用密码保护您的私钥
  • 创建“流”,用于通过安全套接字发送数据
  • 选择您喜欢的任何公钥大小(推荐 2048 位)
  • 在 RSA 和 ElGamal 中选择公钥,在 IDEA、DES3、Blowfish、ARC4、IDEA 中选择会话密钥
  • 使用 256 位会话密钥和针对常见 RSA 和 ElGamal 攻击的防御措施,让任何试图侵犯您隐私的人感到非常沮丧。

用法:

"""
example7.py
Demonstrate the use of passphrases with private keys
"""
import ezPyCrypto

mysecret = "Don't look at this!!!"
raw = "Here is a string to encrypt"

# Create a key object
k = ezPyCrypto.key(passphrase=mysecret)

# Export public/private key
publicAndPrivateKey = k.exportKeyPrivate()

# Encrypt against this keypair
enc = k.encString(raw)

# Create a new key object, and import keys (with passphrase)
k1 = ezPyCrypto.key(publicAndPrivateKey, passphrase=mysecret)

# Decrypt text
dec = k.decString(enc)

# test
if dec == raw:
    print "Successful decryption using correct passphrase"
else:
    print "Failed somewhere"

print "Trying now with a bad passphrase"
try:
    k2 = ezPyCrypto.key(publicAndPrivateKey, passphrase="cracking attempt")
except ezPyCrypto.CryptoKeyError:
    print "Oops - our feeble cracking attempt failed (which is a good thing)."
else:
    print "Cracking attempt succeeded - we're not safe"
    # We're in - let's plunder
    dec2 = k2.decString(enc)

构建它

如果您查看 ezCryptoPy 源代码,您会发现密钥实际上是使用 BlueFish 算法加密/解密的:

   # decrypt against passphrase
        blksiz = 8 # lazy of me

        # create temporary symmetric cipher object for passphrase - 
        #hardwire to Blowfish
        ppCipher = Blowfish.new(passphrase,
                                Blowfish.MODE_CFB,
                                self._passIV[0:blksiz])
        enclen = len(keyobj)
        decpriv = ''
        i = 0
        while i < enclen:
            decbit = ppCipher.decrypt(keyobj[i:i+blksiz])
            decpriv += decbit
            i += blksiz
        keyobj = decpriv[0:size]

这意味着,您可以使用前面的代码示例编写自己的密码处理程序,而无需安装 ezPyCrypto。在这里你可以找到很多代码示例,如何自己做: Nullege code search

我的第一个替代解决方案:

可以使用pythonexec()函数和命令行函数“ssh-keygen”(doc):

ssh-keygen -p [-P old_passphrase] [-N new_passphrase] [-f keyfile]

【讨论】:

  • 似乎指向 ezPyCrypto 的链接现在重定向到一些美味的垃圾邮件。
  • 很好,我刚刚更新了它;我认为这个答案无论如何都应该被认为是过时的,因为它是在 2011 年首次回应的,很快就在 7 年前,现在应该有更好的图书馆;
【解决方案2】:

要加载带有短语的密钥,请查看description of Module RSA

importKey 说明

importKey(externKey, passphrase=None)

导入以标准格式编码的 RSA 密钥(公共或私有一半)。

请参阅 RSAImplementation.importKey。

参数:

  • externKey(字符串)- 要导​​入的 RSA 密钥,编码为字符串。

    RSA 公钥可以是以下任何一种格式:

    • X.509 subjectPublicKeyInfo DER SEQUENCE(二进制或 PEM 编码)
    • PKCS#1 RSAPublicKey DER SEQUENCE(二进制或 PEM 编码)
    • OpenSSH(仅限文本公钥)

    RSA 私钥可以是以下任何一种格式:

    • PKCS#1 RSAPrivateKey DER SEQUENCE(二进制或 PEM 编码)
    • PKCS#8 PrivateKeyInfo DER SEQUENCE(二进制或 PEM 编码)
    • OpenSSH(仅限文本公钥)

    有关 PEM 编码的详细信息,请参阅 RFC1421/RFC1423。

    在 PEM 编码的情况下,私钥可以根据某个密码短语使用 DES 或 3TDES 进行加密。仅支持与 OpenSSL 兼容的密码短语。

  • passphrase(字符串)- 如果是加密的 PEM 密钥,这是派生加密密钥的密码。

返回:

一个 RSA 密钥对象 (_RSAobj)。

加注:

  • ValueError/IndexError/TypeError - 无法解析给定键时(可能是因为密码错误)。

例子:

from Crypto import RSA

key = RSA.generate(1024)
exportedKey = key.exportKey('PEM', 'my secret', pkcs=1)

要使用短语保存密钥,请查看description of object _RSAobj

exportKey 说明

exportKey(self, format='PEM', passphrase=None, pkcs=1)

导出此 RSA 密钥。

参数:

  • format(字符串)- 用于包装密钥的格式。
    • 'DER'。二进制编码,始终未加密。
    • 'PEM'。文本编码,根据 RFC1421/RFC1423 完成。未加密(默认)或 > 加密。
    • 'OpenSSH'。文本编码,根据 OpenSSH 规范完成。仅适用于公钥(而非私钥)。
  • passphrase(字符串)- 如果是 PEM,则为从中派生加密密钥的密码。
  • pkcs(整数)- 组装密钥要遵循的 PKCS 标准。你有两个选择:

    • 使用 1,公钥嵌入到 X.509 SubjectPublicKeyInfo DER SEQUENCE 中。私钥嵌入到 PKCS#1 RSAPrivateKey DER SEQUENCE 中。此模式为默认模式。
    • 使用 8,私钥嵌入到 PKCS#8 PrivateKeyInfo DER SEQUENCE 中。此模式不适用于公钥。 PKCS 标准与 OpenSSH 格式无关。

返回:

带有编码的公共或私有一半的字节字符串。

加注:

  • ValueError - 当格式未知时。

例子:

from Crypto.PublicKey import RSA

with open("key.pem", "r") as privatekey:
    encryptor = RSA.importKey(privatekey, passphrase="my secret")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-20
    • 2014-01-04
    • 1970-01-01
    • 2013-05-07
    • 2015-05-13
    相关资源
    最近更新 更多