使用Pycrypto,如何导入RSA公共密钥并使用它来加密字符串



RSA公共密钥:

pubKey ='migfma0gcsqgsib3dqeba3uaaa4gnadcbiqkbgqcckbgqcccccckbgqccc35emayojxeojt5hxarhkzdbemu3qiwewewewewewewewewewewewp q77cwp/q.ngx07w2xkwnguyyy4k6hl2ms.nm qmnem qunl2m9 f。 UM2GQGWKORJ5BATTRCANJK/23GGPCSTQSTJN8PZBHJBB2VLSVW5LFRSDMT1R7VAZ 2EENR/FITFXWIDAQAB'

如何导入并使用它来加密字符串?

我尝试了以下代码,但是rsa.construct()提出了异常(typeError:必须长,而不是str)。

from Crypto.PublicKey import RSA
from Crypto.Util import asn1
from base64 import b64decode
keyDER = b64decode(pubkey)
seq = asn1.DerSequence()
seq.decode(keyDER)
keyPub = RSA.construct((seq[0], seq[1]))
print keyPub.encrypt('mysecret', 32)

谢谢。

from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5 as Cipher_PKCS1_v1_5
from base64 import b64decode,b64encode
pubkey = 'MIGfMA0GCSqGSIb3DQEBA3UAA4GNADCBiQKBgQC35eMaYoJXEoJt5HxarHkzDBEMU3qIWE0HSQ77CwP/8UbX07W2XKwngUyY4k6Hl2M/n9TOZMZsiBzer/fqV+QNPN1m9M94eUm2gQgwkoRj5battRCaNJK/23GGpCsTQatJN8PZBhJBb2Vlsvw5lFrSdMT1R7vaz+2EeNR/FitFXwIDAQAB'
msg = "test"
keyDER = b64decode(pubkey)
keyPub = RSA.importKey(keyDER)
cipher = Cipher_PKCS1_v1_5.new(keyPub)
cipher_text = cipher.encrypt(msg.encode())
emsg = b64encode(cipher_text)
print emsg

我也遇到了麻烦。我这样工作了:

key = RSA.generate(2048)
binPrivKey = key.exportKey('DER')
binPubKey =  key.publickey().exportKey('DER')
privKeyObj = RSA.importKey(binPrivKey)
pubKeyObj =  RSA.importKey(binPubKey)
msg = "attack at dawn"
emsg = pubKeyObj.encrypt(msg, 'x')[0]
dmsg = privKeyObj.decrypt(emsg)
assert(msg == dmsg)

如果您正在写入文件,则可能会发现更容易处理十六进制字符串而不是二进制字符串。我正在使用这些助手功能

def bin2hex(binStr):
    return binascii.hexlify(binStr)
def hex2bin(hexStr):
    return binascii.unhexlify(hexStr)

通过:

RSA.importKey(externKey)

带有参数外观看起来如下:

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAybVqRvfYvWbLsB98BqkD
lWd0/5y6SyhHt6/r6M0l7JXBweqMvxVt7XmI2yqPL56YxzcgQ8ycDkoqHJ+XozgP
iRnLNpYRlCzsiaOElbmQcnrI8iOb9Ahm6j0cbBB1S8VNvD+u9RQJt53zPxPj8/Dq
f1oNGFXOM8udNYWZaRCukLs/TumsAn0a+BF4639WtFiUvTWdVhlyvCQTs49ytRkH
rXH30RkB528RIvTGeW8xBTV4NaiTIzAEKCVSPagLr4Hzbb9b5+bODic/zkLGQazy
/NKOFgiB7kD2+WEMcuhTr5noeXau0PDAhgmrBhzzWOjUwwaO+ACvJLkPXZfjhy7P
+wIDAQAB
-----END PUBLIC KEY-----

您不应该b64 decode externkey,字符串应以" ------开始public键------"one_answers" -----结束公共密钥-----"。

我最终根据一些答案来使用的方法:

from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5 as Cipher_PKCS1_v1_5
def encrypt_data(data):
    with open("/path/to/public.pem", "rb") as k:
        key = RSA.importKey(k.read())
    cipher = Cipher_PKCS1_v1_5.new(key)
    return cipher.encrypt(data.encode())

def decrypt_data(data):
    with open("path/to/private.pem", "rb") as k:
        key = RSA.importKey(k.read())
    decipher = Cipher_PKCS1_v1_5.new(key)
    return decipher.decrypt(data, None).decode()

message = "hello world!"
encrypted = encrypt_data(message)
decrypted = decrypt_data(message)

来自文档

importKey(externKey, passphrase=None)
Import an RSA key (public or private half), encoded in standard form.

谢谢 @user9527为您投票

解决了我的问题

我的env:win10x64 python3.6.4 pycrypto2.6.1

这是我的代码,加密结束,关键是来自某人的博客。(如果您不支持" valueError:rsa键格式",请检查钥匙格式,应该用一些诸如" - ---开始xxxx键------")

