gpt4 book ai didi

c# - 使用 Crypto-JS 和 C# 解密的 AES 加密 - 避免 "Padding is invalid and cannot be removed."

转载 作者:行者123 更新时间:2023-11-28 20:06:18 30 4
gpt4 key购买 nike

我正忙于创建一个 Javascript 应用程序,该应用程序与我们客户现有的 C# 服务集成。

要求之一是发送 AES 加密数据,然后在服务器上解密并使用。

但是,我无法发送“有效”数据,服务器总是响应“填充无效且无法删除。”

下面是他们的 C# 加密和解密实现(这不能更改,因为他们有各种子系统依赖于此:

public static string Encrypt(string input, string password)
{
byte[] utfData = Encoding.UTF8.GetBytes(input);
byte[] saltBytes = Encoding.UTF8.GetBytes(password);
string encryptedString = string.Empty;
using (var aes = new AesManaged())
{
var rfc = new Rfc2898DeriveBytes(password, saltBytes);

aes.BlockSize = aes.LegalBlockSizes[0].MaxSize;
aes.KeySize = aes.LegalKeySizes[0].MaxSize;
aes.Key = rfc.GetBytes(aes.KeySize/8);
aes.IV = rfc.GetBytes(aes.BlockSize/8);

using (ICryptoTransform encryptTransform = aes.CreateEncryptor())
{
using (var encryptedStream = new MemoryStream())
{
using (var encryptor =
new CryptoStream(encryptedStream, encryptTransform, CryptoStreamMode.Write))
{
encryptor.Write(utfData, 0, utfData.Length);
encryptor.Flush();
encryptor.Close();

byte[] encryptBytes = encryptedStream.ToArray();
encryptedString = Convert.ToBase64String(encryptBytes);
}
}
}
}
return encryptedString;
}


public static string Decrypt(string input, string password)
{
byte[] encryptedBytes = Convert.FromBase64String(input);
byte[] saltBytes = Encoding.UTF8.GetBytes(password);
string decryptedString = string.Empty;
using (var aes = new AesManaged())
{
var rfc = new Rfc2898DeriveBytes(password, saltBytes);
aes.BlockSize = aes.LegalBlockSizes[0].MaxSize;
aes.KeySize = aes.LegalKeySizes[0].MaxSize;
aes.Key = rfc.GetBytes(aes.KeySize/8);
aes.IV = rfc.GetBytes(aes.BlockSize/8);

using (ICryptoTransform decryptTransform = aes.CreateDecryptor())
{
using (var decryptedStream = new MemoryStream())
{
var decryptor =
new CryptoStream(decryptedStream, decryptTransform, CryptoStreamMode.Write);
decryptor.Write(encryptedBytes, 0, encryptedBytes.Length);
decryptor.Flush();
decryptor.Close();

byte[] decryptBytes = decryptedStream.ToArray();
decryptedString =
Encoding.UTF8.GetString(decryptBytes, 0, decryptBytes.Length);
}
}
}

return decryptedString;
}

我正在使用 CryptoJS 3.1.2。例如

var encrypted = CryptoJS.AES.encrypt(input, password).toString();

我如何使用 CryptoJS 编写与“Encrypt()”等效的代码

最佳答案

CryptoJS 文档严重缺乏深度,因此如果不尝试就很难知道会发生什么。很明显,使用密码作为盐并不是处理盐的安全或标准方法。所以你必须自己调用 PBKDF2 函数,自己创建 key 和 IV。您还需要使用 SHA-1 而不是 SHA-256 在 CryptoJS 中创建 PBKDF2。 SHA-256 似乎是 CryptoJS 中的默认值(再次未记录)。

执行此操作的唯一方法是单步执行代码,并比较 PBKDF2 和 AES 函数的每个(二进制)值。请转换为十六进制以便更好地比较。

关于c# - 使用 Crypto-JS 和 C# 解密的 AES 加密 - 避免 "Padding is invalid and cannot be removed.",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20744020/

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