我这样在Node.js中加密了一个字符串。
var cipher = crypto.createCipheriv( "aes256", "<A Buffer of length 32>", "79b67e539e7fcaefa7abf167de5c06ed" );
我注意到nodejs中的缓冲区就像十六进制,但每2个连续字符都成对出现。因此,如果我将其转换为十六进制,则长度只有一半。
例:
缓冲:
<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>
十六进制:
c38036f65157cb6db0e8fd855aa28ada074be71917d1c8eedc2ae4d85e3c9da6
现在,我在aes256中使用的密钥的长度不能为64。这里,缓冲区的长度为32,十六进制的长度为64。
我想在golang中解密此密码,我将不得不使用此密钥和iv对其进行解密。
golang中的aes的长度取决于密钥的大小,并且当它看到长度为64的密钥时,会抛出错误,表示Invalid key length。
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)) }
我在@osgx的帮助下解决了这个问题
这些是我需要更改以正确解密的事情。
解码我正在使用的所有十六进制字符串。
我检查了nodejs文档,并且密码方法/算法使用与相似的命名方案openssl。因此,我运行了此命令,openssl list-cipher-algorithms | grep "AES256"并得到了这样的输出,AES256 => AES-256-CBC这意味着,如果我aes256在nodejs中使用它,它的确会这样做aes-256-cbc。然后我检查了golang代码,发现使用的aes-256-cfb是错误的代码。因此,我改变了这一点,并使用了cbc解密器。
openssl
openssl list-cipher-algorithms | grep "AES256"
AES256 => AES-256-CBC
aes256
aes-256-cbc
aes-256-cfb
更改这两件事可以得到正确的结果。
非常感谢@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)) }
https://play.golang.org/p/Zv24WoKtBY