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

时间:2017-06-12 11:50:21

标签: node.js encryption go cryptography aes

我像这样在Node.js中加密了一个字符串。

var cipher = crypto.createCipheriv(
"aes256",
"<A Buffer of length 32>",
"79b67e539e7fcaefa7abf167de5c06ed"  
);

我注意到nodejs中的缓冲区类似于十六进制,但每两个连续字符配对。所以,如果我将其转换为十六进制,它的长度将是一半。

示例:

缓冲液:

<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))

}

1 个答案:

答案 0 :(得分:3)

我在@osgx

的帮助下解决了这个问题

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

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

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

  3. 改变这两件事可以得到正确的结果。

    非常感谢你帮助@osgx。

    我的更新代码是:

    XmlDocument newXMLDoc = new XmlDocument();
    newXMLDoc.LoadXml(@"<border><edge thickness=""1.3mm""><color value=""0, 0, 255""/></edge></border>");
    
    if (Rs.Rows.Count > 0)
     {
        foreach (DataRow query in Rs.Rows)
         {
            if(isRET)
              {
                if (oXFA.DomDocument.SelectSingleNode("//t:*[@name='" + Rs[0] + "']", oNameSpace) != null)
                 {
                    XmlNode newNode = 
    oXFA.DomDocument.ImportNode(newXMLDoc.SelectSingleNode("border"), true);
    oXFA.DomDocument.SelectSingleNode("//t:*[@name='" + Rs[0] + "']", oNameSpace).AppendChild(newNode);
                 }
              }
         }
     }
    

    https://play.golang.org/p/Zv24WoKtBY