面试题答案
一键面试1. 密钥生成
- 设计思路:RSA密钥生成基于大质数运算。选择两个大质数
p
和q
,计算n = p * q
,然后计算欧拉函数phi(n) = (p - 1) * (q - 1)
。选择一个与phi(n)
互质的整数e
作为公钥,通过扩展欧几里得算法计算出私钥d
,使得(e * d) % phi(n) == 1
。 - Python代码:
import random
from math import gcd
from Crypto.Util.number import getPrime
def generate_keypair(bits):
p = getPrime(bits)
q = getPrime(bits)
n = p * q
phi_n = (p - 1) * (q - 1)
e = random.randrange(1, phi_n)
while gcd(e, phi_n) != 1:
e = random.randrange(1, phi_n)
d = pow(e, -1, phi_n)
return ((e, n), (d, n))
2. 加密
- 设计思路:使用公钥
(e, n)
对消息m
进行加密,加密公式为c = m^e mod n
,其中c
是密文。 - Python代码:
def encrypt(message, public_key):
e, n = public_key
return pow(message, e, n)
3. 解密
- 设计思路:使用私钥
(d, n)
对密文c
进行解密,解密公式为m = c^d mod n
,其中m
是原始消息。 - Python代码:
def decrypt(ciphertext, private_key):
d, n = private_key
return pow(ciphertext, d, n)
4. 中间人攻击策略设计思路及代码实现
- 设计思路:中间人攻击(MITM)中,中间人(Mallory)拦截通信双方的公钥交换过程,用自己的公钥替换。当发送方(Alice)向接收方(Bob)发送消息时,Alice 使用 Mallory 的公钥加密,Mallory 截获密文后用自己的私钥解密得到消息,再用 Bob 的公钥加密后转发给 Bob。
- Python代码:
# 模拟中间人攻击
# 假设Alice和Bob通信,Mallory进行中间人攻击
alice_public, alice_private = generate_keypair(1024)
bob_public, bob_private = generate_keypair(1024)
mallory_public, mallory_private = generate_keypair(1024)
# Alice向Bob发送消息
message = 42
# Mallory拦截并替换公钥
ciphertext_to_mallory = encrypt(message, mallory_public)
# Mallory解密
decrypted_by_mallory = decrypt(ciphertext_to_mallory, mallory_private)
# Mallory用Bob的公钥重新加密并转发
ciphertext_to_bob = encrypt(decrypted_by_mallory, bob_public)
# Bob解密
decrypted_by_bob = decrypt(ciphertext_to_bob, bob_private)
print(f"Alice发送的消息: {message}")
print(f"Bob解密后的消息: {decrypted_by_bob}")
print(f"Mallory截获并解密的消息: {decrypted_by_mallory}")
在实际应用中,为了防止中间人攻击,通常使用数字证书和可信的认证机构来验证公钥的真实性。上述代码使用了 pycryptodome
库中的 getPrime
函数来生成大质数,在实际的网络安全场景中,还需要考虑更多的安全因素,如密钥管理、证书验证等。