本文将通过crypto的api深入了解加密算法
安全加密
当发送方A向接收方B发送数据时,需要考虑的问题有:
1.数据的安全性。2.数据的完整性,即数据不被篡改。3.数据的真实性,即数据确实来自于发送方,传输过程中没有被替换。4.数据的不可否认性,即验证发送方确实发送了数据。保证安全性
对称密钥加密 Symmetric Encryption
对称密钥加密又叫专用密钥加密或共享密钥加密,即发送和接收数据的双方必使用相同的密钥对明文进行加密和解密运算。

流程
1.A 使用密钥加密数据2.A 将密文发送给 B3.B 收到密文后,使用相同的密钥对其进行解密,取得原始数据优点:速度快
缺点:密钥被盗就被破解、密钥管理不方便(每个用户都要对应一个密钥)
实现算法有:凯撒密码,AES(Advanced Encryption Standard)、DES(Data Encryption Standard)、动态口令等。
推荐:AES
AES加解密特点
分组长度是128bit,也就是16字节。
1.加密第一步,针对每个分组逐个字节的进行SubBytes的操作。笼统的说,就是每个字节根据256个值的替换表,将当前字节替换成另外一个字节。2.加密第二步,以单个字节为单位进行ShiftRows处理,就是将字节有规律的打乱。3.加密第三部,再以4字节为单位进行MixColumns处理,就是进行比特运算变成另外的4个字节。4.加密第四步,还是4字节为单位与轮密钥进行XOR运算。至此一轮运算就结束了。解密的过程就是加密的逆向过程。
分组密码的模式
对称密钥算法DES、AES都属于分组密码,分组密码的特点是分组的长度是固定的。但是由于明文的长度不固定且基本超过分组长度,所以就需要进行多轮的迭代加密。 模式就是指的多轮迭代的方式。
- ECB模式:Electronic CodeBook mode(电子密码本模式)* CBC模式:Cipher Block Chaining mode(密码分组链接模式)推荐使用* CFB模式:Cipher FeedBack mode(密文反馈模式)* OFB模式:Output FeedBack mode(输出反馈模式)* CTR模式:CounTeR mode(计数器模式)推荐使用### NodeJS示例:Cipher、Decipher
// 加密
const crypto = require("crypto");
const algorithm = "aes-192-cbc";
const password = "Password used to generate key";
// Use the async `crypto.scrypt()` instead.
const key = crypto.scryptSync(password, "salt", 24);
// Use `crypto.randomBytes` to generate a random iv instead of the static iv
// shown here.
const iv = Buffer.alloc(16, 0); // Initialization vector.
const cipher = crypto.createCipheriv(algorithm, key, iv);
let encrypted = cipher.update("some clear text data", "utf8", "hex");
encrypted += cipher.final("hex");
console.log(encrypted);
// Prints: e5f79c5915c02171eec6b212d5520d44480993d7d622a7c4c2da32f6efda0ffa
// 解密
const crypto = require("crypto");
const algorithm = "aes-192-cbc";
const password = "Password used to generate key";
// Use the async `crypto.scrypt()` instead.
const key = crypto.scryptSync(password, "salt", 24);
// The IV is usually passed along with the ciphertext.
const iv = Buffer.alloc(16, 0); // Initialization vector.
const decipher = crypto.createDecipheriv(algorithm, key, iv);
// Encrypted using same algorithm, key and iv.
const encrypted ="e5f79c5915c02171eec6b212d5520d44480993d7d622a7c4c2da32f6efda0ffa";
let decrypted = decipher.update(encrypted, "hex", "utf8");
decrypted += decipher.final("utf8");
console.log(decrypted);
// Prints: some clear text data
openssl list -cipher-algorithms 可以列出支持的加密算法
Cipher
类的创建
创建 Cipher
类可以使用crypto模块的 crypto.createCipher()
和 crypto.createCipheriv()
方法。OpenSSL推荐使用 pbkdf2
来替换 EVP_BytesToKey
,因此在创建 Cipher
类时,建议使用 crypto.pbkdf2
来派生 key
和 iv
,并使用 createCipheriv()
来创建加密流。
crypto.createCipher(algorithm, password)
:用给定的算法和密钥,创建并返回一个Cipher
加密算法的对象。参数:algorithm
算法是依赖OpenSSL库支持的算法, 例如:'aes192'
算法等,password
是用来派生key
和iv
的,它必须是一个'binary'
二进制格式的字符串或者是一个Buffer
。*crypto.createCipheriv(algorithm, key, iv)
:用给定的算法、密钥和向量,创建并返回一个Cipher
加密算法的对象。参数:algorithm
与createCipher
方法相同,key
密钥是一个被算法使用的原始密钥,iv
是一个