我正在忙于创建一个与我们客户现有的C#服务集成的Javascript应用程序。
其中一项要求是发送AES加密数据,然后在服务器上对其进行解密和使用。
但是,我无法发送“有效”数据,服务器始终响应“填充无效且无法删除。”
以下是他们的C#Encrypt和Decrypt实现(这不能更改,因为它们有各种子系统依赖于此:
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()”答案 0 :(得分:3)
CryptoJS文档严重缺乏深度,因此很难在不尝试的情况下知道会发生什么。很明显,使用密码作为盐并不是一种安全的标准方法来处理盐。所以你必须自己调用PBKDF2函数,自己创建一个密钥和IV。您还需要使用SHA-1而不是SHA-256在CryptoJS中创建PBKDF2。 SHA-256似乎是 - 再次未记录 - 在CryptoJS中默认。
执行此操作的唯一方法是逐步执行代码,并比较PBKDF2和AES函数的每个(二进制)值。请转换为十六进制以进行比较。