解密导致 Rijndael 和 256 块大小的乱码

Decryption results in gibberish with Rijndael and 256 block size

所以我有一些用这个旧代码加密的旧消息:

'the ecryption algorithm with specific settings
        Dim myRijndael As New RijndaelManaged
        myRijndael.Padding = PaddingMode.Zeros
        myRijndael.Mode = CipherMode.CBC
        myRijndael.KeySize = 256
        myRijndael.BlockSize = 256

        'declared byte arrays for the message string and the key and IV for the encryption algorithm
        Dim encrypted() As Byte
        Dim toEncrypt() As Byte
        Dim key() As Byte
        Dim IV() As Byte

        'populating the arryas with the needed bytes for the encryption algorithm
        key = System.Text.Encoding.ASCII.GetBytes(prm_key)
        IV = System.Text.Encoding.ASCII.GetBytes(prm_iv)

        'the actual instance of the ecryption algorithm
        Dim encryptor As ICryptoTransform = myRijndael.CreateEncryptor(key, IV)

        'streams for the encrypted byte array
        Dim msEncrypt As New MemoryStream()
        Dim csEncrypt As New CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)

        toEncrypt = System.Text.Encoding.ASCII.GetBytes(text_to_encrypt)

        csEncrypt.Write(toEncrypt, 0, toEncrypt.Length)

        'make sure we have all the blocks
        csEncrypt.FlushFinalBlock()

        'turn encrypted stream into byte array
        encrypted = msEncrypt.ToArray()
        'return a base 64 string so we can upload it to the server
        Return (Convert.ToBase64String(encrypted))

我正在尝试用 Crypto++ 解密它

这是我想出的代码:

std::string coded = "pCyWPA5Enc3F0NAkowrt206brSfMrOgKMTXI1pKhCUY=";
//std::string coded = "F9uvtbK3Ue67Gbe9si5yvDn8a50bYnTovjfWali+Xjo=";

std::string coded2;
std::string ciphertext;
std::string decryptedtext;


CryptoPP::StringSource sss(coded, true,
   new CryptoPP::Base64Decoder(
       new CryptoPP::StringSink(ciphertext)
   ) // Base64Decoder
); // StringSource
CryptoPP::AES::Decryption aesDecryption(key, CryptoPP::AES::MAX_KEYLENGTH);
CryptoPP::CBC_Mode_ExternalCipher::Decryption cbcDecryption( aesDecryption, iv );

CryptoPP::StreamTransformationFilter stfDecryptor(cbcDecryption, new CryptoPP::StringSink( decryptedtext ),CryptoPP::BlockPaddingSchemeDef::ZEROS_PADDING);
stfDecryptor.Put( reinterpret_cast<const unsigned char*>( ciphertext.c_str() ), ciphertext.size() );
stfDecryptor.MessageEnd();

//
// Dump Decrypted Text
//
std::cout << "Decrypted Text: " << std::endl;
std::cout << decryptedtext;
std::cout << std::endl << std::endl;

但我在 return 中得到的只是胡言乱语。填充模式已设置,密钥正确。我没主意了。

注释掉的"coded"字符串实际上是解密的,但是是用c++和crypto++加密的。文字是一样的。那么为什么 Base64 加密字符串不同?

我认为可能是因为 VB 对 ASCII 中的加密字节进行了编码,所以这可能是问题所在。但我不知道如何让 crypto++ 使用 ASCII 编码。

有人可以指出这里的问题吗?

AES 使用 128 位块大小。 VB 代码使用 256 位块大小的 Rijndael。