duanpacan9388 2017-06-12 11:50
浏览 97
已采纳

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

I encrypted a string in Node.js like this.

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

I noticed that a buffer in nodejs is like hex but every 2 consecutive characters are paired. So, It's length is half of whatever will come out if I convert it to a hex.

Example:

Buffer:

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

Hex:

c38036f65157cb6db0e8fd855aa28ada074be71917d1c8eedc2ae4d85e3c9da6

Now, The key I use in aes256 can not be of length 64. Here, Buffer's length is 32 and hex's length is 64.

I want to decrypt this cipher in golang and I'll have to use this key and iv to decrypt it.

aes in golang takes a length depending upon the size of key and when it sees a key of length 64 it throws an error that says, Invalid key length.

How do I decrypt it in golang? There is my current program in 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
", string(decrypted))

}
  • 写回答

1条回答 默认 最新

  • doubei2340 2017-06-12 14:29
    关注

    I solved this problem with help from @osgx

    These are the things that I needed to change to decrypt correctly.

    1. Decode all hex strings that I was using.

    2. I checked nodejs documentation and the cipher methods/algorithms use similar naming scheme as openssl. So, I ran this command openssl list-cipher-algorithms | grep "AES256"and I got an output like this, AES256 => AES-256-CBC which means that, if I am using aes256 in nodejs, It'll really be doing aes-256-cbc. Then I checked my golang code and I was using aes-256-cfb which is wrong. So, I changed that and used a cbc decrypter.

    Changing these two things gives proper results.

    Thank you so much for the help @osgx.

    My updated code is:

    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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 单纯型python实现编译报错
  • ¥15 c++2013读写oracle
  • ¥15 c++ gmssl sm2验签demo
  • ¥15 关于模的完全剩余系(关键词-数学方法)
  • ¥15 有没有人懂这个博图程序怎么写,还要跟SFB连接,真的不会,求帮助
  • ¥15 PVE8.2.7无法成功使用a5000的vGPU,什么原因
  • ¥15 keil官网下载psn序列号在哪
  • ¥15 想用adb命令做一个通话软件,播放录音
  • ¥30 Pytorch深度学习服务器跑不通问题解决?
  • ¥15 部分客户订单定位有误的问题