初夏小谈:基于RSA的大数文件加密系统

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秒不等.甚至超长时间。

查看解密后文件:

做这个项目目的:

由于当前互联网的高速发展,个人/公司隐私数据越来越被盗取。造成巨大损失。所以对个人或公司的数据进行加密变得异常重要。如各种账号密码等等。

                                                                                                                                      珍&源码

猜你喜欢

转载自blog.csdn.net/IT_xiaoQ/article/details/98478633