加密, 算法
现代加密算法解析:类型、特征与实现
YunHai
··33 分钟阅读加密算法是信息安全领域的基础工具,其核心目标是通过数学方法将明文数据转换为不可读的密文,防止未经授权的访问。可以类比为数字世界的"保险箱"——只有持有正确密钥的人才能打开。
关键价值:保障数据机密性、完整性与身份认证,是互联网安全的基石。
对称加密算法
核心原理
对称加密使用单一密钥完成加密与解密,如同使用同一把钥匙开锁。其优势在于加密效率高(适合大数据量),但缺点是密钥分发存在安全隐患。
常见算法对比
| 算法名称 | 密钥长度 | 分组长度 | 安全性 | 适用场景 |
|---|---|---|---|---|
| AES | 128/192/256位 | 128位 | ★★★★★ | 金融交易、云存储 |
| SM4 | 128位 | 128位 | ★★★★★ | 中国政务系统 |
| ChaCha20 | 256位 | 流式加密 | ★★★★☆ | TLS协议、移动设备 |
| 3DES | 168位 | 64位 | ★★☆ | 遗留系统迁移 |
Python实现AES加密
pythonfrom Crypto.Cipher import AES
from Crypto.Util.Padding import pad
def aes_encrypt(plaintext, key):
cipher = AES.new(key, AES.MODE_CBC)
ciphertext = cipher.encrypt(pad(plaintext.encode(), AES.block_size))
return cipher.nonce + ciphertext # 返回IV+密文JavaScript实现ChaCha20加密
javascriptconst chacha20 = require('chacha20');
const key = Buffer.from('1234567890abcdef1234567890abcd', 'hex');
const nonce = Buffer.from('0123456789ab', 'hex');
const plaintext = Buffer.from('敏感数据');
const ciphertext = chacha20.encrypt(key, nonce, plaintext);
console.log('密文:', ciphertext.toString('hex'));⚠️ 注意事项:
- AES需严格管理IV(初始化向量),避免重复使用
- ChaCha20的nonce必须唯一,否则会破坏安全性
非对称加密算法
核心原理
非对称加密使用公钥加密、私钥解密,如同银行U盾认证。解决了密钥分发难题,但计算开销大(适合小数据加密)。
常见算法对比
| 算法名称 | 密钥长度 | 安全性 | 适用场景 |
|---|---|---|---|
| RSA | 2048/4096位 | ★★★★☆ | 数字证书、API签名 |
| ECC | 256/521位 | ★★★★★ | 移动端、物联网 |
| ElGamal | 可变 | ★★☆ | 学术研究 |
JavaScript实现RSA签名
javascriptconst { sign, verify } = require('crypto');
const fs = require('fs');
// 创建签名
const signData = sign('sha256', Buffer.from('message'), {
key: fs.readFileSync('private.pem'),
padding: 'RSA_PKCS1_V1_5'
});Python实现ECC验证
pythonfrom ecdsa import SigningKey, VerifyingKey
private_key = SigningKey.generate(curve='NIST256p')
public_key = private_key.get_verifying_key()
signature = private_key.sign(b'message')
# 验证签名
public_key.verify(signature, b'message') # 返回True表示成功⚠️ 注意事项:
- RSA密钥长度需≥2048位,否则易受暴力破解
- ECC推荐使用P-256以上曲线(NIST标准)
哈希算法
核心原理
哈希算法是单向不可逆的"指纹生成器",如同身份证号码的唯一性。用于数据完整性校验、密码存储等场景。
常见算法对比
| 算法名称 | 输出长度 | 安全性 | 适用场景 |
|---|---|---|---|
| SHA-256 | 256位 | ★★★★★ | 区块链、数字签名 |
| SHA3-256 | 256位 | ★★★★☆ | 后量子密码学过渡 |
| MD5 | 128位 | ★☆ | 文件校验(非安全) |
Python实现SHA-3哈希
pythonimport hashlib
def sha3_hash(data):
sha3 = hashlib.sha3_256()
sha3.update(data.encode('utf-8'))
return sha3.hexdigest()
print(sha3_hash("HelloWorld")) # 输出64位十六进制字符串⚠️ 注意事项:
- MD5/SHA-1已被证明可碰撞,禁止用于安全场景
- 密码存储建议使用PBKDF2或Argon2(带盐值的哈希)
国密算法详解
什么是国密算法?
国密(GuoMi)是中国国家密码管理局制定的商用密码算法标准,是中国信息安全领域的核心规范。其目标是通过自主可控的密码算法体系,保障关键信息基础设施的安全。国密算法包含以下三类核心标准:
- SM2:非对称加密算法(基于椭圆曲线)
- SM3:哈希算法(256位输出)
- SM4:对称加密算法(128位分组)
类比理解:国密算法如同中国的"数字长城",在金融、政务、物联网等领域强制使用,确保数据主权安全。
SM4 对称加密算法
核心特性
- 分组长度:128位
- 密钥长度:128位
- 安全性:等效AES-128,通过国家密码管理局认证
- 应用场景:金融IC卡、政务系统、国产化设备通信
Python实现SM4加密
pythonfrom sm4 import SM4
def sm4_encrypt(plaintext, key):
cipher = SM4.new(key, SM4.MODE_CBC)
padded = plaintext.encode() + b'\x00' * (16 - len(plaintext) % 16)
return cipher.encrypt(padded)JavaScript实现SM4加密
javascriptconst sm4 = require('sm-crypto').sm4;
const key = '1234567890abcdef'; // 16字节密钥
const encrypted = sm4.encrypt('敏感数据', key);
console.log('SM4密文:', encrypted);⚠️ 注意事项:
- SM4需使用16字节(128位)密钥
- 推荐使用CBC模式时,IV需随机且唯一
SM2 非对称加密算法
核心特性
- 基础:基于椭圆曲线密码学(ECC)
- 密钥长度:256位
- 功能:支持加密、数字签名、密钥交换
- 应用场景:中国电子政务系统、金融IC卡身份认证
Python实现SM2签名
pythonfrom gmssl import sm2
def sm2_sign(message, private_key):
signer = sm2.CryptSM2(private_key=private_key, is_padding=True)
return signer.sign(message.encode())
# 示例私钥(需实际使用中生成)
private_key = '00B97D41C5A2D1A8B7D7E6F3C8D9A2B1C3D4E5F6A7B8C9D0E1F2A3B4C5D6E7'
signature = sm2_sign("国密签名", private_key)
print("SM2签名:", signature.hex())JavaScript实现SM2加密
javascriptconst { sm2 } = require('sm-crypto');
const publicKey = '040123456789ABCDEF...'; // 公钥(33字节)
const encrypted = sm2.encrypt(publicKey, '需要加密的数据');
console.log('SM2密文:', encrypted);⚠️ 注意事项:
- SM2使用NIST P-256曲线的中国变体
- 私钥需严格保密,公钥可公开
SM3 哈希算法
核心特性
- 输出长度:256位(32字节)
- 安全性:抗碰撞强度等同SHA-256
- 应用场景:电子政务系统、区块链(如中国央行数字货币)
Python实现SM3哈希
pythonfrom gmssl import sm3
def sm3_hash(data):
return sm3.sm3_hash(data.encode())
print("SM3哈希:", sm3_hash("国密哈希测试"))JavaScript实现SM3哈希
javascriptconst sm3 = require('sm-crypto').sm3;
console.log("SM3哈希:", sm3('需要计算的数据'));⚠️ 注意事项:
- SM3输出为64位十六进制字符串
- 适用于数字签名、数据完整性校验
国密算法与其他算法对比
| 算法类型 | 代表算法 | 密钥长度 | 安全性 | 适用场景 | 国密标准 |
|---|---|---|---|---|---|
| 对称加密 | AES-256 | 256 bit | ★★★★★ | 大数据加密 | ❌ |
| 对称加密 | SM4 | 128 bit | ★★★★☆ | 金融IC卡、政务系统 | ✅ |
| 非对称加密 | RSA-2048 | 2048 bit | ★★★★☆ | 密钥交换 | ❌ |
| 非对称加密 | SM2 | 256 bit | ★★★★☆ | 中国电子政务 | ✅ |
| 哈希算法 | SHA-256 | 256 bit | ★★★★★ | 数据完整性校验 | ❌ |
| 哈希算法 | SM3 | 256 bit | ★★★★☆ | 中国央行数字货币 | ✅ |
国密算法的实际应用
1. 金融IC卡
- SM4用于芯片加密存储
- SM2用于终端身份认证
2. 政务系统
- SM2用于电子政务证书
- SM3用于电子文件签名
3. 物联网设备
- SM4用于设备间通信加密
- SM2用于设备身份认证
案例:中国央行数字货币(DC/EP)使用SM2签名和SM3哈希确保交易不可篡改。
国密算法的开发支持
Python库
gmssl:官方推荐国密算法库pysm:第三方SM2/SM3/SM4实现
JavaScript库
sm-crypto:支持SM2/SM3/SM4的加密库node-gm:Node.js环境下的国密算法支持
常见问题
1. 为什么需要国密算法?
- 数据主权:避免依赖国外算法(如RSA、AES)
- 政策要求:中国《网络安全法》强制金融、政务系统使用国密
- 抗量子过渡:国密算法已纳入NIST后量子密码学研究范围
2. 如何选择国密算法?
- 对称加密:SM4(等效AES-128)
- 非对称加密:SM2(等效ECC-256)
- 哈希算法:SM3(等效SHA-256)
3. 国密算法的性能如何?
- SM4:加密速度略低于AES(约快10%)
- SM2:签名速度接近ECC(约慢20%)
- SM3:哈希速度与SHA-256相当
加密算法对称加密非对称加密哈希算法信息安全国密