pubkey = """-----BEGIN PUBLIC KEY-----
...
-----END PUBLIC KEY-----"""
prvkey = """-----BEGIN RSA PRIVATE KEY-----
...
-----END RSA PRIVATE KEY-----"""
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5 as Cipher_PKCS1_v1_5
msg = "test"
print("raw msg->", msg)
keyPub = RSA.importKey(pubkey) # import the public key
cipher = Cipher_PKCS1_v1_5.new(keyPub)
#print(cipher.encrypt.__doc__)
cipher_text = cipher.encrypt(msg.encode()) # now we have the cipher
print("cipher text->", cipher_text)

keyPriv = RSA.importKey(prvkey) # import the private key
cipher = Cipher_PKCS1_v1_5.new(keyPriv)
#print(cipher.decrypt.__doc__)
decrypt_text = cipher.decrypt(cipher_text, None).decode()
print("decrypted msg->", decrypt_text)
assert msg == decrypt_text # check that
print("test passed")

输出:

raw msg-> test
cipher text-> b'xb0]x1f@Bx8bxb5xbfx891:t4Dx80$xc0yxaaxb4x86t/|xeaM%xf06x14,x9e?x86Rx83xd72xe5xfdsr:x99xe7vxd9]&xbcx85xd3x16x80x19qxe7xb1x89xff/x12xe5xb3x9cux1fx04xxa5xdflxcdxae_xbax1bx97x9faxcf9OxbfBxf6xd1Nxf5|<xbf^x84RxecSox9a*xf7x8dx8exbe0Qxcdx14x13xf98xxe7xd8xx19xafx98xefuxa8xb1xd3xfaxf2Nxcaxb5'
decrypted msg-> test
test passed

如果要使用RSA.importkey( )导入外部键,则有两个选项:

  1. 从文件中读取密钥:

     file = open('external.pem','r')
     external_key = file.read()
     key = RSA.import_key(external_key)
    

    ,您的外部密钥格式必须是这样的:

     -----BEGIN PUBLIC KEY-----
     MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDcmhF1kqsMw9HAUc231
     IEr3OwVwocSM4JPUGVSTBDcM9tGoflx8UoN4M9EJrdCcVicZEt709L13jhUxo/hX
     jUDqyQ6U+zyOYhoSwQpHKju2bwn6HMC8iq/ZwNqRFiqa23O2L8WSjZq4J/U1wWZ9
     Zh7f0E5w8GZDkngceQI8nBWFPSAeQNAh0b4Vy1SYKapPrvUJdS9LsT3V9B2k2Nm1
     4lUOtfufpWP5xjoC3MwOxgBsPJsuqpe7sZddG4YzQi3IuMAcc+C/ms9mA7OX5yxt
     xgU3tAIzzBHgvwn9vANNJPzJMaOcm9kKMVJYXLHfg37IfIk1oV+/3BxMQ26ErNcC
     9wIDAQAB
     -----END PUBLIC KEY-----
    

    在Linux(我不知道Windows)中,您可以通过此命令进行检查:

     less exteralkey.pem
    
  2. 如果您想将键进行编码到代码中,则必须像这样:

     pubkey = "-----BEGIN PUBLIC KEY-----n
     MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDcmhF1kqsMw9HAUc231n
     IEr3OwVwocSM4JPUGVSTBDcM9tGoflx8UoN4M9EJrdCcVicZEt709L13jhUxo/hXn
     jUDqyQ6U+zyOYhoSwQpHKju2bwn6HMC8iq/ZwNqRFiqa23O2L8WSjZq4J/U1wWZ9n
     Zh7f0E5w8GZDkngceQI8nBWFPSAeQNAh0b4Vy1SYKapPrvUJdS9LsT3V9B2k2Nm1n
     4lUOtfufpWP5xjoC3MwOxgBsPJsuqpe7sZddG4YzQi3IuMAcc+C/ms9mA7OX5yxtn
     xgU3tAIzzBHgvwn9vANNJPzJMaOcm9kKMVJYXLHfg37IfIk1oV+/3BxMQ26ErNcCn
     9wIDAQABn
     -----END PUBLIC KEY-----"
    

    然后您可以导入:

     key = RSA.importkey(pubkey)
    

NOTE :如果您不在RSA键的每一行末端添加"n",则RSA.importkey( )将引起错误:

RSA密钥格式不支持

注意2 :我使用""指示该语句在下一行中继续。

这对我有用。Python 3.8

ubuntu@ubuntu:〜$ sudo pip3列表| grep crypto

密码学2.8

密码学 - 向量2.8

pycrypto 2.6.1

from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5 as Cipher_PKCS1_v1_5
def encrypt_data(data):
    with open("/home/echague/.ssh/id_rsa.pub", "rb") as k:
        key_pub = RSA.importKey(k.read())
    cipher = Cipher_PKCS1_v1_5.new(key_pub)
    return cipher.encrypt(data.encode())

def decrypt_data(data):
    with open("/home/echague/.ssh/id_rsa", "rb") as k:
        key_priv = RSA.importKey(k.read())
    decipher = Cipher_PKCS1_v1_5.new(key_priv)
    return decipher.decrypt(data, None).decode()

message = "hello world!"
encrypted = encrypt_data(message)
decrypted = decrypt_data(encrypted)
print(message)
print(encrypted)
print(decrypted)

最新更新