RSA加解密算法的简单实现

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

就前不久完成的RSA加解密实现这一实验来水一篇文章

算法原理:

一.米勒拉宾素性检测算法

米勒-拉宾(MillerRabbin)素性测试算法是一个高效判断素数的方法。

其涉及到的原理如下:

        1、费马小定理: 如果p为质数           RSA加解密算法的简单实现 (在mod p 的情况下)

        2、对于任意一个小于p的正整数x,发现1(模p)的非平凡平方根存在,则说明p是合数。

其中定理第二部分可以理解为:

如果p是一个素数,0 < x< p,   则方程 RSA加解密算法的简单实现 ≡ 1(mod p) 的解为 x=1 ,x= p-1

反之 如果  x^ 2 ≡ 1(mod p)  的解不是 x=1 ,x= p-1   p 就不是素数

 二.拓展欧几里得算法

如果a、b是整数,那么一定存在整数x、y使得ax+by=gcd(a,b)

1、首先,对于要求最大公约数的两个数 a, b 一定存在满足上式关系;

2、对上式往下层层递推:

(1)…ax + by = gcd (a, b);

(2)…bx1 + a % by1 = gcd (b, a%b); (运用欧几里算法)

(3)…gcd (a, b) = gcd(b,a%b); (欧几里得算法)

(4)…ax + by = b x1 + a % b*y1; (在计算机里 a % b = (a - a / b * b))

(5)…ax + by = bx1 + ay1 - a / b * by1;

(6)…ax + by = ay1 + b (x1 - a / b) y1; (合并同类项)

(7)…x = y1, y = x1 - a / b * y1; (结论)

由此得出结论,每一层的 x 都等于下一层的 y,每一层的 y 都等于下一层的 x1 - a / b * y1;

三.模平方重复算法

模平方重复算法可用于快速幂的实现,是RSA加解密的重要组成部件。具体见下图,大致思路为将指数转化为2进制形式,然后循环相乘并取模。

RSA加解密算法的简单实现

四.RSA加解密原理

RSA算法主要包括:密钥生成,加密过程和解密过程。

(1)加密过程。在密钥生成过程中,首先生成两个大的质数(素数)p和q,令n=p*q ;m=(p-1)*(q-1),选取较小的数e,使e 和m互质,即e和m的最大公约数为1,然后生成d,使d*e(mod m)=1,最后丢弃P,q,m,则加密密钥为e, n,解密密钥为d和n.

(2) 加密过程。将明文x加密成密文y的计算公式为:y=x^e (mod n)。从公式可见,加密牵涉到明文和加密密钥。因此,密文即使被截获,也无法被解读。

(3) 解密过程。将密文y解密成明文x的计算公式为:x=y^d (mod n)。从公式可见,解密至牵涉到解密密钥和密文。

  • 算法设计

快速幂算法

利用模平方重复思想,快速进行幂指数运算

int pow_mod(int a,int b,int c){

    int res=1;

        while(b){

              if((b&1)==1)res=(res*a)%c;

                a=(a*a)%c;

                b>>=1;

        }

        return (res+c)%c;

}

随机大素数(p,q)生成算法

将系统时间作为种子,产生随机数,并利用米勒拉宾算法进行检测,生成两个不相等的大素数。

//米勒拉宾素性检测

bool Miller_Rabbin(int a,int n){

    //把n-1  转化成 (2^r)*d

    int s=n-1,r=0;

    while((s&1)==0){

        s>>=1;r++;

    }

   

    //算出 2^d  存在 k 里

    int k=pow_mod(a,s,n);

   

    //二次探测  看变化过程中是不是等于1 或 n-1

    if(k==1)return true;

    for(int i=0;i<r;i++,k=k*k%n){

        if(k==n-1)return true;

    }

    return false;

}

//素性判定

bool isprime(int n){

    int times=7;

    int prime[100]={2,3,5,7,11,233,331};

    for(int i=0;i<times;i++){

        if(n==prime[i])return true;

        if(Miller_Rabbin(prime[i],n)==false)return false;//未通过探测 返回假

    }

    return true;//所有探测结束 返回真

}

//利用米勒拉宾素性检测产生随机素数(100以内)

int produceRandom(){

       time_t t;

       int randnum;

       do{

              srand((unsigned)time(&t));

        randnum = (rand())%100;

        if(isprime(randnum))return randnum;

       }while(1);

}

扩展欧几里得求逆元

根据扩展欧几里得算法求得e相对于F_n的逆元d

//拓展欧几里得算法求逆元 

int exgcd(int a,int b,int &x,int &y)

{

    int t,gcd;

    if(b==0)

    {

        x=1,y=0;

        return a;

    }

    gcd=exgcd(b,a%b,x,y);

    t=x,x=y,y=t-a/b*y;

    return gcd;

}
  • 运行结果

