2017-04-12 11 views
0

C#で書かれたサーバーアプリケーションでAESを使用してデータを暗号化します。C#とCryptoJSを使用した異なる暗号化結果

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

暗号化された結果:私はこれは私がデータを暗号化するために使用私のC#のコードである

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

...たとえば、事前に定義されたキー(32バイト)とIV(16バイト)を使用しますデータは次のようになります...

534c..28f5 

ここで、私はCryptoJSを使用してクライアントアプリケーションでデータを復号したいと考えています。私はまったく同じキーとIV情報を使用しますが、復号化は失敗するようです...少なくとも復号化された結果は常に空です。

私はクライアント上のデータを暗号化しました(もちろん、同じキーとIVです)。その結果、暗号化されたテキストは異なります。より正確には、それは同じですが、最後に、より多くのデータを持っている...私は、サーバー上のデータを暗号化した場合に取得ドント最後にこの追加データは

534c..28f5bbd5..ac0e 

は何ですか?

クライアントで暗号化された暗号化されたテキストを復号化すると、復号化が機能します。言及すると、モードとパディングはサーバーとクライアントの両方でデフォルトであり、CBCPkcs7です。 keysizeは256である必要があります。これはサーバーで暗号化されたデータを復号化するために使用するコードです。

答えて

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

関連する問題