likes
comments
collection
share

加密解密“不能说的秘密”浅聊一下 你停止~收讯号嗷~我开始搜寻不呜到嗷~,之前和大家聊过,对称加密和非对称加密,有些掘友

作者站长头像
站长
· 阅读数 20

浅聊一下

对称加密

在之前提到,对称加密就是我们共同拥有一个密码本,我用密码本加密,你也用密码本解密... 我们使用到node的crypto来实现对称加密

crypto.createCipheriv()

crypto.createCipheriv()是一个用于创建加密算法的实例的函数,他接收三个参数algorithmkeyiv

  • 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 位长度。

加密

let encrypted = crypto.publicEncrypt(publicKey,Buffer.from('我开始搜寻不呜到嗷~'))

任何人都可以使用上面拿到的公钥来进行加密数据

解密

// 将公钥加密的密文用私钥解密
const dec = crypto.privateDecrypt(privateKey,encrypted)

来看看结果

加密解密“不能说的秘密”浅聊一下 你停止~收讯号嗷~我开始搜寻不呜到嗷~,之前和大家聊过,对称加密和非对称加密,有些掘友

暗号

突发奇想,能不能写一个加密解密的程序,拿去给掘友们的暧昧对象偷偷暗示说说心里话~~

转载自:https://juejin.cn/post/7387581121519681545
评论
请登录