对“明文.txt”进行加密得到“密文.txt”

对“密文.txt”进行解密得到“解密文.txt”

由此可见,英文大小写均可实现随机密钥的加解密

RSA加解密算法的简单实现

RSA加解密算法的简单实现

源码如下:

#include<cstdio>
#include<fstream>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<ctime>
using namespace std;
typedef long long ll;

int p = 0;
int q = 0;
int len = 0;


//拓展欧几里得算法求逆元  
int exgcd(int a,int b,int &x,int &y)
{
    int t,gcd;
    if(b==0)
    {
        x=1,y=0;
        return a;
    }
    gcd=exgcd(b,a%b,x,y);
    t=x,x=y,y=t-a/b*y;
    return gcd;
}
//快速幂(模平方重复)
int pow_mod(int a,int b,int c){
    int res=1;
        while(b){
              if((b&1)==1)res=(res*a)%c;
                a=(a*a)%c;
                b>>=1;
        }
        return (res+c)%c;
}
//米勒拉宾素性检测
bool Miller_Rabbin(int a,int n){
    
    //把n-1  转化成 (2^r)*d
    int s=n-1,r=0;
    while((s&1)==0){
        s>>=1;r++;
    }
    
    //算出 2^d  存在 k 里
    int k=pow_mod(a,s,n);
    
    if(k==1)return true;
    for(int i=0;i<r;i++,k=k*k%n){
        if(k==n-1)return true;
    }
    return false;
}
bool isprime(int n){
    int times=7;
    int prime[100]={2,3,5,7,11,233,331};
    for(int i=0;i<times;i++){
        if(n==prime[i])return true;
        if(Miller_Rabbin(prime[i],n)==false)return false;//未通过探测 返回假
    }
    return true;//所有探测结束 返回真
}
//利用米勒拉宾素性检测产生随机素数(100以内)
int produceRandom(){
	int randnum;
	do{
        randnum = (rand())%100;
        if(isprime(randnum))return randnum;
	}while(1); 
}


int main(){
	srand(time(NULL));
    int i;
here:
    p = produceRandom();
    q = produceRandom();
    while(q==p)q=produceRandom();//p和q不能相等
    int n = p*q;
    while(n<128)goto here; //确保n足够大,因为char为八位即-128~127,所以n至少要大于127
    int F_n = (p-1)*(q-1);
    int x,y;
    int e = 7;
    exgcd(e,F_n,x,y);
    int d = (x + F_n) % F_n;
    int flag;
    while(1){
        char text[1000]="";
        cout<<"请选择功能:\n 1.加密文件\n 2.解密文件\n 0.退出"<<endl;
        cin>>flag;
        if (!flag) break;
		else if ((flag != 1) && (flag != 2))
		{
			cout << "输入不合法,请重新输入!" << endl << endl;
			continue;
		}
        switch (flag)
        {
        case 1:{
            char ch;
            cout<<"加密密钥为:("<<e<<','<<n<<')'<<endl;
            ofstream ofs;
            ifstream ifs;
            ofs.open("密文.txt",ios::trunc|ios::out);
            ifs.open("明文.txt",ios::in);
            i = 0;
            while(ifs>>ch){
            	text[i++]=ch;
			}
            len = strlen(text);
            int ming [strlen(text)];
            for(i = 0;i<strlen(text);i++){
                ming[i]=text[i];
                ming[i]=pow_mod(ming[i],e,n);
                ofs<<ming[i]<<' ';
            } 
            ofs.close();
            ifs.close();
            break;}     
        case 2:{
            char ch;
            int c[len];
            cout<<"解密密钥为:("<<d<<','<<n<<')'<<endl;
            ofstream ofs;
            ifstream ifs;
            ofs.open("解密文.txt",ios::trunc|ios::out);
            ifs.open("密文.txt",ios::in);
            for(i = 0;i<len;i++){
            	ifs>>c[i];
            	ch = pow_mod(c[i],d,n);
            	ofs<<ch;
			}
            ofs.close();
            ifs.close();
            break;}   
        }
    }
    return 0;
}

 参考文章:

 https://blog.csdn.net/destiny1507/article/details/81750874?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165358238516781685374707%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=165358238516781685374707&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-81750874-null-null.142^v11^pc_search_result_control_group,157^v12^control&utm_term=%E6%8B%93%E5%B1%95%E6%AC%A7%E5%87%A0%E9%87%8C%E5%BE%97%E7%AE%97%E6%B3%95&spm=1018.2226.3001.4187https://blog.csdn.net/destiny1507/article/details/81750874?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165358238516781685374707%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=165358238516781685374707&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-81750874-null-null.142%5ev11%5epc_search_result_control_group,157%5ev12%5econtrol&utm_term=%E6%8B%93%E5%B1%95%E6%AC%A7%E5%87%A0%E9%87%8C%E5%BE%97%E7%AE%97%E6%B3%95&spm=1018.2226.3001.4187

