加密解密“不能说的秘密”浅聊一下 你停止~收讯号嗷~我开始搜寻不呜到嗷~,之前和大家聊过,对称加密和非对称加密,有些掘友
浅聊一下
对称加密
在之前提到,对称加密就是我们共同拥有一个密码本,我用密码本加密,你也用密码本解密...
我们使用到node的crypto
来实现对称加密
crypto.createCipheriv()
crypto.createCipheriv()是一个用于创建加密算法的实例的函数,他接收三个参数algorithm
、key
、iv
- algorithm:algorithm是一个加密算法,决定如何加密
- key:key如其名,就是一把钥匙可以打开加密的内容
- iv:iv 用于确保每次加密相同的明文时,产生的密文是不同的。这是因为在相同的密钥下,如果没有变化的 IV,相同的明文每次加密结果将是一样的,这可能泄露出明文的一些信息或者导致安全问题。
如果我们使用一个随机的iv
看,加密了
4444
三次产生的编码都不一样
// 导入 crypto模块
const crypto = require('node:crypto')
// 生成一个32位加密密钥
let key = crypto.randomBytes(32)
// 生成16位的iv
let iv = crypto.randomBytes(16)
// 生成加密算法实例
const cipher = crypto.createCipheriv('aes-256-cbc',key,iv)
现在我们就拿到加密算法的实例对象了...
加密
现在开始加密
//创建加密器
const cipher = crypto.createCipheriv('aes-256-cbc', key, iv);
let encrypted = cipher.update('你停止~收讯号嗷~', 'utf8', 'hex');
encrypted += cipher.final('hex');
-
'你停止~收讯号嗷~' : 这是要加密的明文数据,以字符串形式提供。在
'utf8'
编码下,它被视为 UTF-8 编码的文本数据。 -
'utf8' : 这是明文数据的编码格式。Node.js 中支持多种编码格式,例如
'utf8'
、'ascii'
、'base64'
等。 -
'hex' : 这是指定输出密文的编码格式。
'hex'
表示输出的密文将以十六进制字符串的形式返回,方便存储和传输。
update()
使用 update()
方法可以处理数据的分块加密或解密。它接收三个参数:
cipher.update(data, inputEncoding, outputEncoding);
-
data: 要加密或解密的数据,可以是字符串、Buffer 或 TypedArray。
-
inputEncoding (可选): 指定输入数据的编码格式,例如
'utf8'
、'ascii'
、'hex'
等。如果是 Buffer 或 TypedArray,可以省略此参数。 -
outputEncoding (可选): 指定输出数据的编码格式,例如
'hex'
、'base64'
等。默认为'buffer'
,返回 Buffer 对象。
在这里cipher.update()将data以UTF-8 编码加密成十六进制的字符串 ('hex'
编码)
final()
在加密和解密的最后阶段,需要调用 final()
方法来结束加密或解密操作,并获取最终的加密数据或解密结果。它接收一个参数
cipher.final(outputEncoding);
解密
加密完就该解密了
const decipher = crypto.createDecipheriv('aes-256-cbc', key, iv);
let decrypted = decipher.update(encrypted, 'hex', 'utf8');
decrypted += decipher.final('utf8');
console.log('解密后的数据:', decrypted);
看清楚哦,解密创建的解密算法实例对象是使用crypto.createDecipheriv()
接下来就使用上面提到的update()
,final()
方法就可以得到解密后的内容了
非对称加密
非对称加密就是我有一个公开的公钥,任何人都可以用它来加密数据,但是只能用我的私钥来解开
//创建 公钥 和 私钥
const {privateKey,publicKey} = crypto.generateKeyPairSync('rsa',{
modulusLength:2048,
})
crypto.generateKeyPairSync(algorithm, options)
:这个方法用于生成公钥和私钥对。
-
algorithm: 指定生成密钥对使用的算法,这里选择
'rsa'
,表示使用 RSA 算法。 -
options: 是一个对象,包含生成密钥对的选项。
- modulusLength: RSA 模数的长度,以位为单位。通常以 1024、2048 或 4096 位长度选择,决定了密钥的安全性和加密速度。在这个例子中,选择了
2048
位长度。
- modulusLength: RSA 模数的长度,以位为单位。通常以 1024、2048 或 4096 位长度选择,决定了密钥的安全性和加密速度。在这个例子中,选择了
加密
let encrypted = crypto.publicEncrypt(publicKey,Buffer.from('我开始搜寻不呜到嗷~'))
任何人都可以使用上面拿到的公钥来进行加密数据
解密
// 将公钥加密的密文用私钥解密
const dec = crypto.privateDecrypt(privateKey,encrypted)
来看看结果
暗号
突发奇想,能不能写一个加密解密的程序,拿去给掘友们的暧昧对象偷偷暗示说说心里话~~
转载自:https://juejin.cn/post/7387581121519681545