Golang从NodeJS解密AES 256 CBC base64

这是我在Node.js中的:

var crypto = require('crypto') function encryptstring(str) { var cipher = crypto.createCipheriv('aes-256-cbc', 'NFd6N3v1nbL47FK0xpZjxZ7NY4fYpNYd', 'TestingIV1234567'), encrypted = cipher.update(str, 'utf-8', 'base64'); encrypted += cipher.final('base64'); return encrypted; } console.log(encryptstring("Testing 111111111111111111111111111111111111111111")) 

返回: w2f0vBP2hRfgVqssqOluk68Qxkc9LXFESc0ZGzPBq3p6f/x/LbwBbg1XOoRr7I/DAtESJGdweKG6nL9m8RfewA==

这就是我在Go上所拥有的:

 package main import ( "crypto/aes" "crypto/cipher" "encoding/base64" "fmt" ) // decrypt from base64 to decrypted string func decrypt(key []byte, iv []byte, cryptoText string) string { ciphertext, _ := base64.URLEncoding.DecodeString(cryptoText) block, err := aes.NewCipher(key) if err != nil { panic(err) } if len(ciphertext) < aes.BlockSize { panic("ciphertext too short") } ciphertext = ciphertext[aes.BlockSize:] stream := cipher.NewCFBDecrypter(block, iv) stream.XORKeyStream(ciphertext, ciphertext) return fmt.Sprintf("%s", ciphertext) } func main() { encKey := "NFd6N3v1nbL47FK0xpZjxZ7NY4fYpNYd" iv := "TestingIV1234567" stringtodecrypt := "w2f0vBP2hRfgVqssqOluk68Qxkc9LXFESc0ZGzPBq3p6f/x/LbwBbg1XOoRr7I/DAtESJGdweKG6nL9m8RfewA==" stringtodecrypt = decrypt([]byte(encKey), []byte(iv), stringtodecrypt) fmt.Println(string(stringtodecrypt)) } 

这最终返回到_▒▒▒6▒▒d,O▒ob"▒

很多Go代码都是从https://gist.github.com/manishtpatel/8222606获取的

我也试过这个: 如何解密在nodejs中encryption的golang中的AES256位密码? (一些hex.DecodeString修改hex.DecodeString在这种情况下是不必要的),但它会抛出一个错误,说panic: crypto/cipher: input not full blocks

这是我的代码,当我尝试:

 func main() { encKey := "NFd6N3v1nbL47FK0xpZjxZ7NY4fYpNYd" iv := "TestingIV1234567" stringtodecrypt := "w2f0vBP2hRfgVqssqOluk68Qxkc9LXFESc0ZGzPBq3p6f/x/LbwBbg1XOoRr7I/DAtESJGdweKG6nL9m8RfewA==" block, err := aes.NewCipher([]byte(encKey)) if err != nil { panic(err) } mode := cipher.NewCBCDecrypter(block, []byte(iv)) mode.CryptBlocks([]byte(stringtodecrypt), []byte(stringtodecrypt)) fmt.Println(string(stringtodecrypt)) } 

我搜查了很多,我似乎无法弄清楚这一点。

我究竟做错了什么?

你的第二次尝试更接近,但是你没有先解码base64string。

如果你通过密码包中的CBCDecrypter例子 ,你会有这样的东西:

 encKey := "NFd6N3v1nbL47FK0xpZjxZ7NY4fYpNYd" iv := "TestingIV1234567" ciphertext, err := base64.StdEncoding.DecodeString("w2f0vBP2hRfgVqssqOluk68Qxkc9LXFESc0ZGzPBq3p6f/x/LbwBbg1XOoRr7I/DAtESJGdweKG6nL9m8RfewA==") if err != nil { panic(err) } block, err := aes.NewCipher([]byte(encKey)) if err != nil { panic(err) } if len(ciphertext)%aes.BlockSize != 0 { panic("ciphertext is not a multiple of the block size") } mode := cipher.NewCBCDecrypter(block, []byte(iv)) mode.CryptBlocks(ciphertext, ciphertext) fmt.Printf("%s\n", ciphertext) 

https://play.golang.org/p/16wV2UJ5Iw