当前位置 博文首页 > Scissors_初夏的博客:初夏小谈:基于RSA的大数文件加密系统

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

    作者:[db:作者] 时间:2021-08-16 12:53

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

    查看解密后文件:

    做这个项目目的:

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

    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 珍&源码

    cs