J'ai chiffré une chaîne dans Node.js comme ceci.
var cipher = crypto.createCipheriv(
"aes256",
"<A Buffer of length 32>",
"79b67e539e7fcaefa7abf167de5c06ed"
);
J'ai remarqué qu'un tampon dans nodejs est comme hex mais tous les 2 caractères consécutifs sont appariés. Donc, sa longueur est la moitié de ce qui sortira si je le convertis en hexagone.
Exemple:
Tampon:
<Buffer c3 80 36 f6 51 57 cb 6d b0 e8 fd 85 5a a2 8a da 07 4b e7 19 17 d1 c8 ee dc 2a e4 d8 5e 3c 9d a6>
Hex:
c38036f65157cb6db0e8fd855aa28ada074be71917d1c8eedc2ae4d85e3c9da6
Maintenant, la clé que j'utilise dans aes256 ne peut pas avoir une longueur de 64. Ici, la longueur du tampon est de 32 et la longueur de l'hex est de 64.
Je veux déchiffrer ce chiffrement en golang et je vais devoir utiliser cette clé et iv pour le déchiffrer.
aes en golang prend une longueur en fonction de la taille de la clé et quand il voit une clé de longueur 64 , il renvoie une erreur qui dit Invalid key length
.
Comment le déchiffrer dans Golang? Il y a mon programme actuel dans go: https://play.golang.org/p/SoXOz3XIPK
package main
import (
"crypto/aes"
"crypto/cipher"
"fmt"
"log"
)
func main() {
encKey := "c38036f65157cb6db0e8fd855aa28ada074be71917d1c8eedc2ae4d85e3c9da6"
iv := "79b67e539e7fcaefa7abf167de5c06ed"
cipherText := "c02eccfc514a0b7fae830586dd56e0fcebb81fc49f41fa6dedf099c3645793bef7ec7075eca30063f9c0ef395d5ee2d44e4f3490114280abb7cf86d6eb525e2ec9bd2b781388986480f8b3df95f7b10e"
block, err := aes.NewCipher([]byte(encKey))
if err != nil {
log.Fatalf("%s", err)
}
decrypter := cipher.NewCFBDecrypter(block, []byte(iv))
decrypted := make([]byte, 1000)
decrypter.XORKeyStream(decrypted, []byte(cipherText))
fmt.Printf("%s\n", string(decrypted))
}
J'ai résolu ce problème avec l'aide de @osgx
Ce sont les choses que je devais changer pour décrypter correctement.
Décodez toutes les chaînes hexadécimales que j'utilisais.
J'ai vérifié la documentation de nodejs et les méthodes / algorithmes de chiffrement utilisent un schéma de dénomination similaire à celui de openssl
. Donc, j'ai exécuté cette commande openssl list-cipher-algorithms | grep "AES256"
et j'ai obtenu une sortie comme celle-ci, ce AES256 => AES-256-CBC
qui signifie que si j'utilise aes256
dans nodejs, ça va vraiment faire aes-256-cbc
. Ensuite, j'ai vérifié mon code golang et j'utilisais aes-256-cfb
ce qui est faux. Donc, j'ai changé cela et utilisé un décrypteur cbc.
Changer ces deux choses donne de bons résultats.
Merci beaucoup pour l'aide @osgx.
Mon code mis à jour est:
package main
import (
"crypto/aes"
"crypto/cipher"
"encoding/hex"
"fmt"
)
func main() {
encKey := "c38036f65157cb6db0e8fd855aa28ada074be71917d1c8eedc2ae4d85e3c9da6"
iv := "79b67e539e7fcaefa7abf167de5c06ed"
cipherText := "c02eccfc514a0b7fae830586dd56e0fcebb81fc49f41fa6dedf099c3645793bef7ec7075eca30063f9c0ef395d5ee2d44e4f3490114280abb7cf86d6eb525e2ec9bd2b781388986480f8b3df95f7b10e"
encKeyDecoded, err := hex.DecodeString(encKey)
if err != nil {
panic(err)
}
cipherTextDecoded, err := hex.DecodeString(cipherText)
if err != nil {
panic(err)
}
ivDecoded, err := hex.DecodeString(iv)
if err != nil {
panic(err)
}
block, err := aes.NewCipher([]byte(encKeyDecoded))
if err != nil {
panic(err)
}
mode := cipher.NewCBCDecrypter(block, []byte(ivDecoded))
mode.CryptBlocks([]byte(cipherTextDecoded), []byte(cipherTextDecoded))
fmt.Println(string(cipherTextDecoded))
}
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