const crypto = require('crypto')
const fs = require('fs')
// let secret_key = 'My name is Tengxi'
// // 加密
// const hash = crypto.createHmac('sha256', secret_key).update('Happy new Year').digest('hex')
// console.log('加密的结果')
// console.log(hash)
// MD5(单向散列算法):输入任意长度的信息,经过处理,输出为128位的信息(数字指纹);不同的输入得到的不同的结果(唯一性);根据128位的输出结果不可能反推出输入的信息(不可逆)
// 把上述例子中sha256改成md5就是md5加密算法
// HMAC
// 用于创建加密的 HMAC 摘要,不能使用new直接创建HMAC对象
// 用法
// 作为可读写的流,其中写入数据以在可读侧生成计算后的 HMAC 摘要。
// 使用 hmac.update() 和 hmac.digest() 方法生成计算后的 HMAC 摘要
// sha256是算法名称,哈希值长度是256位 安全散列算法(Secure Hash Algorithm)SHA-1、SHA-224、SHA-256、SHA-384,和SHA-512是一系列
// hex 表示十六进制
// digest() 默认返回二进制结果 如果提供了encoding返回字符串 否则返回buffer digest以后不能多次调用hash对象,会引起错误
// HMAC 对象作为流的用法
// const hmac = crypto.createHmac('sha256', secret_key)
// hmac.on('readable', () => {
// // 哈希流只会生成一个元素。
// const data = hmac.read()
// if (data) {
// console.log(data.toString('hex'))
// }
// });
// hmac.write('Happy new Year')
// hmac.end()
// 公钥加密解密
// 公钥是用于创建只有私钥的拥有者能够读出的加密数据,以及对私钥的拥有者的签名进行验证
// 私钥是用于解密数据以及对数据进行签名
// 用Cipher加密
// 创建cipher对象
// AES-256-CBC: 高级加密标准 256秘钥长度 CBC模式
// AES加密数据块分组长度必须为128比特,密钥长度可以是128比特、192比特、256比特中的任意一个(如果数据块及密钥长度不足时,会补齐)
const password = '123456'
const data = '生下来活下去'
const aseEncode = function (data, password) {
const cipher = crypto.createCipher('aes192', password) // 创建cipher对象
let crypted = cipher.update(data, 'utf-8', 'base64') // update方法来指定需要被加密的数据, 如果第二个参数不指定的话,第一个参数只能是buffer对象,第三个参数是输出加密数据时候的编码格式,可选值为hex,binary,base64,不写返回存了加密数据的buffer对象
crypted += cipher.final('base64') // 在使用了cipher对象的final方法后,不能再向cipher对象中追加加密数据
return crypted
}
console.log(aseEncode(data, password))
const secret_data = 'e6b48f8237decd24a970186ad6ac998757f4b06490d32390dbd4081ee415a43d'
const aseDecode = function (data, password) {
const decipher = crypto.createDecipher('aes192', password)
let originData = decipher.update(data, 'base64', 'utf-8')
originData += decipher.final('utf-8')
return originData
}
console.log(aseDecode(secret_data, password))