问题描述
我用golang实现了文件加密解密,但是不知道如何使用nodejs来实现golang的揭秘。golang代码:
package mainimport ( '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 main() { key := '0123456789123456' encrypt(key, '1.ts')}
通过以上golang代码加密的文件,如果用nodejs解析出来?
不知道转nodejs 主要集中 golang的几个byte处理。这是自己写的,但是是错误的。。
var fs = require(’fs’);var crypto = require(’crypto’);function decrypt(aseKey, inputFile){ var fileBody = fs.readFileSync(inputFile) var cipher = crypto.createDecipheriv('aes128', Buffer.from(aseKey), fileBody.slice(0,16)) var result = cipher.update(fileBody.slice(16)) fs.writeFileSync(inputFile+'.n.ts', result)}decrypt('0123456789123456', '1.ts.aes')
附golang解密这个文件的函数
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' decrypt(key, '1.ts.aes')}
问题解答
回答1:https://github.com/danielecr/aes128encrypter
回答2:以下代码采用AES192,128的类似,源码出处可点击查看。
var crypto = require(’crypto’);var key = crypto.randomBytes(192/8); // 替换成自己需要的keyvar iv = crypto.randomBytes(128/8); // 替换成自己需要的ivvar algorithm = ’aes192’;function encrypt(text){ var cipher = crypto.createCipheriv(algorithm, key, iv); cipher.update(text); return cipher.final(’hex’);}function decrypt(encrypted){ var decipher = crypto.createDecipheriv(algorithm, key, iv); decipher.update(encrypted, ’hex’); return decipher.final(’utf8’);}var content = ’hello’;var crypted = encrypt(’hello’);console.log( crypted ); // 输出:1b87be446405ff910cd280ae6aa0423fvar decrypted = decrypt( crypted );console.log( decrypted ); // 输出:hello回答3:
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)}decrypt('0123456789123456', '1.ts.aes')