这是我的一段代码。
#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中执行此操作。 谢谢你的回复
答案 0 :(得分:2)
PyCrypto没有功能,可以管理RSA密码。
相反,您可以使用 ezPyCrypto (homepage)模块,该模块构建在PyCrypto模块之上。它具有更简单的界面,让您:
<强>用法:强>
"""
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
我的第一个替代解决方案:
你可以使用python exec()函数和命令行函数“ssh-keygen”(doc):
ssh-keygen -p [-P old_passphrase] [-N new_passphrase] [-f keyfile]
。
答案 1 :(得分:1)
使用短语查看加载密钥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兼容的密码短语。
密码短语(字符串) - 如果是加密的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密钥。
参数:
- 格式(字符串) - 用于包装密钥的格式。
- 'DER'。二进制编码,始终未加密。
- 'PEM'。文本编码,根据RFC1421 / RFC1423完成。未加密(默认)或&gt;加密。
- '的OpenSSH'。文本编码,根据OpenSSH规范完成。仅适用于公钥(非私钥)。
- 密码短语(字符串) - 如果是PEM,则是从中派生加密密钥的密码短语。
pkcs (整数) - 组装密钥时要遵循的PKCS标准。你有两个选择:
- with 1,公钥嵌入到X.509 SubjectPublicKeyInfo DER SEQUENCE中。私钥嵌入到PKCS#1 RSAPrivateKey DER SEQUENCE中。此模式是默认模式。
- with 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")