Alice和Bob的故事---非对称加密

非对称加密是一种公开密钥密码系统,要求密钥成对使用,即加密和解密分别由两个密钥来实现,每个用户都有一对密钥。典型的公开秘钥算法如RSA算法

应用

  1. 通过Linux 或者Mac 的Terminal使用ssh命令,登录远程主机(将公钥追加到authorized_keys,可以免密码登录)
  2. github网站,可以以ssh协议方式,上传下载(将自己的公钥交给github,然后自己保留对应的私钥,这样git push或者git pull不再需要输入密码)

角色

按照密码学惯例

人名角色
Alice所有协议的第一个参加者
Bob所有协议的第二个参加者
Mallory恶意的主动攻击者
Peggy证明人

简单说,如果Alice,使用非对称加密和Bob建立连接(登录),我们就可以认为,这种连接是安全的,即使加密后的密码被中途截获也无法破解出真正的密码。

有密码连接

  1. Bob收到Alice的请求,把自己的公钥发给Alice。
  2. Alice将密码用Bob的公钥加密后,发送给Bob。
  3. Bob用自己的私钥解密收到的加密内容,如果密码正确,那么连接成功。

中间人攻击

  1. 如果Mallory冒充Bob,截获了登录请求,并给Alice发一个自己伪造的公钥
  2. Alice把密码用Mallory的公钥加密后发送给Mallory
  3. Mallory用自己的私密解密,从而获取密码
  4. Mallory再用这个密码冒充Alice和Bob建立连接

解决方案

让Alice明确的知道要连接的人就是Bob,那么Bob可以让Peggy证明(在网站上将自己的公钥指纹贴出来),这样Alice在连接的时候,比对公钥指纹就能知道对方是不是真的Bob

无密码连接

  1. Alice将自己的公钥发给Bob保存
  2. Bob收到Alice的请求,然后向Alice发送一段随机字符串
  3. Alice用自己的私钥加密后,再发给Bob。
  4. Bob用事先储存Alice的公钥解密,如果字符串相同,就证明就是Alice,建立连接成功

文件

实际比如Linux Terminal使用ssh存在三种类型的文件,每台机器都可以具有它们。

  1. id_rsa.pub 和 id_rsa:保存每个角色各种的公钥,私钥
  2. known_hosts:保存一些可信赖的远程主机的公钥,如果连接的主机不在其中,那么会输出提示对方的公钥指纹,这个时候就需要权衡,如到网站看指纹是否正确,从而避免中间人攻击
  3. authorized_keys:保存被设置为免密码登录机器的公钥

总结

可以发现公钥即可以用于加密,也可以用于解密,私钥同样如此。连接双方都各自保存了对方的公钥,不过作用不一样

Happy Learning !!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一个比较复杂的加密程序,需要涉及到Diffie-Hellman密码协商、DES加密、MD5哈希值、数字签名等多个技术。下面我简单介绍一下实现思路: 1. 首先,AliceBob需要运行Diffie-Hellman密码协商协议来生成一个共享的密钥K。 2. Alice将自己的公钥发送给BobBob使用Alice的公钥生成一个对称密钥K1。 3. Alice将秘密信息M加密为C1,并使用MD5算法生成哈希值H1。 4. Alice使用自己的私钥对哈希值H1进行数字签名,生成签名值S1,并将C1、H1和S1一起发送给Bob。 5. Bob使用Alice的公钥验证签名值S1,并使用对称密钥K1解密C1得到M1。 6. Bob再次使用MD5算法生成哈希值H2,并与收到的H1进行比较,如果不一致则说明信息被篡改。 7. 如果哈希值一致,则Bob成功解密出了Alice发送的秘密信息M。 下面是一个简单的Python实现: ```python import random import hashlib from Crypto.Cipher import DES # Diffie-Hellman密码协商 def diffie_hellman(p, g, a, b): A = pow(g, a, p) B = pow(g, b, p) K = pow(B, a, p) return K # 生成一个DES加密密钥 def generate_key(): key = '' for i in range(8): key += chr(random.randint(0, 255)) return key # 加密 def encrypt(key, data): cipher = DES.new(key, DES.MODE_ECB) return cipher.encrypt(data) # 解密 def decrypt(key, data): cipher = DES.new(key, DES.MODE_ECB) return cipher.decrypt(data) # 计算MD5哈希值 def hash(data): h = hashlib.md5() h.update(data) return h.hexdigest() # 数字签名 def sign(private_key, data): h = hash(data) signature = pow(int(h, 16), private_key, p) return signature # 验证签名 def verify(public_key, signature, data): h = hash(data) left = pow(public_key, signature, p) right = int(h, 16) return left == right # 生成素数 def generate_prime(): prime = 0 while True: prime = random.randint(1000, 10000) if is_prime(prime): break return prime # 判断是否是素数 def is_prime(n): if n <= 1: return False for i in range(2, int(n ** 0.5) + 1): if n % i == 0: return False return True # 主程序 if __name__ == '__main__': # 生成素数p和本原根g p = generate_prime() g = random.randint(2, p-2) print('p =', p) print('g =', g) # AliceBob分别生成私钥和公钥 a = random.randint(2, p-2) b = random.randint(2, p-2) A = pow(g, a, p) B = pow(g, b, p) # AliceBob运行Diffie-Hellman密码协商协议生成共享密钥K K = diffie_hellman(p, g, a, b) print('K =', K) # Alice将自己的公钥发送给Bob print('Alice -> Bob: A =', A) # Bob使用Alice的公钥生成对称密钥K1 K1 = pow(A, b, p) print('K1 =', K1) # Alice将秘密信息M加密为C1,并使用MD5算法生成哈希值H1 M = 'Hello, Bob!' key = generate_key() C1 = encrypt(key, M.encode()) H1 = hash(M.encode()) # Alice使用自己的私钥对哈希值H1进行数字签名,生成签名值S1 d = random.randint(2, p-2) private_key = d public_key = pow(g, d, p) S1 = sign(private_key, H1.encode()) # Alice将加密后的信息C1、哈希值H1和签名值S1发送给Bob print('Alice -> Bob: C1 =', C1) print('Alice -> Bob: H1 =', H1) print('Alice -> Bob: S1 =', S1) # Bob使用Alice的公钥验证签名值S1,并使用对称密钥K1解密C1得到M1 if verify(public_key, S1, H1.encode()): M1 = decrypt(key, C1).decode() print('Bob received:', M1) else: print('Signature verification failed!') ``` 这个程序中使用了Python标准库中的gmp库来生成素数,使用了pycryptodome库中的DES模块来进行加密和解密,使用了hashlib库中的md5函数来计算哈希值。如果要使用Socket编程建立AliceBob的通信连接,可以将上述代码分别放在两个程序中,然后使用Socket编程来实现通信。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值