米勒-拉宾素性检验(MillerRabbin)算法详解_1900_的博客-CSDN博客_米勒拉宾素性检验文章来源地址https://www.toymoban.com/news/detail-448870.html

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

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

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

相关文章

  • 从加密到签名:如何使用Java实现高效、安全的RSA加解密算法?

    目录 1. 接下来让小编给您们编写实现代码!请躺好 ☺ 1.1 配置application.yml文件 1.2 RSA算法签名工具类 1.3  RSA算法生成签名以及效验签名测试 1.4 RSA算法生成公钥私钥、加密、解密工具类 1.5 RSA算法加解密测试 我们为什么要使用RSA算法来进行加解密?  RSA 加密算法是一种非对

    2024年02月12日
    浏览(55)
  • C#集成数据加密算法,包含DES、RSA、Base64、SHA、MD5算法,轻松实现数据加密解密需求

    在需要使用配置文件的工控软件中,往往需要在配置文件和数据库中对一些数据加密,即对一串数据进行加密算法后输出复杂符号和字符的形式,让非相关人员无法识别原有数据,从而对数据或数据库进行相应的保护,这往往也是公司安全部门的基本要求。 网上写加密算法的

    2024年02月03日
    浏览(85)
  • C语言实现简单加密算法 凯撒密码 RSA算法 简介及实现

    凯撒密码的核心思想就是移位。 将明文的每一个字符 在 密码系统所支持字符序列中向右平移N,映射得到新的字符从而实现加密,而解密则相反向左平移N。加密的Key即为N。 加密  解密 在如今的万维网环境中,如果A要向B发送数据,需要先加密这个数据,因为在一些不安全

    2024年02月08日
    浏览(53)
  • RSA算法加解密过程全解析

    不同于传统的对称加密算法体系,非对称公私钥密码系统中的加密密钥和解密密钥是相互分开的,加密密钥用于公开给别人加密,而只有持有解密密钥的人才能对信息进行解密。1976年诞生过不少非对称密码算法,但是RSA是其中最容易让人理解的。下文将尝试对RSA实现的具体流

    2023年04月23日
    浏览(35)
  • mbedtls移植之RSA加解密算法

    MbedTLS是一个开源、可移植、易使用、可读性高的SSL库,实现了常所用的加解密算法、X.509证书操作以及TLS协议操作。MbedTLS各功能模块独立性高、耦合度低,可以通过配置宏定义进行功能裁剪,非常适合对空间和效率要求高的嵌入式系统。 1978年,由Ron Rivest、Adi Shamir和Reonard

    2024年02月21日
    浏览(36)
  • RSA的中国剩余定理(CRT)算法解密

    1.公私钥计算 (1) 计算 n = p x q ; (2) 计算Φ(n)= (p-1) x (q-1); (3) 选择 e ,且e与Φ(n)互素 ; (4) 确定d x e= 1 mod Φ(n); (5) 确定公钥 PU = {n , d}, 私钥 PR = {n,e} 2.加解密 明文M ;加密Y= M^e mod n; 解密 M = Y^d mod n; p和q是互相独立的大素数,n为p*q,对于任意(m1, m2), (0=m1

    2024年02月08日
    浏览(46)
  • RSA-CRT 使用中国剩余定理CRT对RSA算法进行解密

    使用中国剩余定理对RSA进行解密,可以提高RSA算法解密的速度。 有关数论的一些基础知识可以参考以下文章: 密码学基础知识-数论(从入门到放弃) 设p和q是不同的质数,且n = p*q。对于任意(X1, x2),其中 0 ≤ x1 p 和 0 ≤ x2 q,存在数x,其中 0 ≤ x n。 中国剩余定理给出了以下的

    2024年02月04日
    浏览(40)
  • 20.2 OpenSSL 非对称RSA加解密算法

    RSA算法是一种非对称加密算法,由三位数学家 Rivest 、 Shamir 和 Adleman 共同发明,以他们三人的名字首字母命名。RSA算法的安全性基于大数分解问题,即对于一个非常大的合数,将其分解为两个质数的乘积是非常困难的。 RSA算法是一种常用的非对称加密算法,与对称加密算法

    2024年02月08日
    浏览(49)
  • RSA、MD5加密解密算法全套解析安装教程

    第一部分介绍加密解密算法, 第二部分介绍我小组成功应用的RSA、MD5两种加密解密算法,以及心得体会。 1、加密解密算法介绍 应用的开发中安全很重要,所以信息加密技术显得尤为重要。我们需要对应用中的多项数据进行加密处理,从而来保证应用上线后的安全性,给用户

    2024年02月09日
    浏览(59)
  • Java实现RSA加解密

    2024年02月15日
    浏览(35)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包