python - 使用 Crypto++ 加密并使用 Python.CRYPTO 解密

标签 python c++ encryption pycrypto crypto++

我正在开发一个使用 Crypto++ 使用 RSA 加密一些数据的项目。

这是我的 Crypto++ 代码:

string plain = "Text123", encoded, cipher;
string pkey = "...";

StringSource ss1(pkey, true);
RSA::PublicKey publicKey;
PEM_Load(ss, publicKey);
RSAES_OAEP_SHA_Encryptor e(publicKey);

StringSource ss2(plain, true,
    new PK_EncryptorFilter(prng, e,
        new StringSink(cipher)
    ) 
); 

StringSource ss3(cipher, true,
    new Base64Encoder(
        new StringSink(encoded)
    )
);
cout << encoded;

我正在尝试用 Python 解密加密的消息。这是我的 Python 代码:

from Crypto.PublicKey import RSA
from base64 import b64decode  

cipher_text = "[THE OUTPUT OF C++]"
rsakey = RSA.importKey(open("private.txt", "r").read())
raw_cipher_data = b64decode(cipher_text)
decrypted = rsakey.decrypt(raw_cipher_data)

但我得到了不可读的字符。

为什么我得到不可读的字符?谁能帮我这个?

提前致谢。

最佳答案

这是一个完整的工作示例,用于在 C++ 中加密明文并在 Python 中对其进行解密:
先决条件

  • 您已生成 RSA key 对 ( reference )。
  • 您有最新版本的 crypto++(我使用的是 8.2.0)并且您已经应用了 PEM 补丁 ( reference )。
  • 您有最新版本的 pycryptodome(我使用的是 3.9.8)。 pycryptodome 是不再维护的 pycrypto 包 ( reference ) 的替代品。

  • 加密
    你的 C++ 做正确的事。为了完整起见,我使用必要的 header 包含和公钥的反序列化扩展了您的代码:
    #include <cryptopp/base64.h>
    #include <cryptopp/files.h>
    #include <cryptopp/filters.h>
    #include <cryptopp/osrng.h>
    #include <cryptopp/pem.h>
    #include <cryptopp/rng.h>
    #include <cryptopp/rsa.h>
    
    #include <iostream>
    
    int main(int argc, char **argv) {
    
      CryptoPP::AutoSeededRandomPool prng{};
    
      std::string plain{"Text123"};
    
      /**
       * Read public key in PEM format.
       */
      CryptoPP::FileSource fs{"public.pem", /*pumpAll=*/true};
      CryptoPP::RSA::PublicKey publicKey{};
      PEM_Load(fs, publicKey);
    
      std::string encrypted{};
    
      /**
       * Pump plain text through RSA encryption scheme with OAEP/SHA1 padding.
       *
       * In general, manual memory allocations should be avoided. However,
       * the CryptoPP API expects us to allocate memory for each transformer and
       * then pass the pointer to the next transformer, which then takes ownership
       * of the pointer and will free it. This design obviously predates
       * modern C++ smart pointers, which should be preferred when possible.
       */
      CryptoPP::RSAES_OAEP_SHA_Encryptor cipher{publicKey};
      auto *encoder{
          new CryptoPP::Base64Encoder{new CryptoPP::StringSink{encrypted}}};
      auto *encryptor{new CryptoPP::PK_EncryptorFilter{prng, cipher, encoder}};
      CryptoPP::StringSource ss{plain, /*pumpAll=*/true, encryptor};
    
      std::cout << encrypted;
    
      return 0;
    }
    
    解密
    在您的 Python 代码中,您没有指定填充方案。由于您的 C++ 代码使用 OAEP/SHA1 填充,您还必须在 Python 代码中指定此填充方案:
    from base64 import b64decode
    
    from Crypto.PublicKey import RSA
    from Crypto.Cipher import PKCS1_OAEP
    from Crypto.Hash import SHA1
    
    rsa_key = None
    encrypted = None
    
    with open("key.pem", "r") as f:
      rsa_key = RSA.importKey(f.read())
    
    with open("encrypted", "r") as f:
      encrypted = b64decode(f.read())
    
    cipher = PKCS1_OAEP.new(rsa_key, hashAlgo=SHA1)
    decrypted = cipher.decrypt(encrypted)
    
    print(decrypted)
    

    关于python - 使用 Crypto++ 加密并使用 Python.CRYPTO 解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41700910/

    相关文章:

    python - 在谷歌应用程序引擎中加载cookie

    Python 3 编码时不分割字符串

    c++ - 如何在禁用 CRT 的情况下使用 CRT 的*某些*功能?

    c++ - 函数调用不会多次工作,Raspbian 上的 C/C++

    JAVA AES 256 解密

    大周期的 C 函数速度优化

    python - 将选定的文本发送到命令行参数

    c++ - 循环模板

    java - 如何从 Java 中的文件生成 PublicKey 对象

    给定数据集的 Python 预测/外推 future 数据