密码学
非对称加密
深入了解RSA、ECC等非对称加密算法的原理与应用
学习时间: 60分钟
挑战数量: 4个
难度级别: 高级
非对称加密概述
非对称加密(又称公钥加密)是现代密码学的重要组成部分,它使用一对密钥:公钥和私钥。公钥可以公开分享,而私钥必须保密。这种加密方式解决了对称加密中的密钥分发问题,为安全通信提供了更强大的解决方案。
非对称加密的基本原理
- 公钥与私钥对:每个用户生成一对数学上相关联的密钥
- 单向函数:基于数学难题(如大数分解、离散对数等)
- 加解密过程:使用一个密钥加密的信息只能用对应的另一个密钥解密
非对称加密的特点
- 保密性:使用接收者的公钥加密,只有拥有对应私钥的接收者才能解密
- 认证性:使用发送者的私钥签名,任何人都可以使用发送者的公钥验证
- 密钥分发简化:无需事先共享密钥即可建立安全通信
- 计算开销:相比对称加密,计算强度更高,速度更慢
- 密钥长度:通常需要更长的密钥才能达到同等的安全级别
常见的非对称加密算法
1. RSA (Rivest-Shamir-Adleman)
RSA是最广泛使用的非对称加密算法之一,基于大数因子分解问题的难解性:
- 密钥生成:选择两个大素数p和q,计算n=p×q和欧拉函数φ(n)=(p-1)(q-1)
- 公钥:(n, e),其中e与φ(n)互质
- 私钥:(n, d),其中d是e关于模φ(n)的乘法逆元
- 加密过程:C = M^e mod n,其中M是明文,C是密文
- 解密过程:M = C^d mod n
Python - RSA简单实现
import random
from math import gcd
def is_prime(n, k=5):
"""简单的Miller-Rabin素性测试"""
if n <= 1:
return False
if n <= 3:
return True
if n % 2 == 0:
return False
# 将n-1表示为2^r * d形式
r, d = 0, n - 1
while d % 2 == 0:
r += 1
d //= 2
# 进行k次测试
for _ in range(k):
a = random.randint(2, n - 2)
x = pow(a, d, n)
if x == 1 or x == n - 1:
continue
for _ in range(r - 1):
x = pow(x, 2, n)
if x == n - 1:
break
else:
return False
return True
def generate_prime(bits):
"""生成指定位数的素数"""
while True:
p = random.getrandbits(bits)
if p % 2 == 0:
p += 1
if is_prime(p):
return p
def mod_inverse(e, phi):
"""计算模乘法逆元"""
def extended_gcd(a, b):
if a == 0:
return b, 0, 1
else:
gcd, x, y = extended_gcd(b % a, a)
return gcd, y - (b // a) * x, x
gcd, x, y = extended_gcd(e, phi)
if gcd != 1:
raise Exception('模乘法逆元不存在')
else:
return x % phi
def generate_keypair(bits=1024):
"""生成RSA密钥对"""
p = generate_prime(bits // 2)
q = generate_prime(bits // 2)
n = p * q
phi = (p - 1) * (q - 1)
# 选择公钥指数e
e = 65537 # 常用值
# 计算私钥指数d
d = mod_inverse(e, phi)
return (n, e), (n, d)
def encrypt(public_key, message):
"""RSA加密"""
n, e = public_key
return pow(message, e, n)
def decrypt(private_key, ciphertext):
"""RSA解密"""
n, d = private_key
return pow(ciphertext, d, n)
# 示例使用
public_key, private_key = generate_keypair(bits=512) # 使用较小的位数便于演示
message = 12345
print(f"原始消息: {message}")
encrypted = encrypt(public_key, message)
print(f"加密后: {encrypted}")
decrypted = decrypt(private_key, encrypted)
print(f"解密后: {decrypted}")
2. ECC (椭圆曲线密码学)
ECC基于椭圆曲线上的离散对数问题,相比RSA,可以使用更短的密钥达到相同的安全级别:
- 基本原理:在椭圆曲线上定义点加法和标量乘法运算
- 密钥生成:选择曲线参数,随机选择私钥d,公钥Q = d×G(G为基点)
- 加密:通常使用ECIES(椭圆曲线集成加密方案)
- 优势:更短的密钥长度、更快的计算速度、更低的资源消耗
3. Diffie-Hellman密钥交换
不直接用于加密,但是非对称密码学的重要组成部分,允许双方在不安全的通道上安全地共享密钥:
- 基本原理:基于离散对数问题的难解性
- 过程:双方分别生成私钥,交换公钥信息,各自计算出相同的共享密钥
- 应用:TLS/SSL协议中的密钥协商
非对称加密的应用场景
1. 数字签名
使用私钥对消息的哈希值进行加密,生成签名,验证方使用对应的公钥验证签名:
- 消息完整性:确保消息在传输过程中未被篡改
- 身份认证:证明消息确实来自私钥持有者
- 不可否认性:签名者无法否认曾经签署过该文档
2. 安全通信
在安全通信协议如TLS/SSL中的应用:
- 混合加密系统:使用非对称加密交换会话密钥,然后使用对称加密进行数据传输
- 证书验证:验证服务器证书的真实性
3. 数字证书
由可信第三方(CA)签发的包含实体公钥的电子文档:
- 结构:包含实体信息、公钥、CA签名等
- 验证链:构建从用户证书到根证书的信任链
4. 安全通信协议
- HTTPS:加密的Web通信
- SSH:安全Shell协议
- S/MIME:安全电子邮件
- PGP:加密电子邮件和文件
非对称加密的安全考虑
常见攻击方法
- 因子分解攻击:针对RSA的密钥分解尝试
- 中间人攻击:攻击者截获并替换公钥
- 侧信道攻击:通过时间、功耗等非直接信息推断密钥信息
- 实现缺陷攻击:利用算法实现中的漏洞
- 量子计算威胁:未来量子计算机可能破解现有的非对称加密算法
防御策略
- 足够长的密钥:目前RSA建议至少2048位,ECC建议至少256位
- 安全随机数生成:确保密钥生成使用足够随机的熵源
- 正确实现:使用经过审核的密码库实现加密算法
- 证书验证:正确验证证书链和证书有效性
- 密钥管理:安全存储私钥,定期更新密钥
在CTF中的非对称加密挑战
CTF比赛中常见的非对称加密相关挑战包括:
- RSA参数攻击:弱密钥、公因子攻击、小指数攻击等
- 数学漏洞利用:利用数学原理中的特殊情况
- 实现漏洞:针对不正确实现的非对称算法的攻击
- 协议漏洞:密钥交换协议或签名验证协议中的漏洞