gpt4 book ai didi

javascript - 使用 C# 和 CryptoJS 的不同加密结果

转载 作者:行者123 更新时间:2023-12-03 04:33:59 27 4
gpt4 key购买 nike

我在服务器应用程序中使用 AES 加密一些数据,该应用程序是用 C# 编写的。例如,我使用预定义的 key (32 字节)和 IV(16 字节)...

Key: 81fe1681..6a451c1c
IV: e83c..ae76

这是我用来加密数据的 C# 代码:

async Task<byte[]> Encrypt(string privateKey, string pin, byte[] data)
{
using (var sha = SHA256.Create())
{
byte[] keyHash = sha.ComputeHash(Encoding.UTF8.GetBytes($"{privateKey}"));
byte[] pinHash = sha.ComputeHash(Encoding.UTF8.GetBytes($"{pin}"));
using (Aes aes = Aes.Create())
{
byte[] key = keyHash.Slice(0, aes.Key.Length);
byte[] iv = pinHash.Slice(0, aes.IV.Length);
using (ICryptoTransform transform = aes.CreateEncryptor(key, iv))
using (var stream = new MemoryStream())
using (var cryptStream = new CryptoStream(stream, transform, CryptoStreamMode.Write))
{
await cryptStream.WriteAsync(data, 0, data.Length);
await cryptStream.FlushAsync();

return stream.ToArray();
}
}
}
}

加密的结果数据看起来像......

534c..28f5

现在,我想使用 CryptoJS 解密客户端应用程序中的数据。我使用完全相同的 key 和 IV 信息,但解密似乎失败......至少解密结果始终为空。

所以,我在客户端对数据进行了加密(当然 key 和IV是相同的),结果密文是不同的;更准确地说,它是相同的,但最后有更多数据......

534c..28f5bbd5..ac0e

如果我在服务器上加密数据,最后我得不到的附加数据是什么?

如果我解密已在客户端加密的密文,则解密有效。顺便提一下,模式和填充在服务器和客户端都是默认的,即 CBC 和 Pkcs7 ; key 大小应为256。这是我用来解密服务器加密的数据的代码:

let keyHash: WordArray = CryptoJS.SHA256(CryptoJS.enc.Utf8.parse(privateKey));
let key: WordArray = CryptoJS.lib.WordArray.create(keyHash.words.slice(0, 8), 32);

let pinHash: WordArray = CryptoJS.SHA256(CryptoJS.enc.Utf8.parse(pin));
let iv: WordArray = CryptoJS.lib.WordArray.create(pinHash.words.slice(0, 4), 16);

let cfg: CryptoJS.lib.IBlockCipherCfg = { iv: iv };
let paramsData: CryptoJS.lib.CipherParamsData = {
ciphertext: cipherBuffer
};

let decrypted: WordArray = CryptoJS.AES.decrypt(paramsData, key, cfg);

最佳答案

对于写入, block 的刷新存在问题。 FlushFinalBlock()Flush() (或与 FlushAsync())不同。您必须同时执行这两个操作,或者干脆处理 CryptoStream。这将解决代码没有写入最后一个数据 block 的问题。

async static Task<byte[]> Encrypt(string privateKey, string pin, byte[] data)
{
using (var sha = SHA256.Create())
{
byte[] keyHash = sha.ComputeHash(Encoding.UTF8.GetBytes($"{privateKey}"));
byte[] pinHash = sha.ComputeHash(Encoding.UTF8.GetBytes($"{pin}"));
using (Aes aes = Aes.Create())
{
byte[] key = keyHash.Slice(0, aes.Key.Length);
byte[] iv = pinHash.Slice(0, aes.IV.Length);

Trace.WriteLine($"Key length: { key.Length }, iv length: { iv.Length }, block mode: { aes.Mode }, padding: { aes.Padding }");

using (var stream = new MemoryStream())
using (ICryptoTransform transform = aes.CreateEncryptor(key, iv))
{
using (var cryptStream = new CryptoStream(stream, transform, CryptoStreamMode.Write))
{
await cryptStream.WriteAsync(data, 0, data.Length);
}

return stream.ToArray();
}
}
}
}

typescript 代码似乎能够解密它。

工作 fiddle :https://jsfiddle.net/uj58twrr/3/

关于javascript - 使用 C# 和 CryptoJS 的不同加密结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43366842/

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