我有一个在 PHP 中使用的加密函数
function Encrypt(?string $Content, string $Key): string {
return openssl_encrypt($Content, 'aes-256-gcm', $Key, OPENSSL_RAW_DATA, $IV = random_bytes(16), $Tag, '', 16) . $IV . $Tag;
}
搭配解密功能
function Decrypt(?string $Ciphertext, string $Key): ?string {
if (strlen($Ciphertext) < 32)
return null;
$Content = substr($Ciphertext, 0, -32);
$IV = substr($Ciphertext, -32, -16);
$Tag = substr($Ciphertext, -16);
try {
return openssl_decrypt($Content, 'aes-256-gcm', $Key, OPENSSL_RAW_DATA, $IV, $Tag);
} catch (Exception $e) {
return null;
}
}
我将从加密函数加密的数据存储到我的数据库中,现在我试图在 Go 中解密这些相同的值,但我得到了,但我cipher: message authentication failed无法弄清楚我遗漏了什么。
c := []byte(`encrypted bytes of sorts`) // the bytes from the db
content := c[:len(c)-32]
iv := c[len(c)-32 : len(c)-16]
tag := c[len(c)-16:]
block, err := aes.NewCipher(key[:32])
if err != nil {
panic(err.Error())
}
aesgcm, err := cipher.NewGCMWithNonceSize(block, 16)
if err != nil {
panic(err.Error())
}
fmt.Println(aesgcm.NonceSize(), aesgcm.Overhead()) // making sure iv and tag are both 16 bytes
plaintext, err := aesgcm.Open(nil, iv, append(content, tag...), nil)
if err != nil {
panic(err.Error())
}
值得注意的是,我使用的密钥不是 32 字节(它更大),因为我不知道所需的密钥/应该是 32 字节,所以我不完全确定 PHP 正在用它做什么(就像将它截断为 32 与使用具有 32 字节输出的东西散列它与其他东西相比)。
查看OpenGo 源代码中的函数,看起来标签应该是文本的最后一个“标签大小”字节,所以这就是为什么我在解析片段后将标签附加到密文。
凤凰求蛊
相关分类