参考
初识公钥系统
加密解密
优点
一旦共享了公钥,Alice 就可以发送使用Bob的公钥加密过的消息给Bob,只有拥有Bob私钥的Bob本人才能对消息进行解密,而共享的公钥却可以被任何人获取,没有安全风险。
它减少了网络用户必须管理的密钥数,若是采用对称密码体制进行通信,那么用户必须为每一对通信连接保存独立的密钥,而采用非对称密码体制后,用户只需要记住他们自己的私钥,而可以从一些公共基础设施如 PKI处获取其他人的公钥。
结合
公钥加密系统与块加密法相比的一个主要问题是运算速度太慢了,而块加密法的主要问题在于:要在两个用户之间安全的传递对称密钥很难。因此可以把二者结合起来:假如Bob想给Alice发送一个大文件,可以先对文件进行AES加密,然后使用Alice的RSA公钥来加密AES密钥,这样Alice收到后可以利用自己的私钥解密,拿到AES密钥后进行对称解密,从而可以确保安全。
RSA
简介
RSA是一种非对称密码算法,它的安全性是基于大整数分解难题的。
密钥生成
- 随机找两个质数P和Q,PQ要保密且数字越大越安全。
- 计算乘积:N = P * Q。
- 计算乘积N的欧拉函数:f(N) = (P-1) * (Q-1)
- 随机选择一个整数e,要满足:1 < e < f(N),且e与 f(N) 互质。
- 计算 e 对于 f(N)的模反元素 d,即 d 需满足 1 < d < e,且 e * d mod f(N) = 1。
- 公钥为:(N, e),私钥为(N, d)。
安全性
由于 d 是私有的,只有 d 的拥有者才能解密。如果攻击者试图找出 d,就必须知道 P 和 Q,而唯一的方法是对 N 进行因子分解,如果P Q足够大的话,这个方法将是非常困难的。
ElGamal
简介
ElGamal公钥系统的安全性是基于求解离散对数问题的困难度的,与RSA相比,ElGamal算法即使是使用相同的私钥,对相同的明文进行加密,每次加密后得到的密文也各不相同,可以有效的防止重放攻击。
离散对数问题
给定一个素数 p,两个整数 a 和 b ,已知对于某些整数 x 有:b = a ^ x mod p成立,离散对数问题就是求解 x。
密钥生成
- 选择一个大素数p,通常建议 p-1 能被另外一个大素数整除.
- 计算出一个生成器数字 g,
- 选择一个小于 p-1 的随机数字 a,计算 b = g^a mod p。
- 公钥为:(p, g, b),私钥为:(p, a)
加解密
Bob要发送一条消息 m 给Alice,先找到Alice的公钥(p, g, b),然后选取一个随机密钥 k(k < p-1,且每个消息块需使用不同的数字k,否则不安全),Bob计算两个数,一个为C1 = g^k,另一个为C2 = m * b^k,将密文(C1, C2) 发给Alice即可。
Alice收到后,用自己的私钥 a 即可完成解密:
椭圆曲线加密法
椭圆曲线基础
椭圆曲线是由如下的方程定义的:
其中 p 为一个素数或 2 的幂,且满足 4 * a^3 + 27 * b^2 不等于 0。
典型的椭圆曲线如下图,曲线上坐标值为整数的点的数量是有限的。
定义一种在椭圆曲线上进行的加法运算:椭圆曲线上取两点 P 和 Q,直线PQ交椭圆曲线于点 R ,点 R 关于X轴的对称点 R’ 即为 P + Q 的运算结果,如图。
椭圆曲线离散对数问题
上文中的加法,当然也可被用于计算 P + P + P… = k P,如下分别是 2P 和 3P 的图像。
所谓椭圆曲线离散对数难题,即:给定两点 P 和 W ,已知 W = k * P,求 k 的值。
密钥生成
- 选择一条椭圆曲线及其上一点G。
- 选择一个保密数字k。
- 公钥为(G, kG),私钥为 k。
加解密
Bob给Alice发送消息时
- 将明文转换成数字m,并在曲线上找出一点P,满足P的横纵坐标差值为m。
- Bob选取一个随机数 r。
- 发送密文为 (r * G, P + r *kG)
- Alice收到后,用自己的私钥 k 乘以第一项,再用第二项减去这个结果,就可得到 P。