node.js - 如何解密在 nodejs 中加密的 golang 中的 AES256 位密码?

标签 node.js encryption go cryptography aes

我像这样在 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中使用的 key 长度不能是64。这里,Buffer的长度是32,hex的长度是64。

我想在 golang 中解密这个密码,我必须使用这个 key 和 iv 来解密它。

golang 中的 aes 需要一个长度,具体取决于 key 的大小,当它看到长度为 64 的 key 时,它会抛出一个错误,提示 Invalid key length

我如何在 golang 中解密它? go 中有我当前的程序: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 的帮助下解决了这个问题

这些是我需要更改才能正确解密的内容。

  1. 解码我使用的所有十六进制字符串。

  2. 我检查了 nodejs 文档,密码方法/算法使用与 openssl 类似的命名方案。所以,我运行了这个命令 openssl list-cipher-algorithms | grep "AES256" 我得到这样的输出,AES256 => AES-256-CBC 这意味着,如果我在 nodejs 中使用 aes256,它真的会执行 aes-256-cbc。然后我检查了我的 golang 代码,我使用的是错误的 aes-256-cfb。所以,我改变了它并使用了 cbc 解密器。

改变这两件事会产生正确的结果。

非常感谢@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

关于node.js - 如何解密在 nodejs 中加密的 golang 中的 AES256 位密码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44498745/

相关文章:

c# - NodeJS 3DES ECB 加密不等于 C# 加密

encryption - 使用 OpenSSL 进行 Tar 和加密,并将结果直接转储到 ssh 服务器

parallel-processing - goroutine 的最小工作量

encryption - 创建 CLI : What should I do with the password in the config file (and how)?

javascript - 日期在服务器上关闭一天但在本地主机上没有

node.js - 使用 Node 和 graphql 将上传文件流式传输到 Azure blob 存储

java - 使用 RSA 和另一个 key 加密消息

sql-server - Hibernate/JPA 和 MS SQL Server - 在 DecryptByKey 之前打开对称 key

http - 更改 http.Client cookie 值

node.js - 无法使用 Node.js 连接到 Apache ActiveMQ