使用C#和CryptoJS进行不同的加密结果

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

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

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

 async Task 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解密客户端应用程序中的数据。 我使用完全相同的密钥和IV信息,但解密似乎失败…至少解密结果总是为空。

所以,我加密了客户端上的数据(当然是相同的密钥和IV),结果加密的文本是不同的; 更确切地说,它是相同的,但最终有更多的数据……

 534c..28f5bbd5..ac0e 

如果我加密服务器上的数据,最后这些额外的数据是什么?

如果我解密在客户端上加密的加密文本,则解密起作用。 Pkcs7 ,模式和填充在服务器和客户端都是默认的,即CBCPkcs7 ; keysize应为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); 

对于写入,块的刷新存在问题。 FlushFinalBlock()Flush() (或FlushAsync() )不同。 您必须同时执行它们,或者只是处理CryptoStream 。 这将解决代码没有写入最后一个数据块的事实。

 async static Task 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(); } } } } 

打字稿代码似乎能够解密它。

工作小提琴: https : //jsfiddle.net/uj58twrr/3/