Code dans Vuejs -
var message = "Hello World"
var keyBytes = aesjs.utils.utf8.toBytes("akey123")
var iv = CryptoJS.lib.WordArray.random(8).toString()
var ivBytes = aesjs.utils.utf8.toBytes(iv)
var messageBytes = aesjs.utils.utf8.toBytes(message);
var aesCfb = new aesjs.ModeOfOperation.cfb(keyBytes, ivBytes);
var encryptedBytes = aesCfb.encrypt(messageBytes);
var encryptedHex = aesjs.utils.hex.fromBytes(encryptedBytes);
Données que j'envoie à GO - {"iv": iv, "cipher": encryptedHex}
Code dans GO
func DecryptCipher(iv, cipher string) {
key := []byte("akey123")
iv := []byte(iv)
cipherText, _ := hex.DecodeString(cipher)
block, err := aes.NewCipher(key)
if err != nil {
log.Println(err)
}
cfb := cipher.NewCFBDecrypter(block, iv)
cfb.XORKeyStream(cipherText, cipherText)
fmt.Println("data", string(cipherText))
}
Résultat attendu: "Hello World" Sortie réelle: @ Sa 1 Ig {
Quelqu'un peut-il s'il vous plaît m'aider et me dire ce qui me manque dans le code ci-dessus. Merci d'avance!
Il y a plusieurs failles dans les deux codes qui empêchent l'exécution. Cependant, comme les deux sont en cours d'exécution sur votre système, il semble qu'il s'agisse d'erreurs de copier / coller:
iv
et cipher
.Après ces corrections, les programmes sont exécutés, mais le décryptage échoue. Le problème est causé par différentes variantes de CFB: dans le code aes-js, CFB8 est utilisé et dans le code Go, CFB128. Ici, les chiffres indiquent le nombre de bits décalés dans le registre à décalage [1] .
Go ne prend en charge que CFB128, du moins sans modifications plus profondes [2] [3] .
aes-js utilise CFB8 par défaut. Cependant, la variante CFB peut également être définie explicitement avec le troisième paramètre du constructeur cfb. Un changement vers CFB128 est possible avec [4] :
var segmentSize = 16;
var aesCfb = new aesjs.ModeOfOperation.cfb(keyBytes, ivBytes, segmentSize);
Notez que la valeur doit être indiquée en octets, c'est-à-dire que 1 correspond à CFB8 et 16 à CFB128.
CFB est un chiffrement de flux, de sorte qu'un texte en clair de longueur arbitraire peut être chiffré sans remplissage et la longueur du texte chiffré est égale à celle du texte en clair [5] . Malheureusement, il semble y avoir un bogue dans aes-js [6] qui exige que la longueur du texte clair soit un multiple entier de la taille du segment, soit 16 octets dans le cas de CFB128. Sinon, le message d'erreur suivant s'affiche:
invalid plaintext size (must be segmentSize bytes)
C'est-à-dire que si les textes en clair utilisés n'ont pas déjà cette longueur, le bogue nécessite un remplissage explicite, bien qu'un chiffrement de flux ne nécessite pas réellement de remplissage.
Dans le contexte de ces problèmes, vous souhaiterez peut-être utiliser un mode différent ou des bibliothèques différentes.
Outre:
CryptoJS.lib.WordArray.random(8)
un WordArray
avec 8 octets aléatoires est créé et encodé comme une chaîne hexadécimale d'une longueur de 16 octets en utilisant toString()
. Cette chaîne hexadécimale est codée en Utf8 et est donc identique dans les deux codes. Néanmoins, les remarques sur la IV dans le commentaire sont bien sûr correctes.Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.
En cas d'infraction, veuillez [email protected] Supprimer.
laisse moi dire quelques mots