Шифрование в Node JS с использованием AES 256 CTR и дешифрование в Golang

Chacha спросил: 14 ноября 2017 в 05:41 в: node.js

Я зашифровал некоторый JSON-текст, используя следующий код Node JS: -

var algorithm = 'aes-256-ctr';
var crypto = require('crypto');var password = "6A80FD8D38D579D1090F6CDB62C729311781E4BA31CD7D804BD7BF5AEC3BFC2D"var typedRequest = {"abc":"cde"}var cipher = crypto.createCipher(algorithm, password);
var hashRequest = cipher.update(JSON.stringify(typedRequest),
    'utf8', 'hex');
hashRequest += cipher.final('hex');

И теперь я хотел расшифровать этот encryptedText в Golang. Но я не могу найти какой-либо способ сделать это, поскольку почти во всех примерах логики дешифрования CTR 256 AES в Голанге я обнаружил, что для дешифрования всегда требуется IV, но я не использовал его в Node JS. Я написал что-то на Голанге, но это не правильно расшифровывает и пока дает ошибку: -

package mainimport (
    "crypto/aes"
    "crypto/cipher"
    "encoding/hex"
    "fmt")func main() {    encKey := "6A80FD8D38D579D1090F6CDB62C729311781E4BA31CD7D804BD7BF5AEC3BFC2D"
    cipherText := "746c17cd10f8f86646f843ac2a"    encKeyDecoded, err := hex.DecodeString(encKey)
    if err != nil {
        panic(err)
    }
    cipherTextDecoded, err := hex.DecodeString(cipherText)
    if err != nil {
        panic(err)
    }    iv := cipherTextDecoded[:aes.BlockSize]    block, err := aes.NewCipher([]byte(encKeyDecoded))
    if err != nil {
        panic(err)
    }    cipherTextBytes := []byte(cipherTextDecoded)    plaintext := make([]byte, len(cipherTextBytes) - aes.BlockSize)
    stream := cipher.NewCTR(block, iv)
    stream.XORKeyStream(plaintext, cipherTextBytes[aes.BlockSize:])    fmt.Println(string(plaintext))
}

Любая помощь в получении правильного кода Голанга высоко ценится. Благодаря

=====================================

Теперь я обновился до следующего после получения предложения от ответа: -

Это мой код js узла: -

var crypto = require('crypto'),
  algorithm = 'aes-256-ctr',
  password = '6A80FD8D38D579D1090F6CDB62CA34CA',
  // do not use a global iv for production, 
  // generate a new one for each encryption
  iv = '79b67e539e7fcadf'var typedRequest = {"abc":"cde"}var cipher = crypto.createCipheriv(algorithm, password, iv);
var hashRequest = cipher.update(JSON.stringify(typedRequest),
    'utf8', 'hex');
hashRequest += iv.toString('hex') + cipher.final('hex');

Это мой код Go : -

package mainimport (
    "crypto/aes"
    "crypto/cipher"
    "encoding/hex"
    "fmt")func main() {    encKey := "6A80FD8D38D579D1090F6CDB62CA34CA"
    cipherText := "af7d1eb42107549a7e3adbce1a79b67e539e7fcadf" // Got from above    encKeyDecoded, err := hex.DecodeString(encKey)
    if err != nil {
        panic(err)
    }
    cipherTextDecoded, err := hex.DecodeString(cipherText)
    if err != nil {
        panic(err)
    }    block, err := aes.NewCipher([]byte(encKeyDecoded))
    if err != nil {
        panic(err)
    }    iv := cipherTextDecoded[:aes.BlockSize]
    cipherTextBytes := []byte(cipherTextDecoded)    plaintext := make([]byte, len(cipherTextBytes) - aes.BlockSize)
    stream := cipher.NewCTR(block, iv)
    stream.XORKeyStream(plaintext, cipherTextBytes[aes.BlockSize:])    fmt.Println(string(plaintext))
}

Теперь я получаю нечто совершенно иное в расшифрованном виде.


0 ответов