Ish*_*ain 1 encryption cryptography aes go node.js
我像这样加密了 Node.js 中的字符串。
var cipher = crypto.createCipheriv(
"aes256",
"<A Buffer of length 32>",
"79b67e539e7fcaefa7abf167de5c06ed"
);
Run Code Online (Sandbox Code Playgroud)
我注意到nodejs中的缓冲区就像十六进制,但每两个连续的字符都是配对的。因此,它的长度是我将其转换为十六进制后得到的长度的一半。
例子:
缓冲:
<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>
Run Code Online (Sandbox Code Playgroud)
十六进制:
c38036f65157cb6db0e8fd855aa28ada074be71917d1c8eedc2ae4d85e3c9da6
Run Code Online (Sandbox Code Playgroud)
现在,我在 aes256 中使用的密钥长度不能为 64。这里,Buffer 的长度为 32,hex 的长度为 64。
我想在 golang 中解密这个密码,我必须使用这个密钥和 iv 来解密它。
golang 中的 aes 的长度取决于密钥的大小,当它看到长度为 64 的密钥时,它会抛出一个错误,指出Invalid key length
。
我如何在golang中解密它?我目前的程序是: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))
}
Run Code Online (Sandbox Code Playgroud)
我在@osgx的帮助下解决了这个问题
这些是我需要更改才能正确解密的内容。
解码我使用的所有十六进制字符串。
我检查了 NodeJS 文档,密码方法/算法使用与openssl
. 所以,我运行了这个命令openssl list-cipher-algorithms | grep "AES256"
,得到了这样的输出,AES256 => AES-256-CBC
这意味着,如果我aes256
在nodejs中使用,它真的会做aes-256-cbc
。然后我检查了我的 golang 代码,发现我使用的aes-256-cfb
是错误的。所以,我改变了它并使用了 cbc 解密器。
改变这两件事会产生正确的结果。
非常感谢您的帮助@osgx。
我更新的代码是:
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))
}
Run Code Online (Sandbox Code Playgroud)
https://play.golang.org/p/Zv24WoKtBY