2017-04-12 114 views
0

我使用AES在用C#编写的服务器应用程序中加密一些数据。我使用预定键(32个字节)和IV(16个字节),例如...使用C#和CryptoJS的不同加密结果

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的客户端应用程序中的数据。我使用完全相同的密钥和IV信息,但解密似乎失败了...至少解密结果总是空的。因此,我加密了客户端上的数据(当然是相同的密钥和IV),结果加密的文本是不同的;更确切地说它是相同的,但在年底有更多的数据...

534c..28f5bbd5..ac0e 

什么是那个我不得到,如果我加密服务器上的数据到底这额外的数据?

如果我解密已在客户端上加密的加密文本,则解密将起作用。只要提到它,模式和填充在服务器和客户端都是默认的,分别是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); 

回答

1

对于写入,存在刷新块的问题。 FlushFinalBlock()不同于Flush()(或从FlushAsync())。你必须这样做,或者干脆去掉CryptoStream。这将解决代码没有写入最后一块数据的事实。

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

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

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

+0

谢谢。这解决了问题。 – Matze

相关问题