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

来自NodeJS的Golang解密AES 256 CBC base64

陆绪
2023-03-14
问题内容

这是我在Node.js中拥有的:

var crypto = require('crypto')

function encryptstring(str) {
    var cipher = crypto.createCipheriv('aes-256-cbc', 'NFd6N3v1nbL47FK0xpZjxZ7NY4fYpNYd', 'TestingIV1234567'),
        encrypted = cipher.update(str, 'utf-8', 'base64');
    encrypted += cipher.final('base64');
    return encrypted;
}

console.log(encryptstring("Testing 111111111111111111111111111111111111111111"))

返回:
w2f0vBP2hRfgVqssqOluk68Qxkc9LXFESc0ZGzPBq3p6f/x/LbwBbg1XOoRr7I/DAtESJGdweKG6nL9m8RfewA==

这就是我在Go中所拥有的:

package main

import (
    "crypto/aes"
    "crypto/cipher"
    "encoding/base64"
    "fmt"
)

// decrypt from base64 to decrypted string
func decrypt(key []byte, iv []byte, cryptoText string) string {
    ciphertext, _ := base64.URLEncoding.DecodeString(cryptoText)
    block, err := aes.NewCipher(key)
    if err != nil {
        panic(err)
    }
    if len(ciphertext) < aes.BlockSize {
        panic("ciphertext too short")
    }

    ciphertext = ciphertext[aes.BlockSize:]
    stream := cipher.NewCFBDecrypter(block, iv)
    stream.XORKeyStream(ciphertext, ciphertext)

    return fmt.Sprintf("%s", ciphertext)
}

func main() {
    encKey := "NFd6N3v1nbL47FK0xpZjxZ7NY4fYpNYd"
    iv := "TestingIV1234567"
    stringtodecrypt := "w2f0vBP2hRfgVqssqOluk68Qxkc9LXFESc0ZGzPBq3p6f/x/LbwBbg1XOoRr7I/DAtESJGdweKG6nL9m8RfewA=="

    stringtodecrypt = decrypt([]byte(encKey), []byte(iv), stringtodecrypt)

    fmt.Println(string(stringtodecrypt))
}

最终返回 _▒▒▒6▒▒d,O▒ob"▒

许多Go代码都来自https://gist.github.com/manishtpatel/8222606

我也尝试过此方法:如何在golang中解密在nodejs中加密的AES256位密码?(hex.DecodeString在这种情况下,无需进行一些修改),但会抛出错误panic: crypto/cipher: inputnot full blocks

这是我尝试的代码:

func main() {
    encKey := "NFd6N3v1nbL47FK0xpZjxZ7NY4fYpNYd"
    iv := "TestingIV1234567"
    stringtodecrypt := "w2f0vBP2hRfgVqssqOluk68Qxkc9LXFESc0ZGzPBq3p6f/x/LbwBbg1XOoRr7I/DAtESJGdweKG6nL9m8RfewA=="

    block, err := aes.NewCipher([]byte(encKey))
    if err != nil {
        panic(err)
    }

    mode := cipher.NewCBCDecrypter(block, []byte(iv))

    mode.CryptBlocks([]byte(stringtodecrypt), []byte(stringtodecrypt))

    fmt.Println(string(stringtodecrypt))
}

我搜索了很多东西,但似乎无法弄清楚。

我究竟做错了什么?


问题答案:

您的第二次尝试更近了,但是您没有首先解码base64字符串。

如果按照密码包中的CBCDecrypter示例进行操作,则将具有以下内容:

encKey := "NFd6N3v1nbL47FK0xpZjxZ7NY4fYpNYd"
iv := "TestingIV1234567"
ciphertext, err := base64.StdEncoding.DecodeString("w2f0vBP2hRfgVqssqOluk68Qxkc9LXFESc0ZGzPBq3p6f/x/LbwBbg1XOoRr7I/DAtESJGdweKG6nL9m8RfewA==")
if err != nil {
    panic(err)
}

block, err := aes.NewCipher([]byte(encKey))
if err != nil {
    panic(err)
}

if len(ciphertext)%aes.BlockSize != 0 {
    panic("ciphertext is not a multiple of the block size")
}

mode := cipher.NewCBCDecrypter(block, []byte(iv))
mode.CryptBlocks(ciphertext, ciphertext)

fmt.Printf("%s\n", ciphertext)

https://play.golang.org/p/16wV2UJ5Iw



 类似资料:
  • 这是我在Node.js: 返回: 这就是我的围棋: 最终返回

  • 问题内容: 我这样在Node.js中加密了一个字符串。 我注意到nodejs中的缓冲区就像十六进制,但每2个连续字符都成对出现。因此,如果我将其转换为十六进制,则长度只有一半。 例: 缓冲: 十六进制: 现在,我在aes256中使用的密钥的长度不能为64。这里,缓冲区的长度为32,十六进制的长度为64。 我想在golang中解密此密码,我将不得不使用此密钥和iv对其进行解密。 golang中的ae

  • 我想运行所有这些查询到neo4j,我可以成功地运行一个密码查询会话,但对于多个查询,它显示错误。我还需要个别查询的JSON格式的结果。有什么帮助吗? //此查询的示例结果

  • 我有一个没有Java加密库的RSA代码类。很管用。 但是,当我从RSAPrivateKeySpec创建一个Java库PrivateKey,从类中的RSAPrivateKey创建一个模数和指数,并使用Java加密库a使用类encrypted BigInteger进行加密时,它会抛出。这里: 为什么? 对不起,我的英语不好

  • 注意:这只是为个人使用和学习,我不是试图滚动我自己的加密为公众使用。 我需要AES256加密一个字符串,但是我当前的尝试在十六进制解码时最终得到了一个类似server side的字符串。当十六进制解码时,它应该是一个有效的utf8 base64字符串,然后可以将其解码为原始字符串。这与这里提供的解决方案类似,但是salt并不是实际问题(尽管答案被接受),并且我无法在使用之前通过十六进制解码iv来抑

  • 这是一个错误: 1.JS