非对称加密
1 非对称简介
非对称加密算法是一类加密算法,与对称加密算法不同,非对称加密算法使用一对密钥,分别是公钥和私钥。这两个密钥是相关联的,但是不同的密钥用于加密和解密。这种加密方式的主要优势在于安全性较高。
以下是非对称加密的基本概念和原理:
-
密钥对: 非对称加密使用一对密钥,包括公钥和私钥。公钥用于加密,私钥用于解密。
-
加密过程: 发送方使用接收方的公钥对消息进行加密。只有拥有相应私钥的接收方才能解密该消息。
-
解密过程: 接收方使用自己的私钥对收到的密文进行解密,还原成原始的明文。
-
安全性: 非对称加密的安全性建立在数学问题的难解性上。例如,RSA算法基于大数因子分解的难解性。即便知道了公钥和密文,要解密得到明文仍然需要私钥。
-
数字签名: 非对称加密也常用于生成数字签名。发送方使用私钥对消息进行签名,接收方使用发送方的公钥验证签名的真实性。
-
密钥交换: 非对称加密还可以用于密钥交换,例如Diffie-Hellman密钥交换算法。这种方法允许通信双方在不直接传输密钥的情况下共同生成一个共享的密钥。
-
计算复杂度: 与对称加密相比,非对称加密的计算复杂度较高,因此通常在对安全性要求较高的场景中使用。
常见的非对称加密算法包括RSA、DSA(数字签名算法)、ECC(椭圆曲线加密)等。这些算法在保障信息安全性和提供数字签名等方面发挥着重要作用。
注意:
- 使用时都是使用公钥加密使用私钥解密,公钥可以公开,私钥自己保留。
- 算法强度复杂、安全性依赖于算法与密钥但是由于其算法复杂,而使加密解密速度慢于对称加密
2 非对称特征
常见JavaScript调试算法
- 搜索关键词
new JSEncrypt()
,JSEncrypt
等,一般会使用JSEncrypt
库,会有 new 一个实例对象的操作; - 搜索关键词
setPublicKey
、setKey
、setPrivateKey
、getPublicKey
等,一般实现的代码里都含有设置密钥的过程。
RSA
的私钥、公钥、明文、密文长度也有一定对应关系,也可以从这方面初步判断:
私钥长度 | 公钥长度 | 明文长度 | 密文长度 |
---|---|---|---|
428 | 128 | 1~53 | 88 |
812 | 216 | 1~117 | 172 |
1588 | 392 | 1~245 | 344 |
2.1 JavaScript 实现
// 使用Crypto库进行RSA加解密
const crypto = require('crypto');
// 生成RSA密钥对
const { publicKey, privateKey } = crypto.generateKeyPairSync('rsa', {
modulusLength: 2048,
publicKeyEncoding: { type: 'spki', format: 'pem' },
privateKeyEncoding: { type: 'pkcs8', format: 'pem' }
});
// 明文消息
const plainText = 'Hello, RSA!';
// 加密
const encryptedBuffer = crypto.publicEncrypt(publicKey, Buffer.from(plainText, 'utf-8'));
const encryptedText = encryptedBuffer.toString('base64');
console.log('Encrypted:', encryptedText);
// 解密
const decryptedBuffer = crypto.privateDecrypt(privateKey, encryptedBuffer);
const decryptedText = decryptedBuffer.toString('utf-8');
console.log('Decrypted:', decryptedText);
2.2 Python 实现
# -*- coding: utf-8 -*-
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
# 生成RSA密钥对
key = RSA.generate(2048)
private_key = key.export_key()
public_key = key.publickey().export_key()
# 明文消息
plain_text = b'Hello, RSA!'
# 加密
cipher = PKCS1_OAEP.new(RSA.import_key(public_key))
encrypted_text = cipher.encrypt(plain_text)
print('Encrypted:', encrypted_text.hex())
# 解密
cipher = PKCS1_OAEP.new(RSA.import_key(private_key))
decrypted_text = cipher.decrypt(encrypted_text)
print('Decrypted:', decrypted_text.decode('utf-8'))