RSA加密系统背景:
由于对称式加密需要将对称加密算法发送给对方,而这可能会被对方截获,造成密钥泄露。所以如何安全传送加密规则成为了问题。由此出现了非对称式加密算法。其中最常用的RSA加密,其它有ElGamal算法。
RSA加密简介:
RSA加密算法就是甲方生成公钥和私钥,通过将公钥发送给需要通信的乙方,乙方用公钥对数据进行加密后发送给甲方,由于这个公钥只能由甲方的私钥解密,所以从而保证了数据的安全性传输。
RSA加密所用数学公式:
在计算公钥和私钥的过程中需要用到欧拉函数,欧拉函数是积性函数。
欧拉函数通用函数这样规定:
如果m,n互质,
如果m,n都为质数:
欧拉定理:如果两个正整数a和n互质,则n的欧拉函数 φ(n) 可以让下面的等式成立:
三等为数论中同余的意思:为a的欧拉函数n次方模上n为1.
RSA加密的具体过程:
公钥(e,n) 密文 = (明文 ^ e) % n
密钥(d,n) 明文 = (密文 ^ d) % n
破解RSA最大的难度在于如何分解公钥中的第二个数,它是由两个质数相乘得到。而这个数是超大时(比如一千位的数),变想因式分解变得极为困难。当前的计算机还无法破解这么大的数。
n是由两个质数的乘积构成。两个质数的选择一定要尽量的大。
1.首先生成两个质数x,y(这两个质数要尽量大,越大越难破解)
2.计算这两个质数x,y的乘积n
3.计算n的欧拉函数φ(n)。
4.在1<e<φ(n)中选择一个数,并且e与φ(n)互质
5.计算e相对于φ(n)的模反运算d。通过欧拉定理计算出私钥(de)modφ(n) =1
6.至此公钥(e,n),私钥(d,n)生成。
RSA优化:
1.对数据加/解密的优化
由于可能e,d非常大那么在加密解密时变得一旦次方变得非常大。这非常占我们的计算资源,并且可能导致溢出。导致数据加密失败。
所以势必针对此要进行优化,此时用到了同余定理:
两个数进行+/-计算后%x的值是和这两个数先%x后再进行+/-,后再%x的结果是一样的。
a^b % c
= (a * a * a……a)%c
= ((a%c)*(a%c)*(a%c)*……*(a%c))%c
= (a % c)^b % c
将e和d拆分为二进制数转换为十进制计算的方式,b(n)不是1就是0,这是因为二进制位上不是1就是0。
最终可以转化为:An就是b的二进制位为1的大小%c的值。
通过同余定理和二进制拆分将大数变小。时间复杂度由O(n)变为O(log n),因为每次拆分变为原来的一半。
2.计算私钥d时的优化:
通过模反运算计算私钥d时,通过一个一个的进行试探,时间复杂度为O(n)。这对小数当然没有问题,但是对于大数就无法忍受了。使用欧几里得算法对此进行优化。
int gcd(int a, int b)
{ if(b == 0)
return a;
return gcd(b, a%b);
}
扩展的欧几里得算法:不仅要求出(a,b)的最大公约数gcd,也要求出其中的一组解(x,y), 满足等式ax + by = gcd。从上 面的算法可知当b=0时,gcd即可求出,所以可以在求出gcd的同时也求出(x,y)。有时候我们得到的解x是一个负数,所以统一处理,可以直接进行操作: (x % b + b) % b。
3.RSA加密被破解的难度就在于通过公钥(e,n)来推出原来的p,q。只要n足够大。推导将变得不现实。
使用boost的大数加密。计算两质数的乘积,计算机一般方法已经无法计算。所以使用boost中的cpp_int来进行运算。
运算位数在128位,256位,512位,1024位的分类一种
生成大数随机数,用到boost中的random.hpp。生成随机大数就需要判断是不是素数。
普通的素数检测方法对于大数的效率太慢,大数的素性检测有专门的算法,比如fermat检测,Miller-Rabin等算法。 boost库中实现了Miller-Rabin方法。这种方法不能百分之百确定是素数有一定的误差。
测试加解密是否成功:
加密的源文件:
加密系统启动运行:
在生成两个素数时会等待6~10S之间,这个是由于系统随机生成一个在128位的超大数,并且要判断是否为素数,计算时间较长。
后面公钥私钥加密解密都会很快生成,当然加解密也是根据源文件的大小的,如果文件稍微过大像1M以上就比较慢持续加/解密30秒不等.甚至超长时间。
查看解密后文件:
做这个项目目的:
由于当前互联网的高速发展,个人/公司隐私数据越来越被盗取。造成巨大损失。所以对个人或公司的数据进行加密变得异常重要。如各种账号密码等等。
珍&源码