BlockSize 在此实现中必须为 128

BlockSize must be 128 in this implementation

我正在使用以下代码来解密我接收到的一些字符串,但出现以下错误:BlockSize 在此实现中必须为 128。

我想知道是否有任何方法以及如何在不减小大小的情况下解密我得到的字符串,因为我无法更改我的密钥和 IV,因为字符串是用 then 加密的。

       private string Decrypt(string text)
       {
           var inputByteArray = Convert.FromBase64String(text);

           var rm = new RijndaelManaged();
           rm.BlockSize = 256;
           rm.IV = Encoding.UTF8.GetBytes("11111111111111111111111111111111");
           rm.KeySize = 256;
           rm.Key = new SHA256Managed().ComputeHash(Encoding.UTF8.GetBytes("11111111-1111-1111-1111-111111111111"));

           var decryptor = rm.CreateDecryptor();
           var msDecrypt = new MemoryStream(inputByteArray);
           var csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read);
           var srDecrypt = new StreamReader(csDecrypt);
           return srDecrypt.ReadToEnd();
       }

我正在使用 .netcore 5

据我所知,您必须使用一个包来轻松完成此操作,因为 .net Core 的 Rijndael class 上限为 128。类似 Rijandael256 或 Rijndael256.Core by 2Toad github here 非常有用。

下面是一些示例代码,说明如何使用该特定包解密字符串。

using Rijndael256;

...

string example = "nonsense cipher text here";
string password = "dont code a password like this";
string example2 = Rijndael.Decrypt(example, password, KeySize.Aes256);

为了解决这个问题,我遵循了 Topaco 的建议并使用了 BouncyCastle/C# 库,这解决了我遇到的错误,下面我留下了我使用的基于其他论坛的解决方案。

public static string Decrypt(string cipherText)
        {
    var ivStringBytes = Encoding.UTF8.GetBytes("11111111111111111111111111111111");
            var cipherTextBytes = Convert.FromBase64String(cipherText);
            var keyBytes = new SHA256Managed().ComputeHash(Encoding.UTF8.GetBytes("11111111-1111-1111-1111-111111111111"));
            var engine = new RijndaelEngine(256);
            var blockCipher = new CbcBlockCipher(engine);
            var cipher = new PaddedBufferedBlockCipher(blockCipher, new Pkcs7Padding());
            var keyParam = new KeyParameter(keyBytes);
            var keyParamWithIV = new ParametersWithIV(keyParam, ivStringBytes, 0, 32);
            cipher.Init(false, keyParamWithIV);
            var finalBytes = cipher.DoFinal(cipherTextBytes);
            var final = Encoding.UTF8.GetString(finalBytes);
            return final;
}

这是我使用的包:

<PackageReference Include="BouncyCastle.NetCore" Version="1.8.10" />