RSA密码算法的C/C++编程实现

这篇具有很好参考价值的文章主要介绍了RSA密码算法的C/C++编程实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

课程设计要求:

编写RSA算法的加解密程序,运行并验证。

(1)编程实现判断整数为素数和求模逆及模幂的算法:对于随机产生的一个正整数,使用Miller-Rabin素性检验算法判断输入的整数是否为素数;输入两个正整数,使用扩展的欧几里德算法判断两个整数互素并求出一个整数关于另一个整数的逆元;输入指数、底数和模数,使用快速指数算法完成模幂运算。

(2)将(1)中的算法整合实现RSA加解密算法:完成p和q的选取,公私钥的产生,以及对输入明文的加密和对密文的解密。

(3)要求实验报告中有对应的原理概述、算法分析、程序设计过程(包含调试记录)、程序源代码、程序验证记录和程序设计总结。

实验条件:

(1)主要设备: 586或更高机型,256MB或更高的内存,40G或更大的硬盘。

(2)主要软件:

①操作系统可为Windows9X、WinMe、Win2000或更高版本等;

②开发环境为VC++6.0或者TC++3.0。

(3)参考书目:

①《现代密码学》杨波编著 清华大学出版社

实验三个主要准备内容:

实验在进行之前,我们先对这三个知识进行了学习,了解了RSA编程的思想,之后开始编程实践。

1)欧几里得算法求最大公约数

欧几里得算法又称辗转相除法,是指用于计算两个非负整数a,b的最大公约数。应用领域有数学和计算机两个方面。计算公式gcd(a,b) = gcd(b,a mod b)。算法的的基本步骤如下:

①给定两正整数m,n

②选取其中较小的数,假定为m

③若n%m非0,即存在余数,将n和m中较大的数n替换为余数,返回②

④若n%m为0,则最大公约数为m

2)Miller-Rabin素性概率检测法

素性测试(即测试给定的数是否为素数)是近代密码学中的一个非常重要的课题。虽然Wilson定理(对于给定的正整数n,n是素数的充要条件)给出了一个数是素数的充要条件,但根据它来素性测试所需的计算量太大,无法实现对较大整数的测试。目前,尽管高效的确定性的素性算法尚未找到,但已有一些随机算法可用于素性测试及大整数的因数分解。Miller-Rabin素性测试算法就是一个这样的算法。

Miller-Rabin素性测试算法的核心为费马小定理:

假如a是整数,p是质数,且a,p互质(即两者只有一个公约数1),那么a的(p-1)次方除以p的余数恒等于1。逆推⼀下即p的 a^(p-1)%p !=1 (0<a<p) ,它⼀定是合数。如果 a^(p-1)%p ==1 (0<a<p) 则它可能是合数可能是素数。为了排除强伪素数的存在,用二次探测定理以确保该数为素数:如果p是一个素数,0<x<p,则⽅程x^2≡1(mod p)的解为x=1,p-1。

3)RSA算法

RSA公开密钥密码体制是一种使用不同的加密密钥与解密密钥,“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制。

c++ rsa加密,密码学,算法,c语言,c++,密码学

实验方法与步骤:

c++ rsa加密,密码学,算法,c语言,c++,密码学

算法分析:

c++ rsa加密,密码学,算法,c语言,c++,密码学 

代码如下:

#include <stdio.h>  

#include<windows.h>

#include <iostream>

#include <vector>

#include <string.h>

#include<cstdio>

#include<cstring>

#include<algorithm>

using namespace std;

int prime[10]={2,3,5,7,11,13,17,19,23,29};

_int64 Quick_Multiply(int a,int b,int c)  //快速积(和快速幂差不多)

{

    long ans=0,res=a;

    while(b)

    {

        if(b&1)

          ans=(ans+res)%c;

        res=(res+res)%c;

        b>>=1;

    }

    return (int)ans;

}

int Quick_Power(int a,int b,int c)     //快速幂

{

    int ans=1,res=a;

    while(b)

    {

        if(b&1)

          ans=Quick_Multiply(ans,res,c);

        res=Quick_Multiply(res,res,c);

        b>>=1;

    }

    return ans;

}

bool Miller_Rabin(int x)     //判断素数

{

    int i,j,k;

    int s=0,t=x-1;

    if(x==2)  return true;   //2是素数

    if(x<2||!(x&1))  return false;     //如果x是偶数或者是0,1,那它不是素数

    while(!(t&1))  //将x分解成(2^s)*t的样子

    {

        s++;

        t>>=1;

    }

    for(i=0;i<10&&prime[i]<x;++i)      //随便选一个素数进行测试

    {

        int a=prime[i];

        int b=Quick_Power(a,t,x);      //先算出a^t

        for(j=1;j<=s;++j)    //然后进行s次平方

        {

            k=Quick_Multiply(b,b,x);   //求b的平方

            if(k==1&&b!=1&&b!=x-1)     //用二次探测判断

              return false;

            b=k;

        }

        if(b!=1)  return false;   //用费马小定律判断

    }

    return true;   //如果进行多次测试都是对的,那么x就很有可能是素数

}

