CryptoJS et clés/IV longueur
J'ai une question à propos de la clé AES et IV de la longueur.
Tout d'abord, si, par exemple, je suis en utilisant médicaments OpenSSL
extension et openssl_encrypt()
méthode, je peux clairement voir que la clé pour 256-bit AES devrait être 32 octets, et IV lancers d'alerte si elle est différente de celle d' 16 octets. Je peux le comprendre, et tout va bien.
Cependant, dans CryptoJS
bibliothèque la clé et IV de la longueur est frustrant. Ceci est un exemple:
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 });
où la clé est 32 octets, IV est 16. CryptoJS nécessite d'analyser, et après CryptoJS.enc.Base64.parse()
- je obtenir 48 et 24 octets en conséquence. J'espère que ces valeurs obtiendrez tronquée requis 256-bit AES longueur, et la poursuite de l'expansion de n octets ne sera pas pertinente, et donc, résultant d'un cryptogramme sera le même.
Mais ce n'est pas ce qui se passe réellement. Quand je passe à CryptoJS.AES.encrypt() de plus grande taille de la clé et de même IV, il s'agit de produire de sortie différents. Donc ma question est, pourquoi? Quelle est la différence entre CryptoJS bibliothèque et OpenSSL dans ce cas?
OriginalL'auteur Damaged Organic | 2015-04-08
Vous devez vous connecter pour publier un commentaire.
On dirait que je l'ai.
Si vous avez tendance à passer personnalisé
key
etIV
en utilisant CryptoJS, assurez-vous que (en supposant queCryptoJS.enc.Base64.parse()
donne HEX chaîne qui est utilisée dansCryptoJS.AES.encrypt()
).En prenant cet exemple, avec Base64 clé et iv (longueur=22), qui CryptoJS crypte comme AES-256:
Longueur de la
key
est de 32 octets pour AES-256. (16 octets si vous souhaitez obtenir AES-128. Si de plus, CryptoJS allons passer à la hausse de la longueur de la clé). Dans d'autres cas sur le décrypter, vous obtiendrez un message vide. Exemple:Aussi, de ce que je peux voir, seulement
x % 8 == 0
octets de tels cas d'utilisation donne résultat valide.Longueur de
IV
devrait être de 22 octets (quand encodées en Base64), et lors de sa transformation, avecCryptoJS.enc.Base64.parse()
vous obtiendrez 16 octets (32 hex codés), qui est le max pour AES-256 la taille du bloc. Tout, plus qui sera tronquée.J'ai de l'objet. AES a taille de bloc de 128 si c'est AES-128. Dans le cas de l'AES-256 - taille du bloc est, de toute évidence, 256 bits, qui est de 32 octets, ce qui est exactement ce que vous obtenez en
CryptoJS.enc.Base64.parse()
de 22 octets chaîne Base64. Conformément à la spécification et de l'algorithme, IV est exactement la taille du bloc de longueur, qui est de 32 octets avec AES-256.Pour plus de renseignements, veuillez-vous, reportez-vous à security.stackexchange.com/questions/15740/...
Si vous vous référez à quelque chose, assurez-vous qu'il prend en charge votre demande: sqrt(23) écrit: "AES qui se passe pour être un parmi de nombreux [...], une constante de la taille de bloc de 16 octets" et "Vecteur d'Initialisation, ce qui correspond à la taille du bloc de chiffrement". Il n'a pas l'appui de votre demande. La taille de la clé et de la taille du bloc sont des choses différentes. Les 256 AES-256 se réfère à la taille de la clé.
C'est pour AES-128. Et il dit,"Vecteur d'Initialisation, ce qui correspond à la taille du bloc de chiffrement". Pour l'algorithme de chiffrement par blocs modes de fonctionnement, l'IV est généralement aussi grand que la taille de bloc de l'algorithme de chiffrement. Alors, ressemble 32 octets pour moi, pour un total de 256 bits AES.
OriginalL'auteur Damaged Organic