Rijndael 解密仅返回 16 个字符响应 C#

问题描述 投票:0回答:1

我正在使用下面给出的 Rijndael 加密和描述方法。当我加密 16 个以上字符的字符串然后解密时,即使用于加密的输入长度超过 16,它也最多返回 16 个字符。 示例输入:“ABCDEFGHIJKLMNOP12345678” 使用给定代码中的方法进行加密,然后解密。 解密输出:“ABCDEFGHIJKLMNOP” 哈希算法=“SHA1” 密码迭代次数 = 2 密钥大小 = 256

如何修复当前代码以加密/解密更长的字符串?

这是代码

public class RijndaelSimple
{
    public static string Encrypt(string plainText,
                                 string passPhrase,
                                 string saltValue,
                                 string hashAlgorithm,
                                 int passwordIterations,
                                 string initVector,
                                 int keySize)
    {
        byte[] initVectorBytes = Encoding.ASCII.GetBytes(initVector);
        byte[] saltValueBytes = Encoding.ASCII.GetBytes(saltValue);
        
        byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText);

        
        PasswordDeriveBytes password = new PasswordDeriveBytes(
            passPhrase, saltValueBytes, hashAlgorithm, passwordIterations);

        
        byte[] keyBytes = password.GetBytes(keySize / 8);

        
        RijndaelManaged symmetricKey = new RijndaelManaged();

        
        symmetricKey.Mode = CipherMode.CBC;

        
        ICryptoTransform encryptor = symmetricKey.CreateEncryptor(keyBytes, initVectorBytes);

        MemoryStream memoryStream = new MemoryStream();

        CryptoStream cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write);
        cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length);

        cryptoStream.FlushFinalBlock();

        byte[] cipherTextBytes = memoryStream.ToArray();

        memoryStream.Close();
        cryptoStream.Close();

        string cipherText = Convert.ToBase64String(cipherTextBytes);

        return cipherText;
    }

    
    public static string Decrypt(string cipherText,
        string passPhrase,
        string saltValue,
        string hashAlgorithm,
        int passwordIterations,
        string initVector,
        int keySize)
    {
        byte[] initVectorBytes = Encoding.ASCII.GetBytes(initVector);
        byte[] saltValueBytes = Encoding.ASCII.GetBytes(saltValue);

        byte[] cipherTextBytes = Convert.FromBase64String(cipherText);

        PasswordDeriveBytes password = new PasswordDeriveBytes(
            passPhrase, saltValueBytes, hashAlgorithm, passwordIterations);

        byte[] keyBytes = password.GetBytes(keySize / 8);

        RijndaelManaged symmetricKey = new RijndaelManaged();

        symmetricKey.Mode = CipherMode.CBC;

        ICryptoTransform decryptor = symmetricKey.CreateDecryptor(keyBytes, initVectorBytes);

        MemoryStream memoryStream = new MemoryStream(cipherTextBytes);

        CryptoStream cryptoStream = new CryptoStream(memoryStream,
                                                      decryptor,
                                                      CryptoStreamMode.Read);

        byte[] plainTextBytes = new byte[cipherTextBytes.Length];

        int decryptedByteCount = cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length);

        memoryStream.Close();
        cryptoStream.Close();

        string plainText = Encoding.UTF8.GetString(plainTextBytes, 0, decryptedByteCount);

        return plainText;
    }
}
c# rijndael rijndaelmanaged
1个回答
0
投票

将 ReadToEnd() 与 StreamReader 一起使用,现在工作正常。

using var plainTextReader = new StreamReader(cryptoStream);
return plainTextReader.ReadToEnd();

以下是 Decrypt 方法的完整代码:

public static string Decrypt(string cipherText,
    string passPhrase,
    string saltValue,
    string hashAlgorithm,
    int passwordIterations,
    string initVector,
    int keySize)
{
    byte[] initVectorBytes = Encoding.ASCII.GetBytes(initVector);
    byte[] saltValueBytes = Encoding.ASCII.GetBytes(saltValue);

    byte[] cipherTextBytes = Convert.FromBase64String(cipherText);

    PasswordDeriveBytes password = new PasswordDeriveBytes(
        passPhrase, saltValueBytes, hashAlgorithm, passwordIterations);

    byte[] keyBytes = password.GetBytes(keySize / 8);

    RijndaelManaged symmetricKey = new RijndaelManaged();

    symmetricKey.Mode = CipherMode.CBC;

    ICryptoTransform decryptor = symmetricKey.CreateDecryptor(keyBytes, initVectorBytes);

    MemoryStream memoryStream = new MemoryStream(cipherTextBytes);

    CryptoStream cryptoStream = new CryptoStream(memoryStream,
                                                  decryptor,
                                                  CryptoStreamMode.Read);

    using var plainTextReader = new StreamReader(cryptoStream);
    return plainTextReader.ReadToEnd();
}
© www.soinside.com 2019 - 2024. All rights reserved.