//n大于a

int Euclid(_int64 a, _int64 n){

    _int64 x, y, r, c;

    x = n; y = a;

    for (int i = 0;;){

        if (y == 0)

            return x;

        if (y == 1)

            return y;

        c=int(x/y);

r=x-c*y;

        x = y;

        y = r;

    }

}

_int64 extenEuclid (_int64 a,_int64 b,int &x,int &y) { //用递归算法实现

    if (b == 0) {

        x = 1, y = 0;

        return a;

    }

    int r = extenEuclid(b, a % b, y, x);

    y -= (a / b) * x;

    return r;

}

int main()

{

int x1,y1,q,p;

printf("请输入p:");

scanf("%ld",&p);

while(!Miller_Rabin(p))//用Miller_Rabin判断p是否为素数

{

printf("输入的p不是素数,请重新输入p:");

scanf("%ld",&p);

}

printf("请输入q:");

scanf("%ld",&q);

while(!Miller_Rabin(q))

{

printf("输入的q不是素数,请重新输入q:");

scanf("%d",&q);

}

    _int64 n1,fn1;

   n1 = p*q; fn1 = (q - 1)*(p - 1);//选e与fn互素

   printf("n1 = p*q=%d\n",n1);

   printf("fn1 = (p-1)*(q-1)=%d\n",fn1);

    int e1,d1;

    for (e1 = 2; e1<fn1; e1 += 1){

        if (Euclid(e1, fn1) == 1)//fn与e互素

            break;

    }

    d1 = (extenEuclid (e1, fn1, x1, y1) == 1 ? (x1 % fn1 + fn1) % fn1 : -1);//用拓展的Euclid算法求私钥d

while(d1<0)//保证d是大于0的数

{

d1=d1+n1;

}

//以n, e为公钥, 私钥为d

printf("e1=%d\n",e1);

printf("d1=%d\n",d1);

//对输入明文进行加密  a^k=b(mod m)

        _int64 m1;

printf("请输入明文m(数字):");

scanf("%ld",&m1);

_int64 c1=Quick_Power(m1,e1,n1);

 printf("密文为:%d\n",c1);

     //对输入密文进行解密

 _int64 m2,c2;

printf("请输入密文c(数字):");

scanf("%ld",&c2);

    m2=Quick_Power(c2,d1,n1);

 printf("明文为:%ld\n",m2);   

       return 0;

}

c++ rsa加密,密码学,算法,c语言,c++,密码学

c++ rsa加密,密码学,算法,c语言,c++,密码学

实验总结:

RSA算法是一种用数论构造的也是迄今为止理论上最为成熟完善的公钥密码体制。该算法分为三步密钥的产生、加密、解密。

密钥的产生:

c++ rsa加密,密码学,算法,c语言,c++,密码学

本次实验可谓是收获颇多,了解到了RSA算法的基本过程,用Miller-Rabin算法判断检验p和q是否为素数,其中还用到了费马小引理,对于指数的问题,可采用快速指数算法求解。在这个过程中也遇到了诸多的问题,比如VC6.0++中没有long long这个类型使用int类型会过小,会出现溢出错误,后查阅资料可用_int64来扩大数的选取范围; 求逆元d时会出现d为负数的情况,不能用快速指数算法。对于本次实验实现的算法仍有不足之处,比如整数e的选取并不能达到随机选取,希望后续能将此算法进行改进,能够更加优化实现。

RSA算法属于非对称加密算法的一种,也是目前世界上最重要的加密算法。我们学习该算法时,发现在书面上实现较为容易。而再将其写为代码的过程中,我们遇到了一定的困难。

首先是利用Miller-Rabin素性检验算法判断输入的整数是否为素数,我们对该算法不够了解,故而在代码上始终存在问题。经过不断的学习、查找资料,并辅以网站的学习视频,终于解决了该问题,而在这个过程中,我们也收获颇多。

后来,我们在返回e和d的过程中也出现了各种奇怪的问题,比如:明明写了限制条件,使得d>0,但是最终返回的d还是为负数,我们不思其解,通过不断翻阅资料以及不断调试程序,我们试着将变量的取值范围扩大,最终解决了这个问题。

在之后,在扩展的欧几里得算法初,明明算法是正确的,但是返回的结果明显错误。我们试着修改算法,却发现结果仍错误,突然,我们发现了关键所在:返回值不对。算法并没有问题,只是返回值不对。这也让我们意识到我们仍需加强对基础知识的学习。

经过本次实验,我们对RSA算法有了更深的认识和了解。收获良多。

若有侵权请联系删除。如有疑问,欢迎私信。文章来源地址https://www.toymoban.com/news/detail-755670.html

