ElGamal是个啥子玩意
很早之前就听说ElGamal加密算法是一种公钥密码,但是具体实现和用途不甚了解,今天阅读了
A PUBLIC KEY CRYPTOSYSTEM AND A SIGNATURE SCHEME BASED ON DISCRETE LOGARITHMS
一文,故去了解了一下。特开此文,记录一下
省流:ElGamal是DH密钥交换的抵抗中间人攻击版本
ElGamal加密算法是一个基于DH密钥交换的非对称算法,可以定义在任何循环群上,它的安全性取决于循环群上的离散对数难题
离散对数问题指的是:
- 已知
,计算 是简单的。 - 已知
,计算 是困难的。
Diffie-Hellman 密钥交换过程:
- Alice 和 Bob选定一个素数
,以及它的一个原根 - Alice 选择一个密钥
,计算 ,发给 Bob - Bob 选择一个密钥 bb ,计算
,发给 Alice - Alice 计算
,Bob 计算 这样,Alice 和 Bob 就共享了一个密钥
通俗理解:在调色板上将两种颜色混合容易,而将两种颜色分开是困难的。
由于离散对数问题是一个数学困难问题,在选择了合适的
DH 本身没有提供任何身份认证,因此容易遭受中间人攻击:
- 中间人 Eve 假装自己是 Bob 与 Alice 通信
- 中间人 Eve 假装自己是 Alice 与 Bob 通信
- Eve 将 Alice 发来的消息用
解密,使用 加密,发送给 Bob - Eve 将 Bob 发来的消息用
解密,使用 加密,发送给 Alice - Alice 和 Bob 对此一无所知,还无知地以为在与对方通信
需要一种能验证通信双方身份的机制 (如签名) 来防止这类攻击
ElGamal 加密算法:
本质上就是用 DH 获得一个密钥,然后用它加解密消息。
密钥生成:
- Alice 和 Bob 选定一个素数
,以及它的一个原根 - Alice 选择一个私钥
,计算公钥 ,公开 - Bob 选择一个私钥
,计算公钥 ,公开
假如 Bob 要给 Alice 发送一条消息
- Bob 计算密钥
- Bob 发送
Alice 收到密文,解密过程:
- Alice 计算密钥
- Alice 解密消息
实现代码:
1 | from Crypto.Util.number import * |