RSA加密算法_源代码__C语言实现
RSA的C语言算法实现
三、程序运行结果及相关说明 主函数实现求 N 的欧拉数、由公钥求解私钥、加密解密选择以及相应的密文明文输出。 子函数 candp 实现加密解密时的求幂取余运算, fun 实现 e 与 t 的互素判断,已验证 e 是否 符合要求。程序主体参考了网上的相关 RSA 算法程序,我对其中 e 的合法性判断、主函数 实现的顺序以及相关提示信息做了补充与修改并加上了注释, 这样程序可读性更强, 运行时 更容易操作,思路也更加严密。 当 P=43, q=59 时,对 13不互素,提示需重新输入,输入 13 后,便可以进行正确操作。 由于 int 型变量为十六位,因此 n 最大只能小于 65536,此程序只是对 RSA 算法的入门,无 法实现达到安全要求的数据位数。
//公钥 e 与 t 的互素判断
x=y; y=t%y; } if(x == 1) return 0; else return 1; }
//x 与 y 互素时返回 0 //x 与 y 不互素时返回 1
void main() { int p,q,e,d,m,n,t,c,r; printf("请输入两个素数 p,q: "); scanf("%d%d",&p,&q); n=p*q; printf("计算得 n 为 %3d\n",n); t=(p-1)*(q-1); //求 n 的欧拉数 printf("计算得 t 为 %3d\n",t); printf("请输入公钥 e: "); scanf("%d",&e); if(e<1||e>t||fun(e,t)) { printf("e 不合要求,请重新输入: "); //e<1 或 e>t 或 e 与 t 不互素时,重新输入 scanf("%d",&e); } d=1; while(((e*d)%t)!=1) d++; //由公钥 e 求出私钥 d printf("经计算 d 为 %d\n",d); printf("加密请输入 1\n"); //加密或解密选择 printf("解密请输入 2\n"); scanf("%d",&r); switch(r) { case 1: printf("请输入明文 m: "); //输入要加密的明文数字 scanf("%d",&m); c=candp(m,e,n); printf("密文为 %d\n",c);break; case 2: printf("请输入密文 c: "); //输入要解密的密文数字 scanf("%d",&c); m=candp(c,d,n); printf("明文为 %d\n",m);break; } }
RSA加密算法(C语言实现)
RSA加密算法(C语言实现)RSA(Rivest-Shamir-Adleman)算法是一种非对称加密算法,它是目前应用最广泛的加密算法之一、RSA算法基于两个大素数之间的乘积很难分解的特性,并使用公钥和私钥进行加密和解密。
在C语言中实现RSA算法需要进行以下步骤:1.生成大素数p和q:选择两个大素数p和q,它们需要满足p≠q。
这样选取p和q是为了使得计算n=p*q变得困难,保护私钥。
2.计算n:计算n=p*q,n即为公钥和私钥的参数之一3.计算欧拉函数φ(n):计算欧拉函数φ(n)=(p-1)*(q-1)。
4.选择e:选择一个与φ(n)互质且小于φ(n)的整数e作为加密指数,e即为公钥的参数。
5. 计算d:计算d = e^(-1) mod φ(n),d即为私钥的参数。
可以使用扩展欧几里得算法来计算d。
6. 加密:将明文M转换为整数m,加密后的密文C = m^e mod n。
7. 解密:解密密文C得到明文M = C^d mod n。
以下是C语言实现RSA加密算法的代码示例:```c#include <stdio.h>int gcd(int a, int b)if(b == 0)}return gcd(b, a % b);int extendedGcd(int a, int b, int *x, int *y) if(a == 0)*x=0;*y=1;return b;}int x1, y1;int gcd = extendedGcd(b % a, a, &x1, &y1);*x=y1-(b/a)*x1;*y=x1;return gcd;int modInverse(int a, int m)int x, y;int gcd = extendedGcd(a, m, &x, &y);if(gcd != 1)printf("Inverse doesn't exist\n");}return (x % m + m) % m;int powerMod(int x, unsigned int y, int m) if (y == 0)return 1;}int p = powerMod(x, y/2, m) % m;p=(p*p)%m;return (y%2 == 0) ? p : (x*p) % m;int maiint p, q, n, phiN, e, d;//选择两个大素数p和qp=31;q=17;//计算n和φ(n)n=p*q;phiN = (p - 1) * (q - 1);//选择加密指数ee=7;//计算解密指数dd = modInverse(e, phiN);int plaintext = 88;int ciphertext = powerMod(plaintext, e, n);int decryptedtext = powerMod(ciphertext, d, n);printf("Plaintext: %d\n", plaintext);printf("Ciphertext: %d\n", ciphertext);printf("Decryptedtext: %d\n", decryptedtext);return 0;```在上面的代码中,我们使用了几个辅助函数来实现扩展欧几里得算法、计算模反元素和快速幂算法。
C语言实现RSA算法
C语言实现RSA算法RSA算法是一种非对称加密算法,用于在网络通信中进行数据加密和解密。
下面我将给出C语言中RSA算法的实现。
首先,我们需要生成RSA密钥对,包括公钥和私钥。
以下是生成RSA 密钥对的C代码实现:```c#include <stdio.h>#include <stdlib.h>#include <math.h>//定义最大素数范围//定义RSA密钥结构体typedef structunsigned long long e; // 公钥指数unsigned long long d; // 私钥指数unsigned long long n; // 模数} RSAKey;//判断一个数是否为素数int isPrime(unsigned long long num)//小于等于1的数不是素数if (num <= 1) return 0;//判断是否存在因子for (unsigned long long i = 2; i <= sqrt(num); i++)if (num % i == 0)return 0;}}return 1;//生成一个指定范围内的随机素数unsigned long long generateRandomPrime(unsigned long long min, unsigned long long max)unsigned long long num;donum = rand( % (max - min + 1) + min;} while (!isPrime(num));return num;//求最大公约数unsigned long long gcd(unsigned long long a, unsigned long long b)unsigned long long temp;while (b != 0)temp = a % b;a=b;b = temp;}return a;//求模反元素unsigned long long modReverse(unsigned long long a, unsigned long long b)unsigned long long m0 = b, t, q;unsigned long long x0 = 0, x1 = 1;if (b == 1) return 0;while (a > 1)q=a/b;t=b;b=a%b;a=t;t=x0;x0=x1-q*x0;x1=t;}if (x1 < 0) x1 += m0;return x1;//生成RSA密钥对RSAKey generateRSAKeys(unsigned long long p, unsigned long long q)RSAKey keys;//计算模数keys.n = p * q;//计算欧拉函数值unsigned long long phi = (p - 1) * (q - 1);//选择公钥指数ekeys.e = generateRandomPrime(2, phi - 1);//计算私钥指数dkeys.d = modReverse(keys.e, phi);return keys;int mai//设置随机种子//生成两个不同的随机素数unsigned long long p = generateRandomPrime(2,MAX_PRIME_NUMBER);unsigned long long q = generateRandomPrime(2,MAX_PRIME_NUMBER);RSAKey keys = generateRSAKeys(p, q);printf("公钥指数e: %llu\n", keys.e);printf("私钥指数d: %llu\n", keys.d);printf("模数n: %llu\n", keys.n);return 0;```运行上述代码,即可生成RSA密钥对。
RSA加密解密算法C语言代码
#include<stdio.h>#include<string.h>#include <stdlib.h>#include <time.h>#include <math.h>#include <malloc.h>#define MAX 100#define LEN sizeof(struct slink)void sub(int a[MAX],int b[MAX] ,int c[MAX] );struct slink{int bignum[MAX];/*bignum[98]用来标记正负号,1正,0负bignum[99]来标记实际长度*/struct slink *next;};/*/--------------------------------------自己建立的大数运算库-------------------------------------*/void print( int a[MAX] ){int i;for(i=0;i<a[99];i++)printf("%d",a[a[99]-i-1]);printf("\n\n");return;}int cmp(int a1[MAX],int a2[MAX]){ int l1, l2;int i;l1=a1[99];l2=a2[99];if (l1>l2)return 1;if (l1<l2)return -1;for(i=(l1-1);i>=0;i--){if (a1[i]>a2[i])return 1 ;if (a1[i]<a2[i])return -1;}}void mov(int a[MAX],int *b){int j;for(j=0;j<MAX;j++)b[j]=a[j];return ;}void mul(int a1[MAX],int a2[MAX],int *c) {int i,j;int y;int x;int z;int w;int l1, l2;l1=a1[MAX-1];l2=a2[MAX-1];if (a1[MAX-2]=='-'&& a2[MAX-2]=='-') c[MAX-2]=0;else if (a1[MAX-2]=='-')c[MAX-2]='-';else if (a2[MAX-2]=='-')c[MAX-2]='-';for(i=0;i<l1;i++){for(j=0;j<l2;j++){x=a1[i]*a2[j];y=x/10;z=x%10;w=i+j;c[w]=c[w]+z;c[w+1]=c[w+1]+y+c[w]/10;c[w]=c[w]%10;}}w=l1+l2;if(c[w-1]==0)w=w-1;c[MAX-1]=w;return;}void add(int a1[MAX],int a2[MAX],int *c) {int i,l1,l2;int len,temp[MAX];int k=0;l1=a1[MAX-1];l2=a2[MAX-1];if((a1[MAX-2]=='-')&&(a2[MAX-2]=='-')) {c[MAX-2]='-';}else if (a1[MAX-2]=='-'){mov(a1,temp);temp[MAX-2]=0;sub(a2,temp,c);return;}else if (a2[MAX-2]=='-'){mov(a2,temp);temp[98]=0;sub(a1,temp,c);return;}if(l1<l2)len=l1;else len=l2;for(i=0;i<len;i++){c[i]=(a1[i]+a2[i]+k)%10;k=(a1[i]+a2[i]+k)/10;}if(l1>len){for(i=len;i<l1;i++){c[i]=(a1[i]+k)%10;k=(a1[i]+k)/10;}if(k!=0){c[l1]=k;len=l1+1;}}else{for(i=len;i<l2;i++){c[i]=(a2[i]+k)%10;k=(a2[i]+k)/10;}if(k!=0){c[l2]=k;len=l2+1;}else len=l2;}c[99]=len;return;}void sub(int a1[MAX],int a2[MAX],int *c) {int i,l1,l2;int len,t1[MAX],t2[MAX];int k=0;l1=a1[MAX-1];l2=a2[MAX-1];if ((a1[MAX-2]=='-') && (a2[MAX-2]=='-')) {mov(a1,t1);mov(a2,t2);t1[MAX-2]=0;t2[MAX-2]=0;sub(t2,t1,c);return;}else if( a2[MAX-2]=='-'){mov(a2,t2);t2[MAX-2]=0;add(a1,t2,c);return;}else if (a1[MAX-2]=='-'){mov(a2,t2);add(a1,t2,c);return;}if(cmp(a1,a2)==1){len=l2;for(i=0;i<len;i++){if ((a1[i]-k-a2[i])<0){c[i]=(a1[i]-a2[i]-k+10)%10;k=1;}else{c[i]=(a1[i]-a2[i]-k)%10;k=0;}}for(i=len;i<l1;i++){if ((a1[i]-k)<0){c[i]=(a1[i]-k+10)%10;k=1;}else{c[i]=(a1[i]-k)%10;k=0;}}if(c[l1-1]==0)/*使得数组C中的前面所以0字符不显示了,如1000-20=0980--->显示为980了*/ {len=l1-1;i=2;while (c[l1-i]==0)/*111456-111450=00006,消除0后变成了6;*/{len=l1-i;i++;}else{len=l1;}}elseif(cmp(a1,a2)==(-1)){c[MAX-2]='-';len=l1;for(i=0;i<len;i++){if ((a2[i]-k-a1[i])<0){c[i]=(a2[i]-a1[i]-k+10)%10;k=1;}else{c[i]=(a2[i]-a1[i]-k)%10;k=0;}}for(i=len;i<l2;i++){if ((a2[i]-k)<0){c[i]=(a2[i]-k+10)%10;k=1;}else{c[i]=(a2[i]-k)%10;k=0;}}if(c[l2-1]==0){len=l2-1;i=2;while (c[l1-i]==0){len=l1-i;i++;}}else len=l2;}else if(cmp(a1,a2)==0){len=1;c[len-1]=0;}c[MAX-1]=len;return;}void mod(int a[MAX],int b[MAX],int *c)/*/c=a mod b//注意:经检验知道此处A和C的数组都改变了。
RSA的C语言算法实现
RSA的C语言算法实现RSA算法是一种非对称密码算法,用于加密和解密数据。
它是由三位数学家Rivest、Shamir和Adleman在1977年提出的,是目前最广泛使用的公钥加密算法之一RSA算法的实现需要以下步骤:1.选择两个大素数p和q,计算它们的乘积n=p*q。
n称为模数。
2.计算欧拉函数φ(n)=(p-1)*(q-1)。
3. 选择一个小于φ(n)的整数e,使得e与φ(n)互质,即gcd(e,φ(n)) = 1、e称为公钥指数。
4. 计算私钥指数d,满足(d * e) mod φ(n) = 1、d称为私钥指数。
5.公钥是(n,e),私钥是(n,d)。
6. 要加密消息m,计算c = m^e mod n,其中c是密文。
7. 要解密密文c,计算m = c^d mod n,其中m是原始消息。
下面是一个使用C语言实现RSA算法的示例:```c#include <stdio.h>#include <stdlib.h>typedef unsigned long long int ullong;ullong gcd(ullong a, ullong b)ullong temp;while (b != 0)temp = b;b=a%b;a = temp;}return a;ullong mod_inverse(ullong a, ullong m) ullong m0 = m;ullong y = 0, x = 1;if (m == 1)return 0;while (a > 1)ullong q = a / m;ullong t = m;m=a%m,a=t;t=y;y=x-q*y;x=t;}if (x < 0)x+=m0;return x;ullong mod_exp(ullong base, ullong exponent, ullong modulus) ullong result = 1;base = base % modulus;while (exponent > 0)if (exponent % 2 == 1)result = (result * base) % modulus;exponent = exponent >> 1;base = (base * base) % modulus;}return result;int mai//选择素数p和qullong p = 17;ullong q = 19;//计算模数n和欧拉函数φ(n)ullong n = p * q;ullong phi_n = (p - 1) * (q - 1);//选择公钥指数eullong e = 5;//计算私钥指数dullong d = mod_inverse(e, phi_n);//打印公钥和私钥printf("公钥: (%llu, %llu)\n", n, e); printf("私钥: (%llu, %llu)\n", n, d);//要加密的消息ullong m = 88;//加密消息ullong c = mod_exp(m, e, n);//打印加密结果printf("加密结果: %llu\n", c);//解密消息ullong decrypted_m = mod_exp(c, d, n); //打印解密结果printf("解密结果: %llu\n", decrypted_m);return 0;```这是一个简单的RSA实现示例,用于加密和解密一个整数。
(完整版)RSA算法C语言代码
#include <stdlib.h>#include <stdio.h>#include <string.h>#include <math.h>#include <time.h>char s[100],*c;int n,e,d,i,C,j,k=0,len;int str[100],b[30];unsigned gcd(unsigned a, unsigned b ) {if(a%b==0)return b;elsereturn gcd(b,a%b);}void Egcd(int a, int b,int &x, int &y) { //ax-by=1 if(b==0||a==0){x=1;y=0;return ;}if(a<b){Egcd(a,b%a,x,y);x=(int)(b*y+1)/a;}else{Egcd(a%b,b,x,y);y=(int)(a*x-1)/b;}}void RSA(){int p,q,N,Y;printf("请输入素数p和q:");scanf("%d %d",&p,&q);n=p*q;N=(p-1)*(q-1);//printf("n=%d N=%d\n",n,N);srand( (unsigned)time( NULL ) ); //初始化随机数while(1) //产生随机整数e,e与N互质 {e=rand()%N;// printf("e==%d\n",e);if(e==0)continue;if(gcd(N,e)==1){break;}}//printf("e=%d\n",e);Egcd(e,N,d,Y);// printf("d=%d Y=%d\n",d,Y);printf("公钥PU={e=%d,n=%d}\n",e,n);printf("私钥PR={d=%d,n=%d}\n",d,n);}void encrypt() //加密函数{len=strlen(s);//hgprintf("len=%d\n",len);for(i=0;i<len;i++) //去掉s[100]中的空格{if(s[i]<97||s[i]>122){b[k]=i;k++;for(j=i;j<len-1;j++){s[j]=s[j+1];}len--;}}s[len]='\0'; //结束符printf("密文是:");for(i=0;i<len;i++)C=1;//printf("shiji=%d\n",s[i]-97);for(int j=0;j<e;j++){C=(C*(s[i]-97))%n;// printf("C=%ld\n",C);}str[i]=C;printf("%d ",str[i]);}printf("\n");}void decrypt() //解密函数{c=(char*)malloc(len*sizeof(int));for(i=0;i<len;i++) //实现解密{C=1;for(int j=0;j<d;j++){C=(C*(str[i]))%n;// printf("C=%ld\n",C);}// printf("C=%d\n",C);c[i]=C+97;}c[i] = '\0';// puts(c);for(int z=0;z<k;z++) //加空格{for(i=0; i<len; i++){if (i==b[z]){for(j=len;j>i;j--){c[j]=c[j-1];}c[i]=' ';len++;b[z+1]=b[z+1]+(z+1);break;}}c[len] = '\0';printf("明文:");puts(c);}int function()//系统功能选择页面{int choice;printf("==============================================================\n"); printf(" 欢迎进入RSA算法 \n"); printf(" 1--加密 \n"); printf(" 2--解密 \n"); printf(" 3--退出 \n"); printf("==============================================================\n"); printf("请输入要选择的功能号:");scanf("%d",&choice);return choice;}int main(){int function();int fc;printf("请输入初始明文(小写):");gets(s);// puts(s);RSA(); //提供私钥和公钥while(1){fc=function();if(fc==1) //加密encrypt();else if(fc==2) //解密decrypt() ;else if(fc==3)break;elseprintf("输入有误,请重新输入!/n");}return 0;}。
RSA算法C语言代码
#include <stdlib.h>#include <stdio.h>#include <string.h>#include <math.h>#include <time.h>char s[100],*c;int n,e,d,i,C,j,k=0,len;int str[100],b[30];unsigned gcd(unsigned a, unsigned b ){if(a%b==0)return b;elsereturn gcd(b,a%b);}void Egcd(int a, int b,int &x, int &y){ //ax-by=1if(b==0||a==0){x=1;y=0;return ;}if(a<b){Egcd(a,b%a,x,y);x=(int)(b*y+1)/a;}else{Egcd(a%b,b,x,y);y=(int)(a*x-1)/b;}}void RSA(){int p,q,N,Y;printf("请输入素数p和q:");scanf("%d %d",&p,&q);n=p*q;N=(p-1)*(q-1);//printf("n=%d N=%d\n",n,N);srand( (unsigned)time( NULL ) ); //初始化随机数while(1) //产生随机整数e,e与N互质 {e=rand()%N;// printf("e==%d\n",e);if(e==0)continue;if(gcd(N,e)==1){break;}}//printf("e=%d\n",e);Egcd(e,N,d,Y);// printf("d=%d Y=%d\n",d,Y);printf("公钥PU={e=%d,n=%d}\n",e,n);printf("私钥PR={d=%d,n=%d}\n",d,n);}void encrypt() //加密函数{len=strlen(s);//hgprintf("len=%d\n",len);for(i=0;i<len;i++) //去掉s[100]中的空格 {if(s[i]<97||s[i]>122){b[k]=i;k++;for(j=i;j<len-1;j++){s[j]=s[j+1];}len--;}}s[len]='\0'; //结束符printf("密文是:");for(i=0;i<len;i++){C=1;//printf("shiji=%d\n",s[i]-97);for(int j=0;j<e;j++){C=(C*(s[i]-97))%n;// printf("C=%ld\n",C);}str[i]=C;printf("%d ",str[i]);}printf("\n");}void decrypt() //解密函数{c=(char*)malloc(len*sizeof(int));for(i=0;i<len;i++) //实现解密{C=1;for(int j=0;j<d;j++){C=(C*(str[i]))%n;// printf("C=%ld\n",C);}// printf("C=%d\n",C);c[i]=C+97;}c[i] = '\0';// puts(c);for(int z=0;z<k;z++) //加空格{for(i=0; i<len; i++){if (i==b[z]){for(j=len;j>i;j--){c[j]=c[j-1];}c[i]=' ';len++;b[z+1]=b[z+1]+(z+1);break;}}}c[len] = '\0';printf("明文:");puts(c);}int function()//系统功能选择页面{int choice;printf("==============================================================\n"); printf(" 欢迎进入RSA算法 \n"); printf(" 1--加密 \n"); printf(" 2--解密 \n"); printf(" 3--退出 \n"); printf("==============================================================\n"); printf("请输入要选择的功能号:");scanf("%d",&choice);return choice;}int main(){int function();int fc;printf("请输入初始明文(小写):");gets(s);// puts(s);RSA(); //提供私钥和公钥while(1){fc=function();if(fc==1) //加密encrypt();else if(fc==2) //解密decrypt() ;else if(fc==3)break;elseprintf("输入有误,请重新输入!/n"); }return 0;}。
RSA加密算法(C语言实现)
RSA加密算法(C语⾔实现)这次轮到RSA加密算法了。
RSA加密过程相对DES和MD5要简单很多,但作为现在还在使⽤的加密算法之⼀,它还是有需要认真思索的地⽅哒~⾸先是密钥对的⽣成:(1)选取两个⼤素数p和q(⽬前两个数的长度都接近512bit是安全的)(2)计算乘积n=p*q,Φ(n)=(p-1)(q-1),其中Φ(n)为n的欧拉函数(因为两素数乘积的欧拉函数等于两数分别减⼀后的乘积)(3)随机选取整数e(1<e<Φ(n))作为公钥d,要求满⾜e与Φ(n)的最⼤公约数为1,即两者互素(4)⽤Euclid扩展算法计算私钥d,已满⾜d * e ≡ 1 (mod Φ(n)),即d ≡ e^(-1) (mod Φ(n))。
则e与n是公钥,d是私钥注意:e与n应公开,两个素数p和q不再需要,可销毁,但绝不可泄露。
加密过程:将接收到的明⽂转换成特定的编码⽅式。
如p=43,q=59,e=13,明⽂为cybergreatwall,按照英⽂字母表的顺序a=00,b=01,... ,z=25进⾏编码后为022401041706001922001111。
然后将转码后的字符串分块,分组要求:每个分组对应的⼗进制数⼩于0。
这个要求是什么意思呢?我个⼈的理解通过举例向⼤家说明:上⽂字符串分组如下0224 0104 1706 0019 2200 1111。
每⼀分组的数都⼩于n(2537),⽽2537能接受的最⼤的数为2525(也就是‘zz’的情况),所以是4位1组,即两字符⼀组。
这样⼀来,m1=0224,m2=0104,... ,m6=1111现在可以加密了~~加密算法就是这个式⼦----ci ≡ mi^e (mod n),如第⼀分组 0224^13 ≡ mod 2537 ≡ 1692=c1。
这⾥有个隐藏的算法是需要了解的:在RSA算法过程中容易出现天⽂数字(像上⽂的0224^13),⽽这些天⽂数字会为我们编程的过程造成⼀定的⿇烦,更可恶的是会影响速度!!为了避免这种情况,快速取模指数算法可以很有效地算出c≡m^e mod n的准确结果且避免过程中出现天⽂数字~~下⾯⽤伪代码为⼤家介绍下这种神奇的算法(个⼈感觉伪代码⾥的 ‘<-’ 就是平时⽤的 ‘=’ ):t<-0;c<-1for i<-k downto 0do t<-2*tc<-(c*c)mod nif bi=1 then t<-t+1c<-(c*m)mod nreturn c(p.s:e的⼆进制表⽰为bk bk-1 ... b0,如e=13=(1101),所以k为3)所以,⽤快速取模指数算法计算上⽂例⼦⾥的c1过程就该是这样⼦哒:i 3 2 1 0bi 1 1 0 1t 1 3 6 13ci (1*224)mod2537 (224*224*224)mod2537 (514*514)mod2537(348*348*224)mod2537=224 =514 =348 =1692到这⾥RSA加密的算法就讲完了,下⾯附上代码#include<stdio.h>#include<stdlib.h>/* 函数申明 */int long_n(int n);int shuru(char *arr, int k, char *wei, int is_first);void jiami(char *arr, int k, int e, int n);/* 输⼊函数,记录从键盘输⼊的明⽂*/int shuru(char *arr, int k, char *wei, int is_first){int i;char ch;/*判断是否为第⼀分组的输⼊,如果是则获取输⼊的字符,否则就将上⼀分组最后获取的字符作为这⼀分组的第⼀个字符*/if (is_first == 1)ch = getchar();elsech = *wei;for (i = 0; (i < k) && (ch != '\n');i++) //获取字符直到获取到回车符为⽌{arr[i] = ch;ch = getchar();}*wei = ch; //最后获取到的字符准备作为下⼀分组的第⼀个字符for (i = i; i < k; i++)arr[i] = 'a'; //输⼊不够⼀组个数的整数倍则补'a'(即为补零)if (ch == '\n') //接收到回车符返回0,否则为1return 0;elsereturn 1;}/*加密函数*/void jiami(char *arr, int k, int e, int n){int m = 0,c=1, i, j,t=0, shu,temp,num=0;int *array;/*Mi赋值过程*/for (i = 0; i < k; i++){temp = 1;for (j = 0; j < (k-i-1)*2; j++)temp = temp * 10;shu = (int)arr[i] - 97;m = m + temp * shu;}temp = e;/*获取e的⼆进制表达形式的位数*/do{temp = temp / 2;num++;} while (temp != 0);array = (int *)malloc(sizeof(int)*k); //申请动态数组temp = e;/*动态数组存储e的⼆进制表达形式*//*动态数组存储e的⼆进制表达形式*/for (i = 0; i < num; i++){array[i] = temp % 2;temp = temp / 2;}/*避免出现天⽂数字的算法,详情见上⽂⽂字说明*/ for (i = num - 1; i >= 0; i--){t = t * 2;temp = c*c;if (temp > n){for (j = 0; temp - n*j >= 0; j++);j--;c = temp - n*j;}elsec = temp;if (array[i] == 1){t = t + 1;temp = c*m;if (temp > n){for (j = 0; temp - n*j >= 0; j++);j--;c = temp - n*j;}elsec = temp;}e = e / 2;}temp = c;i = 0;/*c的位数⼩于分组长度则在前补零*/do{temp = temp / 10;i++;} while (temp != 0);for (i; i < num; i++)printf("0");printf("%d", c);}/*获取分组的长度*/int long_n(int n){int temp,i,j,k,shi,comp=0;temp = n;/*获取n的位数*/for (i = 1; temp / 10 != 0; i++){temp = temp / 10;}temp = i;/*若n的位数为基数*/if (i % 2 != 0){i = i - 1;return i;}/*若位数为偶数*/elseelse{for (j = 0; j < i/2; j++){shi = 1;for (k = 0; k < temp - 2; k++)shi = shi * 10;comp = comp + shi * 25;temp = temp - 2;}if (comp <= n)return i;else{i = i - 2;return i;}}}/*主函数*/int main(){int p, q, e, d, n, fai_n, k, i,is_first=1;char ch,*arr,wei='a';printf("请输⼊p、q、e值,⽤空格间隔开\n");scanf_s("%d%d%d", &p, &q, &e); //从键盘获取p、q、e值n = p*q;fai_n = (p-1)*(q-1); //Φ(n)for (k = 0; (k*n + 1) % e != 0; k++);if ((k*n + 1) % e == 0)d = (k*n + 1) / e; //d *e ≡ 1 (mod Φ(n))k = long_n(n);k = k / 2; //分组的长度ch = getchar(); //缓冲回车符arr = (char *)malloc(sizeof(char)*k); //申请动态数组printf("请输⼊明⽂\n");while (1){i=shuru(arr,k,&wei,is_first); //调⽤输⼊字符的函数,接收到回车符返回0,否则为1 is_first = 0; //第⼀分组录⼊结束设为0jiami(arr,k,e,n); //调⽤加密函数if (i == 0) //接收到返回值为0跳出循环break;}printf("\n");return 0;}运⾏结果:如果有对算法和代码不理解或者有不同看法的请联系我哦,邮箱在我的信息⾥~~。
RSA算法C语言实现
RSA算法C语言实现首先,我们需要定义一些辅助函数。
1.大数比较函数```cif (a.len > b.len) return 1;if (a.len < b.len) return -1;for (int i = a.len - 1; i >= 0; i--)if (a.arr[i] > b.arr[i]) return 1;if (a.arr[i] < b.arr[i]) return -1;}return 0;```2.大数加法函数```cbig_num add_big_nums(big_num a, big_num b) big_num res;int carry = 0;int len = max(a.len, b.len);for (int i = 0; i < len; i++)int sum = carry;if (i < a.len) sum += a.arr[i];if (i < b.len) sum += b.arr[i];res.arr[res.len++] = sum % BASE;carry = sum / BASE;}if (carry) res.arr[res.len++] = carry; return res;```3.大数减法函数```cbig_num sub_big_nums(big_num a, big_num b) big_num res;int borrow = 0;for (int i = 0; i < a.len; i++)int diff = a.arr[i] - borrow;if (i < b.len) diff -= b.arr[i];if (diff < 0)diff += BASE;borrow = 1;} elseborrow = 0;}res.arr[res.len++] = diff;}while (res.len > 1 && res.arr[res.len - 1] == 0) res.len--;}return res;```4.大数乘法函数```cbig_num mul_big_nums(big_num a, big_num b)big_num res;res.len = a.len + b.len;for (int i = 0; i < a.len; i++)int carry = 0;for (int j = 0; j < b.len; j++)int sum = res.arr[i + j] + a.arr[i] * b.arr[j] + carry; res.arr[i + j] = sum % BASE;carry = sum / BASE;}res.arr[i + b.len] = carry;}while (res.len > 1 && res.arr[res.len - 1] == 0)res.len--;}return res;```5.大数除法函数```cbig_num div_big_nums(big_num a, big_num b)big_num res;big_num tmp;res.len = a.len - b.len + 1;tmp.len = a.len;for (int i = 0; i < a.len; i++)tmp.arr[i] = a.arr[i];}for (int i = res.len - 1; i >= 0; i--)int left = 0, right = BASE - 1;while (left < right)int mid = (left + right + 1) / 2;tmp.arr[b.len + i] = mid;left = mid;} elseright = mid - 1;}}res.arr[i] = left;tmp = sub_big_nums(tmp, mul_big_nums(b,big_num_from_int(left)));}while (res.len > 1 && res.arr[res.len - 1] == 0) res.len--;}```6.大数取模函数```cbig_num mod_big_nums(big_num a, big_num b)big_num tmp;tmp.len = a.len;for (int i = 0; i < a.len; i++)tmp.arr[i] = a.arr[i];}for (int i = a.len - b.len; i >= 0; i--)tmp = sub_big_nums(tmp, mul_big_nums(b,big_num_from_int(1)));}if (i > 0)tmp = mul_big_nums(tmp, big_num_from_int(BASE));tmp.arr[i - 1] = a.arr[i - 1];}}```接下来,我们实现RSA算法的核心步骤。
RSA加密算法(c语言的表达)
#include<iostream.h>#include <stdlib.h>#include<math.h>#include<String.h>int r; //公开模数int sk; //私人密钥int pk; //公开密钥int Euler;//欧拉函数int check(int x){for(int i=2;i<=x-1;i++){if(x%i==0) break;}if(i==x) return 1;else return 0;}void produceSS(){int p,q;int flag=0;int n=0;cout<<"输入值不要太大,防止溢出!"<<endl;while(flag==0){if(n>0) cout<<"p应为素数,请重新输入!"<<endl;cout<<"请输入素数p:";cin>>p;flag=check(p);n++;}flag=0;n=0;while(flag==0){if(n>0) cout<<"q应为素数,请重新输入!"<<endl;cout<<"请输入素数q:";cin>>q;flag=check(q);n++;}r=p*q;cout<<"公开模数:r="<<r<<endl;Euler=(p-1)*(q-1);cout<<"欧拉函数:Euler="<<Euler<<endl; }int gcd(int x,int y){int a=x;int b=y;int z;b++;do{b--;x=a;y=b;while(x%y!=0){z=x%y;x=y;y=z;}}while(z>1);return b;}int trAsc(int s,int a[]) //转为二进制数{int x=s;int n=0;while(x!=0){a[n]=x%2;x=x/2;n++;}return n;}int pfc(int x,int key) //平方乘{int a[13];int m=trAsc(key,a); //二进制位数int c=1;for(int i=m-1;i>=0;i--){c=c*c%r;if(a[i]==1) c=c*x%r;}return c;}/*int producePk(){int a1=sk;int r1=r;int q1, p1;int b1=0;int b2=1;int b3;do{cout<<a1<<endl;p1=r1/a1;q1=r1%a1;b3=b1-b2*p1;b1=b2;b2=b3;r1=a1;a1=q1;}while(a1!=1);return abs(b2);}*/void produceKey(){int k;int n=0;int flag=0;int b1=0;int b2=1;int a,c,q,p;cout<<"e应小于欧拉函数:"<<Euler<<endl;cout<<"请输入e:";cin>>sk;sk++;do{sk--;sk=abs(sk);//绝对值sk=gcd(Euler,sk);b1=0;b2=1;a=sk;c=Euler;do{q=c/a; //辗转相除p=c%a;pk=b1-b2*q;c=a;a=p;b1=b2;b2=pk;}while (p!=1);pk=abs(pk);a=pfc(8,sk);c=pfc(a,pk);} while(c!=8); //加密、解密正确判断cout<<"d="<<pk<<endl;cout<<"e="<<sk<<endl;}void Encryption() //加密{int Express;int flag=1;while(flag){cout<<"明文编码应小于公开模数r:"<<r<<endl;cout<<"请输入要加密的明文编码(十进制数):";cin>>Express;if(Express>r)cout<<"明文编码应小于公开模数,请重新输入!"<<endl;else flag=0;}cout<<"sk="<<sk<<endl;cout<<"原编码为:"<<Express;Express=pfc(Express,sk);cout<<"密文为:"<<Express<<endl;}void Decrypt()//减密{int Express;int flag=1;while(flag){cout<<"密文编码应小于公开模数r:"<<r<<endl;cout<<"请输入要加密的密文编码(十进制数):";cin>>Express;if(Express>r)cout<<"密文编码应小于公开模数,请重新输入!"<<endl;else flag=0;}cout<<"pk="<<pk<<endl;cout<<"原编码为:"<<Express;Express=pfc(Express,pk);cout<<"明文为:"<<Express<<endl;}void main(){int flag=1;int step;int n;while(flag){cout<<"1.产生素数"<<endl;cout<<"2.产生密钥"<<endl;cout<<"3.加密"<<endl;cout<<"4.解密"<<endl;cout<<"5.退出"<<endl;cout<<"请输入您的操作(1,2,3,4或5):";cin>>step;switch(step){case 1:produceSS();break;case 2:produceKey();break;case 3:Encryption();break;case 4:Decrypt();break;case 5:exit(0);break;}}}。
rsa2048加密算法c语言代码
RSA加密算法是一种非对称加密算法,它可以确保通信双方在不安全的通信环境中进行安全的通讯。
该算法由三位数学家Rivest, Shamir 和Adleman于1977年提出,RSA算法的安全性基于大数分解的困难性,即在已知一个大合数n的情况下,要找出它的两个素因子p和q 是相当困难的。
在此,我们将要介绍RSA2048加密算法的C语言实现代码。
下面是该算法的代码:```c#include <stdio.h>#include <stdlib.h>#include <string.h>#include <math.h>//欧几里得算法int gcd(int a, int b) {if (b == 0)return a;elsereturn gcd(b, ab);}//扩展欧几里得算法int ext_gcd(int a, int b, int *x, int *y) {int t, d;if (b == 0) {*x = 1;*y = 0;return a;}d = ext_gcd(b, ab, x, y);t = *x;*x = *y;*y = t - a/b * (*y);return d;}//生成公钥和私钥void generate_key(int *pub_key, int *pri_key, int *n) { int p, q, tot, e, d, i;do {p = rand() 100 + 1;} while (p 2 == 0);do {q = rand() 100 + 1;} while (q 2 == 0 || q == p);*n = p * q;tot = (p - 1) * (q - 1);for (e = 2; e < tot; e++) {if (gcd(e, tot) == 1)break;}for (d = 1; d < tot; d++) {if (e * d tot == 1)break;}pub_key[0] = e;pub_key[1] = *n;pri_key[0] = d;pri_key[1] = *n;}//加密void encrypt(int *pub_key, char *pl本人nt, int len, int *ciphert) { int e = pub_key[0], n = pub_key[1], i;for (i = 0; i < len; i++) {int m = pl本人nt[i];ciphert[i] = (int)pow(m, e) n;}}//解密void decrypt(int *pri_key, int *ciphert, int len, char *pl本人nt) { int d = pri_key[0], n = pri_key[1], i;for (i = 0; i < len; i++) {int c = ciphert[i];pl本人nt[i] = (char)(pow(c, d) n);}pl本人nt[len] = '\0';}int m本人n() {int pub_key[2], pri_key[2], n, len, i;char pl本人nt[100];int ciphert[100];generate_key(pub_key, pri_key, n);printf("Enter message to encrypt: ");gets(pl本人nt);len = strlen(pl本人nt);encrypt(pub_key, pl本人nt, len, ciphert);printf("Encrypted message: ");for(i = 0; i < len; i++)printf("d ", ciphert[i]);decrypt(pri_key, ciphert, len, pl本人nt);printf("\nDecrypted message: s\n", pl本人nt);return 0;}```以上就是RSA2048加密算法的C语言实现代码。
RSA加密算法_源代码__C语言实现
b=2 + g_Rnd.Random(n - 3); //2、计算v=b^m mod n
v=PowMod(b, m, n); //3、如果v==1,通过测试
if(v == 1)
{
return 1;
} //4、令i=1
i=1; //5、如果v=n-1,通过测试
a>>=1;
b>>=1;
} if(!(a & 1))
{
t=a; //如果a为偶数,交换a,b
a=b;
b=t;
} do
{
while(!(b & 1))
{
b>>=1; //b为偶数,a为奇数时,gcd(b,a)=gcd(b/2,a)
} if(b < a)
{
t=a; //如果b小于a,交换a,b
a=b;
b=t;
密钥对的产生。选择两个大素数,p和q。计算:n = p * q然后随机选择加密密钥e,要求e和( p - 1 ) * ( q - 1 )互质。最后,利用Euclid算法计算解密密钥d,满足e * d = 1 ( mod ( p - 1 ) * ( q - 1 ) )其中n和d也要互质。数e和n是公钥,d是私钥。两个素数p和q不再需要,应该丢弃,不要让任何人知道。加密信息m(二进制表示)时,首先把m分成等长数据块m1 ,m2,..., mi,块长s,其中2^s <= n, s尽可能的大。对应的密文是:ci = mi^e ( mod n ) ( a )解密时作如下计算:mi = ci^d ( mod n ) ( b )
{
a=a % b;
t=a;
RSA加密解密算法C语言代码(网络软件)
c[MAX-2]=0;
else if (a1[MAX-2]=='-')
c[MAX-2]='-';
else if (a2[MAX-2]=='-')
c[MAX-2]='-';
for(i=0;i<l1;i++)
{
for(j=0;j<l2;j++)
{
c[i]=(a1[i]+a2[i]+k)%10;
k=(a1[i]+a2[i]+k)/10;
}
if(l1>len)
{
for(i=len;i<l1;i++)
{
c[i]=(a1[i]+k)%10;
k=(a1[i]+k)/10;
}
if(k!=0)
{
c[l1]=k;
len=l1+1;
}
else len=l1;
temp[MAX-2]=0;
sub(a2,temp,c);
return;
}
else if (a2[MAX-2]=='-')
{
mov(a2,temp);
temp[98]=0;
sub(a1,temp,c);
return;
}
if(l1<l2)len=l1;
else len=l2;
for(i=0;i<len;i++)
l1=a1[99];
l2=a2[99];
rsa加密解密算法C语言代码
#include<stdio.h>#include<string.h>#include <stdlib.h>#include <time.h>#include <math.h>#include <malloc.h>#define MAX 100#define LEN sizeof(struct slink)void sub(int a[MAX],int b[MAX] ,int c[MAX] );struct slink{int bignum[MAX];/*bignum[98]用来标记正负号,1正,0负bignum[99]来标记实际长度*/struct slink *next;};/*/--------------------------------------自己建立的大数运算库-------------------------------------*/void print( int a[MAX] ){int i;for(i=0;i<a[99];i++)printf("%d",a[a[99]-i-1]);printf("\n\n");return;}int cmp(int a1[MAX],int a2[MAX]){ int l1, l2;int i;l1=a1[99];l2=a2[99];if (l1>l2)return 1;if (l1<l2)return -1;for(i=(l1-1);i>=0;i--){if (a1[i]>a2[i])return 1 ;if (a1[i]<a2[i])return -1;}return 0;}void mov(int a[MAX],int *b){int j;for(j=0;j<MAX;j++)b[j]=a[j];return ;}void mul(int a1[MAX],int a2[MAX],int *c) {int i,j;int y;int x;int z;int w;int l1, l2;l1=a1[MAX-1];l2=a2[MAX-1];if (a1[MAX-2]=='-'&& a2[MAX-2]=='-') c[MAX-2]=0;else if (a1[MAX-2]=='-')c[MAX-2]='-';else if (a2[MAX-2]=='-')c[MAX-2]='-';for(i=0;i<l1;i++){for(j=0;j<l2;j++){x=a1[i]*a2[j];y=x/10;z=x%10;w=i+j;c[w]=c[w]+z;c[w+1]=c[w+1]+y+c[w]/10;c[w]=c[w]%10;}}w=l1+l2;if(c[w-1]==0)w=w-1;c[MAX-1]=w;return;}void add(int a1[MAX],int a2[MAX],int *c) {int i,l1,l2;int len,temp[MAX];int k=0;l1=a1[MAX-1];l2=a2[MAX-1];if((a1[MAX-2]=='-')&&(a2[MAX-2]=='-')) {c[MAX-2]='-';}else if (a1[MAX-2]=='-'){mov(a1,temp);temp[MAX-2]=0;sub(a2,temp,c);return;}else if (a2[MAX-2]=='-'){mov(a2,temp);temp[98]=0;sub(a1,temp,c);return;}if(l1<l2)len=l1;else len=l2;for(i=0;i<len;i++){c[i]=(a1[i]+a2[i]+k)%10;k=(a1[i]+a2[i]+k)/10;}if(l1>len){for(i=len;i<l1;i++){c[i]=(a1[i]+k)%10;k=(a1[i]+k)/10;}if(k!=0){c[l1]=k;len=l1+1;}else len=l1;}else{for(i=len;i<l2;i++){c[i]=(a2[i]+k)%10;k=(a2[i]+k)/10;}if(k!=0){c[l2]=k;len=l2+1;}else len=l2;}c[99]=len;return;}void sub(int a1[MAX],int a2[MAX],int *c) {int i,l1,l2;int len,t1[MAX],t2[MAX];int k=0;l1=a1[MAX-1];l2=a2[MAX-1];if ((a1[MAX-2]=='-') && (a2[MAX-2]=='-')) {mov(a1,t1);mov(a2,t2);t1[MAX-2]=0;t2[MAX-2]=0;sub(t2,t1,c);return;}else if( a2[MAX-2]=='-'){mov(a2,t2);t2[MAX-2]=0;add(a1,t2,c);return;}else if (a1[MAX-2]=='-'){mov(a2,t2);t2[MAX-2]='-';add(a1,t2,c);return;}if(cmp(a1,a2)==1){len=l2;for(i=0;i<len;i++){if ((a1[i]-k-a2[i])<0){c[i]=(a1[i]-a2[i]-k+10)%10;k=1;}else{c[i]=(a1[i]-a2[i]-k)%10;k=0;}}for(i=len;i<l1;i++){if ((a1[i]-k)<0){c[i]=(a1[i]-k+10)%10;k=1;}else{c[i]=(a1[i]-k)%10;k=0;}}if(c[l1-1]==0)/*使得数组C中的前面所以0字符不显示了,如1000-20=0980--->显示为980了*/{len=l1-1;i=2;while (c[l1-i]==0)/*111456-111450=00006,消除0后变成了6;*/{len=l1-i;i++;}}else{len=l1;}}elseif(cmp(a1,a2)==(-1)){c[MAX-2]='-';len=l1;for(i=0;i<len;i++){if ((a2[i]-k-a1[i])<0){c[i]=(a2[i]-a1[i]-k+10)%10;k=1;}else{c[i]=(a2[i]-a1[i]-k)%10;k=0;}}for(i=len;i<l2;i++){if ((a2[i]-k)<0){c[i]=(a2[i]-k+10)%10;k=1;}else{c[i]=(a2[i]-k)%10;k=0;}}if(c[l2-1]==0){len=l2-1;i=2;while (c[l1-i]==0){len=l1-i;i++;}}else len=l2;}else if(cmp(a1,a2)==0){len=1;c[len-1]=0;}c[MAX-1]=len;return;}void mod(int a[MAX],int b[MAX],int *c)/*/c=a mod b//注意:经检验知道此处A和C的数组都改变了。
RSA算法C语言代码
RSA算法C语言代码以下是一个用C语言实现RSA算法的示例代码:```c#include <stdio.h>#include <stdlib.h>#include <math.h>//求最大公约数unsigned long long int gcd(unsigned long long int a, unsigned long long int b)if (b == 0)return a;} elsereturn gcd(b, a % b);}//判断是否为素数int isPrime(unsigned long long int n)unsigned long long int i;if (n <= 1)return 0;}for (i = 2; i <= sqrt(n); i++)if (n % i == 0)return 0;}}return 1;//求模反元素unsigned long long int modInverse(unsigned long long int a, unsigned long long int m)unsigned long long int i;a=a%m;for (i = 1; i < m; i++)if ((a * i) % m == 1)return i;}}return 0;//加密unsigned long long int encrypt(unsigned long long int m, unsigned long long int e, unsigned long long int n) unsigned long long int result = 1;while (e > 0)if (e % 2 == 1)result = (result * m) % n;}m=(m*m)%n;e=e/2;}return result;//解密unsigned long long int decrypt(unsigned long long int c, unsigned long long int d, unsigned long long int n) unsigned long long int result = 1;while (d > 0)if (d % 2 == 1)result = (result * c) % n;}c=(c*c)%n;d=d/2;}return result;int maiunsigned long long int p, q, n, phi, e, d, m, c; //选择两个素数p和qprintf("Enter two prime numbers p and q: "); scanf("%llu %llu", &p, &q);//检查输入是否为素数if (!isPrime(p) , !isPrime(q))printf("Both numbers should be prime.\n"); return 0;}// 计算n和phin=p*q;phi = (p - 1) * (q - 1);// 选择一个与phi互质的数e 1 < e < phifor (e = 2; e < phi; e++)if (gcd(e, phi) == 1)break;}}//计算e的模反元素dd = modInverse(e, phi);printf("Public key pair: (e, n) = (%llu, %llu)\n", e, n); printf("Private key pair: (d, n) = (%llu, %llu)\n", d, n); //输入明文printf("Enter message m: ");scanf("%llu", &m);//加密c = encrypt(m, e, n);printf("Encrypted message c: %llu\n", c);//解密m = decrypt(c, d, n);printf("Decrypted message m: %llu\n", m);return 0;```该代码实现了RSA算法的基本功能,包括选择两个素数p和q、计算n和phi、选择公钥和私钥、输入明文、加密、解密等操作。
RSA加解密算法C语言的实现
RSA加解密算法C语言的实现RSA算法的C语言实现需要用到大数运算库,因为RSA中的公钥和私钥都是大素数。
C语言中没有直接支持大数运算的数据类型,所以需要使用大数运算库来实现。
步骤1:生成公钥和私钥```c#include <stdio.h>#include "bignum.h"void generate_key(Bignum *public_key, Bignum *private_key, Bignum *modulus)Bignum p, q, phi, e;Bignum_init(&p);Bignum_init(&q);Bignum_init(&phi);Bignum_init(&e);//生成两个大素数p和qgenerate_prime(&p);generate_prime(&q);// 计算公钥模数 modulus = p * qBignum_mul(modulus, &p, &q);//计算欧拉函数e=(p-1)*(q-1)Bignum_sub(&p, &Bignum_one, &p);Bignum_sub(&q, &Bignum_one, &q);Bignum_mul(&phi, &p, &q);Bignum_copy(public_key, &e);// 计算私钥模数 private_key = e^(-1) mod phi Bignum_inverse(private_key, &e, &phi);//释放内存Bignum_clear(&p);Bignum_clear(&q);Bignum_clear(&phi);Bignum_clear(&e);void mainBignum public_key, private_key, modulus;Bignum_init(&public_key);Bignum_init(&private_key);Bignum_init(&modulus);generate_key(&public_key, &private_key, &modulus);printf("公钥: ");Bignum_print(&public_key);printf("\n");printf("私钥: ");Bignum_print(&private_key);printf("\n");printf("公钥模数: ");Bignum_print(&modulus);printf("\n");Bignum_clear(&public_key);Bignum_clear(&private_key);Bignum_clear(&modulus);```步骤2:加密数据RSA算法的第二步是用公钥对数据进行加密。
rsa加密算法c语言编程实验的步骤和内容
rsa加密算法c语言编程实验的步骤和内容## 1. RSA加密算法简介RSA加密算法是一种非对称加密算法,由三位数学家Rivest、Shamir和Adleman于1977年提出,是目前最广泛使用的公钥加密算法之一。
RSA算法的安全性基于大数分解的困难性,即将一个大的合数分解成其质数因子的乘积。
## 2. RSA加密算法的基本原理RSA加密算法基于公钥和私钥的概念,其中公钥用于加密数据,私钥用于解密数据。
具体的加密和解密过程如下:### 2.1 密钥生成过程- 选择两个大素数p和q,计算其乘积n = p * q。
- 计算欧拉函数值φ(n) = (p-1) * (q-1)。
- 选择一个整数e,使得1 < e < φ(n)且e与φ(n)互质。
- 计算e对于φ(n)的模反元素d,即满足(e * d) mod φ(n) = 1。
- 公钥为(n, e),私钥为(n, d)。
### 2.2 加密过程- 将明文M转化为整数m,满足0 <= m < n。
- 加密后的密文C = m^e mod n。
### 2.3 解密过程- 将密文C转化为整数c,满足0 <= c < n。
- 解密后的明文M = c^d mod n。
## 3. RSA加密算法的C语言实现步骤为了实现RSA加密算法的C语言程序,我们需要按照以下步骤进行:### 3.1 定义必要的数据结构和函数我们需要定义一个结构体来存储公钥和私钥的信息,包括n、e和d。
同时,我们还需要定义一些函数来实现加密和解密的过程,包括计算模幂、计算最大公约数等。
### 3.2 生成密钥对根据密钥生成过程,我们需要实现一个函数来生成公钥和私钥。
在这个函数中,我们需要选择两个大素数p和q,并计算n、φ(n)、e 和d的值,并将其存储在定义的结构体中。
### 3.3 实现加密函数实现加密函数,输入明文M和公钥(n, e),输出密文C。
在这个函数中,我们需要将明文转化为整数m,并通过计算模幂的方法得到加密后的密文。
RSA加密算法及其C语言实现
RSA加密算法及其C语言实现A. 加密解密1. 密钥的产生1) 找出两个相异的大素数P和Q,令N=P×Q,M=(P-1)(Q-1)。
2) 找出与M互素的大数E,用欧氏算法计算出大数D,使D×E≡1 MOD M。
3) 丢弃P和Q,公开E,D和N。
E和N即加密密钥,D和N即解密密钥。
2. 加密的步骤1) 计算N的有效位数tn(以字节数计),将最高位的零忽略掉,令tn1=tn-1。
比如N=0x012A05,其有效位数tn=5,tn1=4。
2) 将明文数据A分割成tn1位(以字节数计)的块,每块看成一个大数,块数记为bn。
从而,保证了每块都小于N。
3) 对A的每一块Ai进行Bi=Ai^E MOD N运算。
Bi就是密文数据的一块,将所有密文块合并起来,就得到了密文数据B。
3. 解密的步骤1) 同加密的第一步。
2) 将密文数据B分割成tn位(以字节数计)的块,每块看成一个大数,块数记为bn。
3) 对B的每一块Bi进行Ci=Bi^D MOD N运算。
Ci就是密文数据的一块,将所有密文块合并起来,就得到了密文数据C。
4. 定理及证明<定理>费马小定理:P是任意一个素数,Q是任意一个整数,则P^Q≡P MOD Q。
换句话说,如果P和Q互质,则P^(Q-1)≡1 MOD Q。
<证明>运用一些基本的群论知识,可以很容易地证出来,请参考群论的相关书籍。
<定理>若P,Q是相异素数,N=P×Q,M=(P-1)(Q-1)。
D×E≡1 MOD M。
A是任意一个正整数,B ≡A^E MOD N,C ≡B^D MOD N。
则C≡A MOD N。
<证明>因为D×E≡1 MOD M,所以D×E=kM+1,其中k是整数。
所以,C≡B^D≡(A^E)^D≡A^(E×D)≡A^(kM+1)MOD N。
1) 如果A不是P的倍数,也不是Q的倍数。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
RSA算法
1978年就出现了这种算法,它是第一个既能用于数据加密也能用于数字签名的算法。它易于理解和操作,也很流行。算法的名字以发明者的名字命名:Ron Rivest, AdiShamir和Leonard Adleman。但RSA的安全性一直未能得到理论上的证明。
RSA的安全性依赖于大数难于分解这一特点。公钥和私钥都是两个大素数(大于100个十进制位)的函数。据猜测,从一个密钥和密文推断出明文的难度等同于分解两个大素数的积。
} b--; //c=a * c % n; //这里也会溢出,若把64位整数拆为两个32位整数不知是否可以解决这个问题。
c=MulMod(a, c, n);
} return c;
}/*
Rabin-Miller素数测试,通过测试返回1,否则返回0。
n是待测素数。
注意:通过测试并不一定就是素数,非素数通过测试的概率是1/4
5,
7,
11,
13,
17,
19,
23,
29,
31,
37,
41,
43,
47,
53,
59,
61,
67,
71,
73,
79,
83,
89,
97
};
const static long g_PrimeCount=sizeof(g_PrimeTable) / sizeof(long);const unsigned __int64 multiplier=12747293821;
typedef struct RSA_PARAM_Tag
{
unsigned __int64 p, q; //两个素数,不参与加密解密运算
unsigned __int64 f; //f=(p-1)*(q-1),不参与加密解密运算
unsigned __int64 n, e; //公匙,n=p*q,gcd(e,f)=1
const unsigned __int64 adder=1343545677842234541;//随机数类
class RandNumber
{
/* */
private:
unsigned __int64 randSeed;/* */
public:
RandNumber(unsigned __int64 s=0);
*/
long RabinMillerKnl(unsigned __int64 &n)
{
unsigned __int64 b, m, j, v, i;
unsigned __int64 Random(unsigned __int64 n);
};/* */
RandNumber::RandNumber(unsigned __int64 s)
{
if(!s)
{
randSeed= (unsigned __int64)time(NULL);
}
else
{
randSeed=s;
unsigned __int64 d; //私匙,e*d=1 (mod f),gcd(n,d)=1
unsigned __int64 s; //块长,满足2^s<=n的最大的s,即log2(n)
} RSA_PARAM;//小素数表
const static long g_PrimeTable[]=
{
3,
由于进行的都是大数计算,使得RSA最快的情况也比DES慢上100倍,无论是软件还是硬件实现。速度一直是RSA的缺陷。一般来说只用于少量数据加密。
*/
#include <iostream>
#include <stdlib>
#include <time>using namespace std;//RSA算法所需参数
RSA可用于数字签名,方案是用( a )式签名,( b )式验证。具体操作时考虑到安全性和m信息量较大等因素,一般是先作HASH运算。RSA的安全性。RSA的安全性依赖于大数分解,但是否等同于大数分解一直未能得到理论上的证明,因为没有证明破解RSA就一定需要作大数分解。假设存在一种无须分解大数的算法,那它肯定可以修改成为大数分解算法。目前,RSA的一些变种算法已被证明等价于大数分解。不管怎样,分解n是最显然的攻击方法。现在,人们已能分解140多个十进制位的大素数。因此,模数n必须选大一些,因具体适用情况而定。
{
unsigned __int64 a=base, b=pow, c=1;
while(b)
{
while(!(b & 1))
{
b>>=1; //a=a * a % n; //函数看起来可以处理64位的整数,但由于这里a*a在a>=2^32时已经造成了溢出,因此实际处理范围没有64位
a=MulMod(a, a, n);
*/
inline unsigned __int64 MulMod(unsigned __int64 a, unsigned __int64 b, unsigned __int6;
}/*
模幂运算,返回值x=base^pow mod n
*/
unsigned __int64 PowMod(unsigned __int64 &base, unsigned __int64 &pow, unsigned __int64 &n)
}
}/* */
unsigned __int64 RandNumber::Random(unsigned __int64 n)
{
randSeed=multiplier * randSeed + adder;
return randSeed % n;
}static RandNumber g_Rnd;/*
模乘运算,返回值x=a*b mod n