在PHP中,mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);
返回值32,因此显然说AES-256需要32字节的初始化向量。但这是欺骗性的,如comments for mcrypt_encrypt
所述:
此外,
MCRYPT_RIJNDAEL_256
不是AES-256,它是Rijndael分组密码的不同变体。如果您希望在mcrypt中使用AES-256,则必须使用带有32字节密钥的MCRYPT_RIJNDAEL_128
。 OpenSSL更明显地使用了您使用的模式(即'aes-128-cbc'与'aes-256-ctr')。
当然,对于32字节的IV,以下示例在Go中不起作用(它会引起恐慌)。
score := decodePost(c.PostForm("score"))
iv := decodePost(c.PostForm("iv"))
aesKey := getAESKey()
baseAES, err := aes.NewCipher([]byte(aesKey))
if err != nil {
c.AbortWithError(500, err)
return
}
block := cipher.NewCBCDecrypter(baseAES, []byte(iv))
block.CryptBlocks(score, score)
引自crypto/cipher
的文档:
iv的长度必须与Block的块大小相同,并且必须与用于加密数据的iv相匹配。
(当然还有AES block size in Go is 16 bytes)。
所以,最后,我怎么能在Go中解密这样的字符串?
答案 0 :(得分:2)
由于在Golang中你只有内置的标准AES加密,你需要自己实现Rijndael加密。
我在这里找到了一个:https://github.com/celso-wo/rijndael256/blob/master/rijndael256.go