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

use*_*916 9 python rsa pycrypto

RSA公钥:

PUBKEY = 'MIGfMA0GCSqGSIb3DQEBA3UAA4GNADCBiQKBgQC35eMaYoJXEoJt5HxarHkzDBEMU3qIWE0HSQ77CwP/8UbX07W2XKwngUyY4k6Hl2M/n9TOZMZsiBzer/fqV + QNPN1m9M94eUm2gQgwkoRj5battRCaNJK/23GGpCsTQatJN8PZBhJBb2Vlsvw5lFrSdMT1R7vaz + 2EeNR/FitFXwIDAQAB'

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

我尝试了以下代码,但RSA.construct()引发了异常(TypeError:必须是long,而不是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)
Run Code Online (Sandbox Code Playgroud)

谢谢.

Che*_*het 15

我也遇到了麻烦.我得到它像这样工作:

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)
Run Code Online (Sandbox Code Playgroud)

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

def bin2hex(binStr):
    return binascii.hexlify(binStr)

def hex2bin(hexStr):
    return binascii.unhexlify(hexStr)
Run Code Online (Sandbox Code Playgroud)


小智 12

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
Run Code Online (Sandbox Code Playgroud)

  • 一个好的答案将始终解释为什么做了以及为什么以这种方式完成,不仅对于OP而且对于未来的SO访问者.请添加一些描述以使其他人了解.:) (7认同)
  • 我进入`keyPub = RSA.importKey(keyDER)` - >`RSA.py:588` - >`ValueError:不支持RSA密钥格式 (6认同)

Ewy*_*ato 9

通过使用:

RSA.importKey(externKey)
Run Code Online (Sandbox Code Playgroud)

使用参数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-----
Run Code Online (Sandbox Code Playgroud)

你不应该b64对externKey进行编码,字符串应该以"----- BEGIN PUBLIC KEY -----"和"----- END PUBLIC KEY -----"开头.


Ari*_*Ari 6

我最终使用的方法基于这里的一些答案:

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)
Run Code Online (Sandbox Code Playgroud)


Ber*_*Ber 2

从文档中

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