到了这里,关于RSA密码算法的C/C++编程实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【北京航空航天大学】【信息网络安全实验】【实验一、密码学:DES+RSA+MD5编程实验】

    【北京航空航天大学】【信息网络安全实验】【实验一、密码学:DES+RSA+MD5编程实验】

    1. 通过对DES算法的代码编写,了解分组密码算法的设计思想和分组密码算法工作模式; 2. 掌握RSA算法的基本原理以及素数判定中的Rabin-Miller测试原理、Montgomery快速模乘(模幂)算法,了解公钥加密体制的优缺点及其常见应用方式; 3. 掌握MD5算法的基本原理,了解其主要应用

    2024年02月19日
    浏览(16)
  • RSA 加密算法在C++中的实现 面向初学者(附代码)

    博文的 一,二部分 为 基础知识 的铺垫。分别从 密码学,数论 两个方面为理解RSA算法做好了准备。 第三部分 是对RSA加密过程的具体介绍,主要涉及其 密钥对(key-pair)的获取 。前三个部分与编程实践无关,可以当作独立的关于RSA加密算法的介绍。 第四部分 开始介绍在 编

    2024年01月21日
    浏览(46)
  • RSA加密算法Python实现

    RSA加密算法Python实现

    1977年,三位数学家 Rivest、Shamir 和 Adleman 设计了一种算法,可以实现非对称加密。这种算法用他们三个人的名字命名,叫做RSA算法.RSA算法的特征如下: RSA算法是非对称加密算法,及算法的加密密钥与解密密钥不同 RAS是基于大数分解问题实现的算法, RSA算法的密钥长度一般为

    2024年01月18日
    浏览(12)
  • RSA 加密解密算法实现(简单,易懂)!!!

    RSA 加密解密算法实现(简单,易懂)!!!

    目录 一、什么是RSA算法 1.对称加密 2.非对称加密 3.非对称加密的应用 二、RSA算法的基础操作步骤 1.生成公钥和私钥 2.用公钥加密信息  3.用私钥解密信息 三、AC代码 六、RSA算法的测试  七、共勉     在计算机中常用的加密算法分为两类: 对称加密算法和非对称加密算法。

    2024年01月20日
    浏览(16)
  • Django用RSA实现Web登录加密传输,预防抓包泄漏密码,解决ModelForm无法实现传输加密问题

    问题:         在使用Django学习制作网站时候,以为后端钩子处理使用了md5加密,数据库中也同样以md5的方式存储,这样就解决了密码泄漏问题,因为对前端没有足够的了解所以枉下次定论。         在测试爬取自己的网站时候发现,登录页面控制台能抓包看见密码明

    2024年02月01日
    浏览(7)
  • C# 实现对称加密算法(AES)与非对称加密算法(RSA),包含前端加密对应算法实现

    C# 实现对称加密算法(AES)与非对称加密算法(RSA),包含前端加密对应算法实现

    一种既简单速度又快的加密方式,加密与解密使用的都是同一个密钥,别名又叫做:单密钥加密;对称加密有很多公开算法,并且因为它效率很高,所以适用于加密大量数据的场合;但其密钥的传输过程是不安全的,并且容易被破解,密钥管理起来也相对麻烦。 需要两个密钥

    2024年02月09日
    浏览(23)
  • 公开密钥加密之RSA算法【概念+计算+代码实现】

    公开密钥加密之RSA算法【概念+计算+代码实现】

    🌈推荐阅读:http://t.csdn.cn/nQfIY🔥 安全算法:公开密钥加密之RSA算法 公开密钥加密(又称“非对称加密”)是加密和解密使用不同密钥的一种加密方法。包括公开密钥和私有密钥(成对生成的,网上有工具网站)。 公开密钥(public key,后面简称P):加密用的密钥 私有密钥

    2023年04月17日
    浏览(18)
  • Java代码实现RSA算法加密解密文件功能

    Java代码实现RSA算法加密解密文件功能

    底层算法不做赘述,想要了解自行百度。 RSA属于非对称加密,非对称加密有公钥和私钥两个概念,私钥自己拥有,不能给别人,公钥公开。根据应用的不同,我们可以选择使用不同的密钥加密: 签名:使用私钥加密,公钥解密。用于让所有公钥所有者验证私钥所有者的身份

    2024年02月12日
    浏览(15)
  • RSA加密:Web前端登录账户密码加密传输

    RSA加密:Web前端登录账户密码加密传输

        一般在做系统时候对安全性要求比较高,现在通常选择https协议来进行数据传输。很多情况下一般的javaweb网站,如果安全要求不是很高的话,用https协议就可以了。在这种情况下,密码的明文传输显然是不合适的,因为请求如果在传输过程中被截了,就可以直接拿明文密

    2024年02月10日
    浏览(46)
  • RSA密码原理详解及算法实现(六步即可掌握)

    rsa算法是一种非对称加密算法,其安全性是建立在大素数难以分解的基础上的,即将两个大素数相乘十分容易,但想对其乘积进行分解却很困难,所以可以将其乘积公开作为加密密钥 根据数论,寻求两个大素数比较简单,而将它们的乘积进行因式分解却极其困难,因此可以将

    2023年04月23日
    浏览(12)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包