2015-04-08 9 views
5

Ich habe Fragen zu AES-Schlüssel und IV Länge.CryptoJS und Schlüssel/IV Länge

Zunächst einmal, wenn zum Beispiel bin ich DrogenOpenSSL Erweiterung und openssl_encrypt() Verfahren verwendet wird, kann ich für diesen Schlüssel deutlich sehen 256-Bit-AES Bytes sein sollte, und IV wirft Warnung Wenn es anders ist als Bytes. Ich kann das verstehen und alles ist in Ordnung.

Allerdings ist in CryptoJS Bibliothek der Schlüssel und IV Länge frustrierend. Dies sind einige Beispiel:

var text = "test", 
    key = "us5N0PxHAWuIgb0/Qc2sh5OdWBbXGady", 
    iv = "zAvR2NI87bBx746n"; 

key = CryptoJS.enc.Base64.parse(key); 
iv = CryptoJS.enc.Base64.parse(iv); 

crypted = CryptoJS.AES.encrypt(text, key, { iv: iv }); 

wo Schlüssel ist 32 Bytes, IV ist . CryptoJS erfordert es zu analysieren, und nach CryptoJS.enc.Base64.parse() bekomme ich 48 und 24 Bytes entsprechend. Ich erwarte, dass diese Werte auf die erforderliche Länge von 256-Bit AES gekürzt werden, und eine weitere Erweiterung auf n Bytes wird irrelevant sein, und der sich ergebende Chiffretext wird gleich sein.

Aber das passiert nicht wirklich. Wenn ich zu CryptoJS.AES.encrypt() Schlüssel der größeren Größe und sogar IV überlasse, produziert es unterschiedliche Ausgabe. Also meine Frage ist, warum? Was ist der Unterschied zwischen CryptoJS Bibliothek und OpenSSL in diesem Fall?

Antwort

5

Sieht aus wie ich es habe.

Wenn Sie benutzerdefinierte key und IV sich mit der CryptoJS passieren neigen, stellen Sie sicher, dass (unter der Annahme, dass CryptoJS.enc.Base64.parse()HEX Zeichenfolge gibt, die in CryptoJS.AES.encrypt() verwendet wird).

Einnahme dieses Beispiel mit Base64 Schlüssel und IV (Länge = 22), die CryptoJS verschlüsselt als AES-256:

var message = "some_secret_message"; 

var key = "6Le0DgMTAAAAANokdEEial"; //length=22 
var iv = "mHGFxENnZLbienLyANoi.e"; //length=22 

key = CryptoJS.enc.Base64.parse(key); 
//key is now e8b7b40e031300000000da247441226a, length=32 
iv = CryptoJS.enc.Base64.parse(iv); 
//iv is now 987185c4436764b6e27a72f2fffffffd, length=32 

var cipherData = CryptoJS.AES.encrypt(message, key, { iv: iv }); 

var data = CryptoJS.AES.decrypt(cipherData, key, { iv: iv }); 
//data contains "some_secret_message" 

Länge des key beträgt 32 Bytes für AES -256. (16 Byte, wenn Sie AES-128 erhalten möchten. Wenn mehr, CryptoJS zu höherer Schlüssellänge wechseln wird). In anderen Fällen erhalten Sie beim Entschlüsseln eine leere Nachricht. Beispiel:

var message = "some_secret_message"; 

var key = "6Le0DgMTAAAAANokdEEial1"; //length=23 
var iv = "mHGFxENnZLbienLyANoi.e"; //length=22 

key = CryptoJS.enc.Base64.parse(key); // length = 17 bytes 
//key is now e8b7b40e031300000000da247441226a5d, length=34 (hex encoded) 
iv = CryptoJS.enc.Base64.parse(iv); // length = 16 bytes 
//iv is now 987185c4436764b6e27a72f2fffffffd, length=32 (hex encoded) 

var cipherData = CryptoJS.AES.encrypt(message, key, { iv: iv }); 

var data = CryptoJS.AES.decrypt(cipherData, key, { iv: iv }); 
//data contains "" - an empty string 

Auch von dem, was ich sehen kann, nur x % 8 == 0 Bytes eines solchen Anwendungsfall gibt gültiges Ergebnis.

Länge von IV sollte 22 Bytes sein (wenn Base64 codiert), und während sie mit CryptoJS.enc.Base64.parse() Umwandlung Sie 16 Byte (32 hex codiert) erhalten wird, die für AES-256 Blockgröße max. Alles andere wird abgeschnitten.

var message = "some_secret_message"; 

var key = "6Le0DgMTAAAAANokdEEial"; //length=22 
var iv = "mHGFxENnZLbienLyANoi.e"; //length=22 

key = CryptoJS.enc.Base64.parse(key); // length=16 bytes 
//key is now e8b7b40e031300000000da247441226a5d, length=32 (hex encoded) 
iv = CryptoJS.enc.Base64.parse(iv); // length=16 bytes 
//iv is now 987185c4436764b6e27a72f2fffffffd, length=32 (hex encoded) 

var cipherData = CryptoJS.AES.encrypt(message, key, { iv: iv }); 

var key = "6Le0DgMTAAAAANokdEEial"; //length=22 
var iv = "mHGFxENnZLbienLyANoi.e123"; //length=25 

key = CryptoJS.enc.Base64.parse(key); // length = 16 bytes 
//key is now e8b7b40e031300000000da247441226a5d, length=32 (hex encoded) 
iv = CryptoJS.enc.Base64.parse(iv); // length = 18 bytes 
//iv is now 987185c4436764b6e27a72f2fffffffded76, length=36 (hex encoded) 

var data = CryptoJS.AES.decrypt(cipherData, key, { iv: iv }); //data contains "some_secret_message", so additional "123" in IV is irrelevant. 
+1

1. Es ist etwas falsch mit Ihren Zahlen. AES hat eine Blockgröße von 128 Bit, was auch die erwartete Größe der IV ist. AES ist nicht für IVs angegeben, die größer oder kleiner als 16 Byte sind.IV-Größe ist nicht dasselbe wie Schlüsselgröße. 2. 22 Bytes ist keine gültige Base64-codierte Zeichenfolge. Es muss durch 4 teilbar sein (mit optionalen Pad Chars). –

+0

Ich Objekt. AES hat Blockgröße 128, wenn es AES-128 ist. Im Falle von AES-256 - Blockgröße ist offensichtlich, 256 Bits, die 32 Bytes ist, was genau ist, was Sie durch CryptoJS.enc.Base64.parse() 'von 22 Byte Base64 String erhalten. Laut Spezifikation und Algorithmus ist IV genau die Blockgrößenlänge, die bei AES-256 32 Byte beträgt. – Nevertheless

+0

Weitere Informationen finden Sie unter http://security.stackexchange.com/questions/15740/what-are-the-variables-of-aes – Nevertheless