gpt4 book ai didi

c# - CryptoStream 在关闭解密时抛出错误

转载 作者:太空宇宙 更新时间:2023-11-03 22:32:09 26 4
gpt4 key购买 nike

我正在尝试使用 RijndaelManaged 类加密纯文本,然后解密加密的字符串,最终得到相同的纯文本。

加密明文一切正常,如下所示,

    protected static string AESEncrypt(string plainText, string key)
{
byte[] encryptedBytes = null;

byte[] saltBytes = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };

using (MemoryStream ms = new MemoryStream())
{
using (RijndaelManaged aes = new RijndaelManaged())
{
aes.KeySize = 256;
aes.BlockSize = 128;

var keyHold = new Rfc2898DeriveBytes(key, saltBytes, 1000);

aes.Key = keyHold.GetBytes(aes.KeySize / 8);
aes.IV = keyHold.GetBytes(aes.BlockSize / 8);

aes.Mode = CipherMode.CBC;

var bytesToBeEncrypted = Encoding.UTF8.GetBytes(plainText);

using (var cs = new CryptoStream(ms, aes.CreateEncryptor(), CryptoStreamMode.Write))
{
cs.Write(bytesToBeEncrypted, 0, bytesToBeEncrypted.Length);
cs.Close();
}

encryptedBytes = ms.ToArray();
}
}

return Convert.ToBase64String(encryptedBytes);
}

例如,我通过调用上述函数 var encryptedString = AESEncrypt(plainText, "lockMe"); 来加密此纯文本 "encryptMe"。结果是 nKytZ86r0DDKSzD3ph+ntg==

然后我将该加密字符串发送到下面提到的函数,

    protected static string AESDecrypt(string cryptedText, string key)
{
byte[] decryptedBytes = null;

byte[] saltBytes = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };

using (MemoryStream ms = new MemoryStream())
{
using (RijndaelManaged aes = new RijndaelManaged())
{
aes.KeySize = 256;
aes.BlockSize = 128;

var keyHold = new Rfc2898DeriveBytes(key, saltBytes, 1000);

aes.Key = keyHold.GetBytes(aes.KeySize / 8);
aes.IV = keyHold.GetBytes(aes.BlockSize / 8);

aes.Mode = CipherMode.CBC;

var bytesToBeDDecrypted = Encoding.UTF8.GetBytes(cryptedText);

using (var cs = new CryptoStream(ms, aes.CreateDecryptor(), CryptoStreamMode.Write))
{
cs.Write(bytesToBeDDecrypted, 0, bytesToBeDDecrypted.Length);
cs.Close();
}

decryptedBytes = ms.ToArray();
}
}

return Encoding.UTF8.GetString(decryptedBytes);
}

在这个方法中,代码在离开 CryptoStream 时抛出错误 The input data is not a complete block

我的 KeySizeBlockSize 都可以被 8 整除,我看不出我忽略了什么。

最佳答案

AESDecrypt 中你有:

var bytesToBeDDecrypted = Encoding.UTF8.GetBytes(cryptedText);

由于您传递的是 base-64 编码的密码,因此应该改为

var bytesToBeDDecrypted = Convert.FromBase64String(cryptedText);

您还应该进行一些安全改进。您应该将迭代次数从 1000 增加到更大,至少 65K。 salt 应至少为 12 个字节,并且应为每次加密随机生成。它不需要保密,将它添加到密码中通常很方便。然后解密器从传入的密文中提取盐。您还应该使用消息验证码 (MAC) 来防止篡改。请注意,AES-GCM 模式以及其他一些模式将此 MAC 作为其操作的组成部分。但是,如果 AES-GCM 不可用,那么 HMAC-SHA256 可能会被接受。

关于c# - CryptoStream 在关闭解密时抛出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56992220/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com