2017-04-12 7 views
0

Ich verschlüssle einige Daten mit AES in einer Serveranwendung, die in C# geschrieben wird. Ich verwende einen vordefinierten Schlüssel (32 Bytes) und IV (16 Byte), zum Beispiel ...Verschiedene Verschlüsselungsergebnisse mit C# und CryptoJS

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

Dieser meinen C# Code ist I verwenden, die Daten zu verschlüsseln:

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

Das verschlüsselte Ergebnis Daten sehen wie aus ...

534c..28f5 

Jetzt möchte ich die Daten in einer Client-Anwendung mit CryptoJS entschlüsseln. Ich benutze exakt die gleichen Schlüssel- und IV-Informationen, aber die Entschlüsselung scheint fehlzuschlagen ... zumindest ist das entschlüsselte Ergebnis immer leer.

Also verschlüsselte ich die Daten auf dem Client (natürlich gleichen Schlüssel und IV) und im Ergebnis der verschlüsselte Text ist anders; genauer gesagt ist es identisch, aber mehr Daten am Ende ...

534c..28f5bbd5..ac0e 

Was am Ende hat, ist diese zusätzlichen Daten, die ich bekommen, wenn ich dont die Daten auf dem Server zu verschlüsseln?

Wenn ich den verschlüsselten Text entschlüsseln, der auf dem Client verschlüsselt wurde, funktioniert die Entschlüsselung. Nur um es zu erwähnen, sind Modus und Auffüllen sowohl auf dem Server als auch auf dem Client Standard, nämlich CBC und Pkcs7; keysize sollte 256 sein. Dies ist der Code, den ich verwende, um die Daten zu entschlüsseln, das vom Server chiffriert wurde:

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

Antwort

1

Für den Schreib es ein Problem mit der Spülung der Blöcke war. Die FlushFinalBlock() unterscheidet sich von der Flush() (oder von der FlushAsync()). Sie müssen beides tun oder einfach die CryptoStream entsorgen. Dadurch wird die Tatsache behoben, dass der Code nicht den letzten Datenblock geschrieben hat.

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

Der Typoskript-Code scheint in der Lage zu sein, es zu entschlüsseln.

Arbeitsgeige: https://jsfiddle.net/uj58twrr/3/

+0

Danke. Das hat das Problem behoben. – Matze

Verwandte Themen