如何使用PyCrypto添加/更改RSA priv密码的密码

时间:2011-08-01 11:41:22

标签: python cryptography rsa

也许有人可以帮助我。 我正在使用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中执行此操作。 谢谢你的回复

2 个答案:

答案 0 :(得分:2)

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

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

  • 生成,导出和导入公钥和私钥
  • 轻松加密和解密字符串
  • (可选)将加密数据创建为电子邮件友好文本
  • 签署并验证字符串(包括文档)
  • 使用密码保护您的私钥
  • 创建'streams',用于通过安全套接字发送数据
  • 选择您喜欢的任何公钥大小(推荐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

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

你可以使用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")