当前位置: 首页 > 面试题库 >

如何解密在nodejs中加密的golang中的AES256位密码?

周越泽
2023-03-14
问题内容

我这样在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中使用的密钥的长度不能为64。这里,缓冲区的长度为32,十六进制的长度为64。

我想在golang中解密此密码,我将不得不使用此密钥和iv对其进行解密。

golang中的aes的长度取决于密钥的大小,并且当它看到长度为64的密钥时,会抛出错误,表示Invalid key length

如何在golang中解密?我当前正在使用的程序是: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这意味着,如果我aes256在nodejs中使用它,它的确会这样做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



 类似资料:
  • 我尝试在android中加密,在nodejs服务器中解密。我生成了一个AES 128位密钥,并使用AES算法对其进行加密,然后使用RSA算法对生成的密钥进行加密。然后将两者都发送到服务器。但是在服务器端解密时,我认为RSA解密工作正常,但在AES解密中有一个问题。我在服务器端没有收到我在客户端加密的字符串。 这是android端加密的代码: 然后把这个发到服务器端 服务器端的代码如下所示: 这里的

  • 问题内容: 我有一些需要解密的加密文本。它使用AES-256-CBC加密。我有加密的文本,密钥和iv。但是,无论我尝试什么,我似乎都无法正常工作。 互联网建议mcrypt的Rijndael密码应该能够做到这一点,所以这就是我现在所拥有的: 目前,我收到2条警告,并且输出乱码: 任何帮助,将不胜感激。 问题答案: 我并不十分熟悉的东西,但它似乎是试图替代将是一个明显的下一个步骤… 编辑: 您是对的,

  • 问题内容: 基于Golang关于CFB解密的文档,我写了一个最小的工作示例来解密使用AES CFB加密的字符串,然后使用python3编码的base 64。 当邮件在Golang中加密(使用Golang doc示例中的加密功能)时,golang解密工作正常。但是,当我使用python crypto包在python脚本中加密消息时,我无法在golang脚本中成功解密它。我没有得到正确的字节。 两种A

  • 我在PHP上使用aes-256-cbc模式加密了一些值,如下所示: 然后我试着在PHP上解密,结果很好: 所以我是JavaScript新手,我不知道如何实现与php相同的解密方法。 加密字符串及其密钥示例: 加密字符串< code > luimppajich/e 44 mwkr 0 q 9 xdyjh 5 q 8 zej hi 8 etax 5 brl 78 vsyh wdknmbga 1 l 8

  • 我想加密应用程序外的密钥并传递给应用程序。在应用程序中,当使用这些密钥时,必须再次使用加密时使用的密钥解密字符串。 在Swift中解密 AES

  • 我理解哈希和加密之间的区别。我正在寻找一种在Python中实现加密/解密字符串的简单方法。我在网上找到的大多数方法都是关于使用散列算法(MD5-SHA-1等)来进行单向散列。但不幸的是,哈希是不可逆的。有什么建议吗?