如何解决来自 Ruby 的 AES-256-GCM 加密和 Golang 解密
我在 Ruby 中使用 aes-256-gcm
进行了加密
require 'openssl'
key = "972ec8dd995743d981417981ac2f30db"
iv = "6a825c25ea74"
auth_data = "73f6828fc5be"
plaintext = "John Doe play foo bar"
cipher = OpenSSL::Cipher.new('aes-256-gcm')
cipher.encrypt
cipher.iv = iv
cipher.key = key
cipher.auth_data = auth_data
cipherText = cipher.update(plaintext) + cipher.final
authTag = cipher.auth_tag
hexString = (cipherText + iv + authTag).unpack('H*').first
hextString 结果看起来像
fa03a24cad007ceaadc34c22edff943cb58fe514ed36613832356332356561373425f6bc5724b956daae151c8d78a21263
我想用 Go 解密
key := "972ec8dd995743d981417981ac2f30db"
iv := "6a825c25ea74"
authData := "73f6828fc5be"
hexString,_ := hex.DecodeString("fa03a24cad007ceaadc34c22edff943cb58fe514ed36613832356332356561373425f6bc5724b956daae151c8d78a21263")
block,err := aes.NewCipher([]byte(key))
if err != nil {
panic(err.Error())
}
aesgcm,err := cipher.NewGCM(block)
if err != nil {
panic(err.Error())
}
plaintext,err := aesgcm.Open(nil,[]byte(iv),hexString,[]byte(authData))
if err != nil {
panic(err.Error())
}
我得到了 cipher: message authentication failed
。
而且我不明白 golang 中关于 authData 的要点,我不能在这里https://golang.org/pkg/crypto/cipher/#NewGCM
解决方法
nonce (iv) 不属于密文的中间。您在 ruby 示例中想要的十六进制编码输出只是 cipherText
+ authTag
。由于随机数必须与密文一起发送,如果您愿意,通常在密文前加上随机数作为前缀,但您必须在解密消息之前将其修剪掉。 (另请注意,您的 key
、iv
和 auth_data
值似乎是十六进制字符串,但它们被用作原始字节,这可能会增加一些混乱)。>
重新排列消息的字节以添加随机数,给我们这个例子:https://play.golang.org/p/YV5FugSyM5_G
key := []byte("972ec8dd995743d981417981ac2f30db")
authData := []byte("73f6828fc5be")
msg,err := hex.DecodeString("366138323563323565613734fa03a24cad007ceaadc34c22edff943cb58fe514ed25f6bc5724b956daae151c8d78a21263")
block,err := aes.NewCipher([]byte(key))
if err != nil {
log.Fatal(err)
}
aesgcm,err := cipher.NewGCM(block)
if err != nil {
log.Fatal(err)
}
sz := aesgcm.NonceSize()
nonce,cipherText := msg[:sz],msg[sz:]
pt,err := aesgcm.Open(nil,nonce,cipherText,authData)
if err != nil {
log.Fatal(err)
}
fmt.Printf("%q\n",pt)
“John Doe 玩 foo bar”
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。