0

I write a encrypt file function use golang, but I don't how to implement it use nodejs

package main

import (
    "bytes"
    "crypto/aes"
    "crypto/cipher"
    "crypto/rand"
    "io"
    "io/ioutil"
    "os"
)

func encrypt(aeskey string, filename string) {
    plaintext, err := ioutil.ReadFile(filename)
    if err != nil {
        panic(err.Error())
    }

    // Byte array of the string
    key := []byte(aeskey)

    // Create the AES cipher
    block, err := aes.NewCipher(key)
    if err != nil {
        panic(err)
    }

    // The IV needs to be unique, but not secure. Therefore it's common to
    // include it at the beginning of the ciphertext.
    ciphertext := make([]byte, aes.BlockSize+len(plaintext))
    iv := ciphertext[:aes.BlockSize]
    if _, err := io.ReadFull(rand.Reader, iv); err != nil {
        panic(err)
    }

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

    // create a new file for saving the encrypted data.
    f, err := os.Create(filename + ".aes")
    if err != nil {
        panic(err.Error())
    }
    _, err = io.Copy(f, bytes.NewReader(ciphertext))
    if err != nil {
        panic(err.Error())
    }
}

func decrypt(aesKey string, inputFile string) {

    ciphertext, err := ioutil.ReadFile(inputFile)
    if err != nil {
        panic(err.Error())
    }

    // Key
    key := []byte(aesKey)

    // Create the AES cipher
    block, err := aes.NewCipher(key)
    if err != nil {
        panic(err)
    }

    // Before even testing the decryption,
    // if the text is too small, then it is incorrect
    if len(ciphertext) < aes.BlockSize {
        panic("Text is too short")
    }

    // Get the 16 byte IV
    iv := ciphertext[:aes.BlockSize]

    // Remove the IV from the ciphertext
    ciphertext = ciphertext[aes.BlockSize:]

    // Return a decrypted stream
    stream := cipher.NewCFBDecrypter(block, iv)
    // Decrypt bytes from ciphertext
    stream.XORKeyStream(ciphertext, ciphertext)
    // create a new file for saving the encrypted data.
    f, err := os.Create(inputFile + ".ts")
    if err != nil {
        panic(err.Error())
    }
    _, err = io.Copy(f, bytes.NewReader(ciphertext))
    if err != nil {
        panic(err.Error())
    }
}

func main() {
    key := "0123456789123456"
    encrypt(key, "1.ts")
    decrypt(key, "1.ts.aes")
}

In fact, I just have some confuse about

 ciphertext := make([]byte, aes.BlockSize+len(plaintext))
 iv := ciphertext[:aes.BlockSize]

I write a decrypt function use node ,but it don't work well:

var fs = require('fs');
var crypto = require('crypto');

function decrypt(aseKey, inputFile){
    var buffer = fs.readFileSync(inputFile)
    var arr = Array.prototype.slice.call(buffer, 0)
    var iv = arr.slice(0, 16)
    var bodyBytes = arr.slice(16)
    var cipher = crypto.createCipheriv('aes-128-cbc', aseKey, new Buffer(iv));
    buffer = cipher.update(new Buffer(bodyBytes));
    fs.writeFile(inputFile + ".node.ts", buffer)
}

decrypt("0123456789123456", "1.ts.aes")

thanks for you help

1
  • 2
    You need to specify the same mode of operation. Have you tried to change aes-128-cbc to aes-128-cfb? Commented May 27, 2017 at 10:30

1 Answer 1

1
var fs = require('fs');
var crypto = require('crypto');

function decrypt(aseKey, inputFile){
    var fileBody = fs.readFileSync(inputFile)
    var  decipher =  crypto.createDecipheriv("aes-128-cfb",new Buffer(aseKey) , fileBody.slice(0,16))
    var recv = decipher.update(fileBody.slice(16))

    fs.writeFileSync(inputFile + ".n.ts", recv)
}
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.