Using pycrypto, how to import a RSA public key and use it to encrypt a string?

后端 未结 7 1064
孤街浪徒
孤街浪徒 2020-12-28 10:06

The RSA public key:

pubkey = \'MIGfMA0GCSqGSIb3DQEBA3UAA4GNADCBiQKBgQC35eMaYoJXEoJt5HxarHkzDBEMU3qIWE0HSQ77CwP/8UbX07W2XKwngUyY4k6Hl2M/n9TOZMZsiBzer/fqV+QNPN1m9M94eU

相关标签:
7条回答
  • 2020-12-28 10:35
    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
    
    0 讨论(0)
  • 2020-12-28 10:36

    By using:

    RSA.importKey(externKey)
    

    with parameter externKey look like the following:

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

    You shouldn't b64decode the externKey and the string should start with "-----BEGIN PUBLIC KEY-----" and "-----END PUBLIC KEY-----".

    0 讨论(0)
  • 2020-12-28 10:42

    From the documentation

    importKey(externKey, passphrase=None)
    Import an RSA key (public or private half), encoded in standard form.
    
    0 讨论(0)
  • 2020-12-28 10:49

    The method I ended up using based on a few answers here:

    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)
    
    0 讨论(0)
  • 2020-12-28 10:51

    I too had trouble with this. I got it working like this:

    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)
    

    If you're writing to files, you may find it easier to deal with hex strings instead of binary strings. I'm using these helper functions a lot

    def bin2hex(binStr):
        return binascii.hexlify(binStr)
    
    def hex2bin(hexStr):
        return binascii.unhexlify(hexStr)
    
    0 讨论(0)
  • 2020-12-28 10:57

    thanks @user9527 vote up for you

    that solved my problem

    my env: win10x64 python3.6.4 pycrypto2.6.1

    here's my code, encrypt end decrypt, the key was from someone's blog.(if U occured with "ValueError: RSA key format is not supported", check the key format, it should be warpped with some thing like "-----BEGIN XXXX KEY-----")

    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")
    

    the output:

    raw msg-> test
    cipher text-> b'\xb0]\x1f@B\x8b\xb5\xbf\x891:\t4D\x80$\xc0y\xaa\xb4\x86t/|\xeaM%\xf06\x14,\x9e?\x86R\x83\xd72\xe5\xfdsr:\x99\xe7v\xd9]&\xbc\x85\xd3\x16\x80\x19q\xe7\xb1\x89\xff/\x12\xe5\xb3\x9cu\x1f\x04x\xa5\xdfl\xcd\xae_\xba\x1b\x97\x9fa\xcf9O\xbfB\xf6\xd1N\xf5|<\xbf^\x84R\xecSo\x9a*\xf7\x8d\x8e\xbe0Q\xcd\x14\x13\xf98x\xe7\xd8x\x19\xaf\x98\xefu\xa8\xb1\xd3\xfa\xf2N\xca\xb5'
    decrypted msg-> test
    test passed
    
    0 讨论(0)
提交回复
热议问题