Crypto
介绍
出题人给定一个有一定缺陷的加密算法,需要选手攻破该加密算法,得到解密后的文字,或者伪造加密信息
密码学入门书籍:An introduction to mathematical cryptography
概念:明文,密文,密码算法,密钥,对称加密(同一密钥),非对称加密(加密用公钥,解密用密钥),哈希函数(单向映射),数字签名。
数学不太好,就简单写吧。
RSA
RSA算法是一种非对称加密算法,其基于大数分解的数学难题,其安全性依赖于大整数分解的计算复杂性。
代码示例
Python |
---|
| import random
from sympy import isprime, mod_inverse
# 生成大素数
def generate_large_prime(bits):
while True:
p = random.getrandbits(bits)
if isprime(p):
return p
# 密钥生成
def generate_keys(bits=1024):
# 选择两个大素数 p 和 q
p = generate_large_prime(bits)
q = generate_large_prime(bits)
# 计算它们的乘积 n
n = p * q
# 计算欧拉函数 φ(n)
phi = (p - 1) * (q - 1)
# 选择一个公钥指数 e,通常选择 65537
e = 65537
# 计算私钥指数 d,使得 d 是 e 关于 φ(n) 的模反元素
d = mod_inverse(e, phi)
# 返回公钥 (e, n) 和私钥 (d, n)
return (e, n), (d, n)
# 加密
def encrypt(public_key, plaintext):
e, n = public_key
# 将明文转换为整数 m
m = int.from_bytes(plaintext.encode(), 'big')
# 计算密文 c = m^e mod n
c = pow(m, e, n)
return c
# 解密
def decrypt(private_key, ciphertext):
d, n = private_key
# 计算明文整数 m = c^d mod n
m = pow(ciphertext, d, n)
# 将整数 m 转换回明文
plaintext = m.to_bytes((m.bit_length() + 7) // 8, 'big').decode()
return plaintext
# 示例使用
public_key, private_key = generate_keys()
plaintext = "Hello, RSA!"
# 使用公钥加密明文
ciphertext = encrypt(public_key, plaintext)
# 使用私钥解密密文
decrypted_text = decrypt(private_key, ciphertext)
print("原文:", plaintext)
print("密文:", ciphertext)
print("解密后:", decrypted_text)
|
RSA攻击手段
最容易想到的攻击手段是素数因子分解攻击,然而大多数情况下都不可能分解出一个特别大的n。
除此以外还有低加密指数攻击(e比较小时),共模攻击(密钥用了相同的n,不同的e),选择明密文攻击(能够使用已知明文加密,或能随意解密密文)等等。
RSA数字签名和一般的RSA略有不同,因为签名是使用私钥加密,用公钥解密,但依旧可以用以上手段攻击。
AES
AES(Advanced Encryption Standard,高级加密标准)是一种对称加密算法,用于保护电子数据。
AES的基本特性
对称加密 :AES使用相同的密钥进行加密和解密,这意味着加密和解密双方必须共享同一个密钥。
分组加密 :AES是一种分组加密算法,它将数据分成固定长度的块进行加密。常见的块大小为128位(16字节)。
密钥长度 :AES支持三种不同的密钥长度:128位、192位和256位。密钥长度越长,安全性越高,但加密和解密的速度也会稍慢。
AES攻击手段
AES有多种加密模式,因此攻击手段也十分丰富。
以CBC模式为例,常用的有Padding Oracle Attack(填充攻击)和Bit-Flipping Attack(字节反转攻击)。
ElGamal
ElGamal 是一种基于离散对数问题(DLP)的公钥加密算法,广泛用于加密和数字签名。
Wiki: ElGamal加密算法
破解的有些方法思维和RSA比较相似,但解决离散对数问题用的算法不同:BSGS算法、pohlig-hellman算法。