RSA算法分析与编程实现

合集下载

RSA加密算法_源代码__C语言实现

RSA加密算法_源代码__C语言实现
密钥对的产生。选择两个大素数,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 )
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,

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算法python实现

RSA算法python实现

RSA算法python实现RSA算法是⼀种⾮对称加密算法,是现在⼴泛使⽤的公钥加密算法,主要应⽤是加密信息和数字签名。

详情请看维基:算法基本思路:1.公钥与私钥的⽣成:(1)随机挑选两个⼤质数 p 和 q,构造N = p*q;(2)计算欧拉函数φ(N) = (p-1) * (q-1);(3)随机挑选e,使得gcd(e, φ(N)) = 1,即 e 与φ(N) 互素;(4)计算d,使得 e*d ≡ 1 (mod φ(N)),即d 是e 的乘法逆元。

此时,公钥为(e, N),私钥为(d, N),公钥公开,私钥⾃⼰保管。

2.加密信息:(1)待加密信息(明⽂)为 M,M < N;(因为要做模运算,若M⼤于N,则后⾯的运算不会成⽴,因此当信息⽐N要⼤时,应该分块加密)(2)密⽂C = M e mod N(3)解密C d mod N = (M e)d mod N = M d*e mod N ;要理解为什么能解密?要⽤到欧拉定理(其实是费马⼩定理的推⼴)aφ(n)≡ 1 (mod n),再推⼴:aφ(n)*k≡ 1 (mod n),得:aφ(n)*k+1≡ a (mod n)注意到 e*d ≡ 1 mod φ(N),即:e*d = 1 + k*φ(N)。

因此,M d*e mod N = M1 + k*φ(N) mod N = M简单来说,别⼈⽤我的公钥加密信息发给我,然后我⽤私钥解密。

3.数字签名:(1)密⽂C = M d mod N(2)解密M = C e mod N = (M d)e mod N = M d*e mod N = M ;(原理同上)简单来说,我⽤⾃⼰的密钥加密签名,别⼈⽤我的公钥解密可以看到这是我的签名。

注意,这个不具有隐私性,即任何⼈都可以解密此签名。

算法的安全性:基于⼤整数N难以分解出p和q,构造φ(N);或由N直接构造φ(N)同样难。

算法的实现:1.快速幂取模;2.素性测试;3.扩展欧⼏⾥得求乘法逆元和最⼤公约数;实现代码:import randomdef fastExpMod(b, e, m):"""e = e0*(2^0) + e1*(2^1) + e2*(2^2) + ... + en * (2^n)b^e = b^(e0*(2^0) + e1*(2^1) + e2*(2^2) + ... + en * (2^n))= b^(e0*(2^0)) * b^(e1*(2^1)) * b^(e2*(2^2)) * ... * b^(en*(2^n))b^e mod m = ((b^(e0*(2^0)) mod m) * (b^(e1*(2^1)) mod m) * (b^(e2*(2^2)) mod m) * ... * (b^(en*(2^n)) mod m) mod m"""result = 1while e != 0:if (e&1) == 1:# ei = 1, then mulresult = (result * b) % me >>= 1# b, b^2, b^4, b^8, ... , b^(2^n)b = (b*b) % mreturn resultdef primeTest(n):q = n - 1k = 0#Find k, q, satisfied 2^k * q = n - 1while q % 2 == 0:k += 1;q /= 2a = random.randint(2, n-2);#If a^q mod n= 1, n maybe is a prime numberif fastExpMod(a, q, n) == 1:return"inconclusive"#If there exists j satisfy a ^ ((2 ^ j) * q) mod n == n-1, n maybe is a prime number for j in range(0, k):if fastExpMod(a, (2**j)*q, n) == n - 1:return"inconclusive"#a is not a prime numberreturn"composite"def findPrime(halfkeyLength):while True:#Select a random number nn = random.randint(0, 1<<halfkeyLength)if n % 2 != 0:found = True#If n satisfy primeTest 10 times, then n should be a prime numberfor i in range(0, 10):if primeTest(n) == "composite":found = Falsebreakif found:return ndef extendedGCD(a, b):#a*xi + b*yi = riif b == 0:return (1, 0, a)#a*x1 + b*y1 = ax1 = 1y1 = 0#a*x2 + b*y2 = bx2 = 0y2 = 1while b != 0:q = a / b#ri = r(i-2) % r(i-1)r = a % ba = bb = r#xi = x(i-2) - q*x(i-1)x = x1 - q*x2x1 = x2x2 = x#yi = y(i-2) - q*y(i-1)y = y1 - q*y2y1 = y2y2 = yreturn(x1, y1, a)def selectE(fn, halfkeyLength):while True:#e and fn are relatively primee = random.randint(0, 1<<halfkeyLength)(x, y, r) = extendedGCD(e, fn)if r == 1:return edef computeD(fn, e):(x, y, r) = extendedGCD(fn, e)#y maybe < 0, so convert itif y < 0:return fn + yreturn ydef keyGeneration(keyLength):#generate public key and private keyp = findPrime(keyLength/2)q = findPrime(keyLength/2)n = p * qfn = (p-1) * (q-1)e = selectE(fn, keyLength/2)d = computeD(fn, e)return (n, e, d)def encryption(M, e, n):#RSA C = M^e mod nreturn fastExpMod(M, e, n)def decryption(C, d, n):#RSA M = C^d mod nreturn fastExpMod(C, d, n)#Unit Testing(n, e, d) = keyGeneration(1024)#AES keyLength = 256X = random.randint(0, 1<<256)C = encryption(X, e, n)M = decryption(C, d, n) print"PlainText:", X print"Encryption of plainText:", C print"Decryption of cipherText:", M print"The algorithm is correct:", X == M Python。

RSA加密算法(C语言实现)

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算法

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语言算法实现

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算法分析和实现

RSA算法分析和实现

1.知识的准备1.1整除,因子•对整数 b!=0 及 a , 如果存在整数 m 使得 a=mb,称 b 整除 a, 也称b是a的因子•记作 b|a•例 1,2,3,4,6,8,12,24 整除 24•1|24, 2|24, 3|24, 4|24 …1.2 素数称整数p(p>1)是素数,如果p的因子只有±1,±p。

任一整数a(a>1)都能惟一地分解为以下形式:其中p1>p2>…pt是素数,ai>0(i=1,…,t)。

例如:91=7×13,11011=7×112×131.3 互素数•若满足下面2个条件,则称c是两个整数a、b的最大公因子,表示为c=gcd(a, b)。

① c是a的因子也是b的因子,即c是a、b的公因子。

② a和b的任一公因子,也是c的因子。

•如果gcd(a,b)=1,则称a和b互素。

•整数 a, b 互素是指,它们没有除1之外的其它因子•8 与15 互素•8的因子1,2,4,8•15的因子 1,3,5,15• 1 是唯一的公因子1.4模运算•设n是一正整数,a是整数,如果用n除a,得商为q,余数为r,则a=qn+r,0≤r<n,其中为小于或等于x的最大整数。

若用a mod n表示余数r,则:•如果(a mod n)=(b mod n),则称两整数a和b模n同余,记为a≡b mod n。

称与a模n同余的数的全体为a的同余类,记为[a],称a为这个同余类的表示元素。

注意:如果a≡0(mod n),则n|a同余有以下性质:①若n|(a-b),则a≡b mod n。

② (a mod n)≡(b mod n),则a≡b mod n。

③ a≡b mod n,则b≡a mod n。

④ a≡b mod n,b≡c mod n,则a≡c mod n。

从以上性质易知,同余类中的每一元素都可作为这个同余类的表示元素。

2. RSA算法的程序实现算法描述•独立地选取两大素数p和q(各100~200位十进制数字)•计算n=p×q,其欧拉函数值ϕ(n)=(p-1)(q-1)•随机选一整数e,1≤e<ϕ(n),gcd(ϕ(n), e)=1•在模ϕ(n)下,计算e的有逆元d=e -1 mod ϕ(n)•以n,e为公钥。

rsa算法c语言实现,(完整版)RSA算法C语言代码

rsa算法c语言实现,(完整版)RSA算法C语言代码

rsa算法c语⾔实现,(完整版)RSA算法C语⾔代码《(完整版)RSA算法C语⾔代码》由会员分享,可在线阅读,更多相关《(完整版)RSA算法C语⾔代码(5页珍藏版)》请在⼈⼈⽂库⽹上搜索。

1、include #include #include #include #include char s100,*c; int n,e,d,i,C,j,k=0,len; int str100,b30; unsigned gcd(unsigned a, unsigned b ) if(a%b=0) return b; else return gcd(b,a%b); void Egcd(int a, int b,int y=0; return ; if(ab) Egcd(a,b%a,x,y); x=(int) (b*y+1)/a; else Egcd(a%b,b,x,y); y=(int)(a*x-1)。

2、/b; void RSA() int p,q,N,Y; printf(请输⼊素数p和q:); scanf(%d %d, n=p*q; N=(p-1)*(q-1); 初始化随机数 产⽣随机整数e, e与N互质 /printf(n=%d N=%dn,n,N); srand( (unsigned)time( NULL ) );/ while(1) / e=rand()%N; / printf(e=%dn,e); if(e=0) continue;if(gcd(N,e)=1) break; /printf(e=%dn,e); Egcd(e,N,d,Y); / printf(d=%d Y=%dn,d,。

3、Y); printf( 公钥 PU=e=%d,n=%dn,e,n); printf( 私钥 PR=d=%d,n=%dn,d,n); void encrypt() /加密函数 len=strlen(s);/hgprintf(len=%dn,len); for(i=0;ilen;i+) /去掉 s100 中的空格 if(si122) bk=i; k+; for(j=i;jlen-1;j+) sj=sj+1; len-; slen=0; /结束符printf( 密⽂是: ); for(i=0;ilen;i+) C=1; /printf(shiji=%dn,si-97); for(int j=0;。

rsa算法代码c++语言

rsa算法代码c++语言

rsa算法代码c++语言RSA 算法是一种非对称加密算法,其中加密和解密使用的是不同的密钥,因此在 C++ 中实现 RSA 算法需要使用到一些复杂的数学运算和密码学知识。

以下是一个简单的 RSA 算法的示例代码,演示了如何生成密钥对以及进行加密和解密操作:```cpp#include <iostream>#include <vector>#include <cmath>#include <cstdlib>#include <ctime>using namespace std;// 生成大质数的函数bool isPrime(int n) {if (n <= 1)return false;if (n <= 3)return true;if (n % 2 == 0 || n % 3 == 0)return false;for (int i = 5; i * i <= n; i = i + 6)if (n % i == 0 || n % (i + 2) == 0)return false;return true;}// 生成随机大整数的函数int generateRandomPrime(int bits) {// 确保 bits 是一个有效的位数if (bits < 1)return -1;// 使用一个随机数生成器来生成一个随机的大整数random_device rd;mt19937 gen(rd());uniform_int_distribution<int> dis(0, (1 << bits) - 1);// 生成一个随机的大整数int num = dis(gen);// 检查生成的整数是否是质数while (!isPrime(num)) {num = dis(gen);}return num;}// RSA 加密函数vector<int> rsaEncrypt(vector<int> message, int publicKey) {vector<int> encryptedMessage;// 加密每个消息元素for (int i = 0; i < message.size(); i++) {int encrypted = message[i] ^ (publicKey * message[i]) % pow(2, message.size());encryptedMessage.push_back(encrypted);}return encryptedMessage;}// RSA 解密函数vector<int> rsaDecrypt(vector<int> encryptedMessage, int privateKey) {vector<int> message;// 解密每个密文元素for (int i = 0; i < encryptedMessage.size(); i++) {int decrypted = (privateKey * encryptedMessage[i]) % pow(2,encryptedMessage.size());message.push_back(decrypted);}return message;}int main() {// 生成密钥对int privateKey = generateRandomPrime(1024);int publicKey = privateKey * pow(2, privateKey - 1, privateKey);// 生成要加密的消息vector<int> message = {1, 2, 3, 4, 5};// 加密消息vector<int> encryptedMessage = rsaEncrypt(message, publicKey);// 输出密文cout << "密文: ";for (int i = 0; i < encryptedMessage.size(); i++)cout << encryptedMessage[i] << " ";cout << endl;// 解密密文vector<int> decryptedMessage = rsaDecrypt(encryptedMessage, privateKey);// 输出明文cout << "明文: ";for (int i = 0; i < decryptedMessage.size(); i++)cout << decryptedMessage[i] << " ";cout << endl;return 0;}```这段代码是一个简单的 RSA 算法的实现示例,主要包含了生成大质数、生成密钥对、加密和解密等功能。

RSA算法分析和实现

RSA算法分析和实现
总之,随着密码技术的进一步发展,以及计算机安全研究的技术人员的不断努力,我相信具有更高性能、更高效率的密码加密体制将会诞生。
六、教师评语
签名:
日期:
成绩
这个定理说明a经过编码为b在经过解码为C时,a==c mod n(n=pq)
但我们在做编码解码时,限制0<= a < n, 0 <= c < n,
所以这就是说a等於c,所以这个过程确实能做到编码解码的功能。
四、实验结果与数据处理
五、总结
通过对RSA公钥密码体制进行了分析与研究,了解了怎样的密码体制才能充分发挥RSA的安全作用。分析了RSA加密解密的安全性,以及如何选取RSA密钥长度的问题。同时我们考虑到在实际的应用过程中,在满足安全性前提下应当降低计算的复杂度,提高信息加、解密的速度。便于降低成本,利于推广应用等因素,目前国内外对RSA算法实现的研究大多是在运算速度很高的计算机上,在硬件上也主要采用串行处理,为了提高速度,安全性就必然很差,相反,为提高安全强度,则运算处理速度又会降低。在RSA算法中,最基本的算法主要包括模加、模乘、模逆和模幂运算。大数运算很费时间,尤其是大整数的模逆和模幂运算。为了得到较快的加/解密速度,本程序进行了深层次的优化,主要采用移位的方法,大大提高了RSA算法实际应用的运算速度和执行效率。
《应用密码学》实验报告
实验序号:03实验项目名称:RSA密码技术
学 号
姓 名
专业、班
实验地点
指导教师
实验时间
一、实验目的及要求
实验目的:
1.深入理解RSA原理,特别是大数分解难题的原理
2.明确选择RSA的参数p、q、e、d的条件,以及明文分段的条件
3.掌握求逆元素和求高次幂的计算方法

RSA加密算法的分析与实现实验指导书

RSA加密算法的分析与实现实验指导书

信息安全技术实验指导二RSA加密算法的分析与实现(4学时)一、实验目的1、比较深入了解RSA算法的加密、解密原理;2、通过RSA算法加密、解密过程的学习,进一步了解通用的公开密钥加密、解密的一般过程与原理;3、用一种程序工具进行RSA加密算法代码的调试运行。

二、实验说明1、本实验分两次进行,一共4个学时。

调试RSA算法代码,并将算法实现的思路彻底搞清楚理清,进行注释。

2、写出实验报告。

三、实验指导1、RSA算法介绍:它是第一个既能用于数据加密也能用于数字签名的算法。

它易于理解和操作,也很流行。

算法的名字以发明者的名字命名:Ron Rivest, Adi Shamir 和Leonard Adleman。

但RSA的安全性一直未能得到理论上的证明。

它经历了各种攻击,至今未被完全攻破。

2、RSA算法加密、解密过程:第一步、密钥生成:选两个大素数(比如100位)p,q,N=pq,随机选取两个e,d ,使e,d与φ(N)互素(其中φ(N)表示小于N的所有数中与N互为质数的个数),且ed ≡1mod φ(n);公开N、e作为E 记E=(N,e);保密p,q,d与φ(n),作为D,记(p,q,d,φ(n))(其中p,q 可丢弃,但绝不可泄露)。

第二步、加密过程:查出E=(N,e);将明文分组x=x1x2x3……x r……;加密:y i=E(x i)=x i e mod N。

第三步、信息传递:将密文信息y=y1y2y3……y r……传送出去。

第四步、解密:x i=D(y i)= y i d mod N;合并得明文。

例:用RSA加密算法传送数据2。

第一步、密钥生成:p=5,q=7, φ(n)=24,e=11则:d=e-1mod 24=11 第二步、加密:211mod 35=18第三步、数据传输…………第四步、解密:1811 mod 35=2四、实验要求根据附件中的RSA算法代码调试运行程序。

五、实验报告要求1、在标有“注释”的地方,说明此段代码的作用;将运行结果抓2、对程序代码的错处,调试改正,并加以指出。

RSA算法和实现及实例

RSA算法和实现及实例

<一>基础RSA算法非常简单,概述如下:找两素数p和q取n=p*q取t=(p-1)*(q-1)取任何一个数e,要求满足e<t并且e与t互素(就是最大公因数为1)取d*e%t==1这样最终得到三个数:n d e设消息为数M (M <n)设c=(M**d)%n就得到了加密后的消息c设m=(c**e)%n则m == M,从而完成对c的解密。

注:**表示次方,上面两式中的d和e可以互换。

在对称加密中:n d两个数构成公钥,可以告诉别人;n e两个数构成私钥,e自己保留,不让任何人知道。

给别人发送的信息使用e加密,只要别人能用d解开就证明信息是由你发送的,构成了签名机制。

别人给你发送信息时使用d加密,这样只有拥有e的你能够对其解密。

rsa的安全性在于对于一个大数n,没有有效的方法能够将其分解从而在已知n d的情况下无法获得e;同样在已知n e的情况下无法求得d。

或者说,rsa的安全性在于对于一个大数n,没有有效的办法将其分解成p和q。

<二>实践接下来我们来一个实践,看看实际的操作:找两个素数:p=47q=59这样n=p*q=2773t=(p-1)*(q-1)=2668取e=63,满足e<t并且e和t互素用perl简单穷举可以获得满主e*d%t ==1的数d:C:\Temp>perl -e "foreach $i (1..9999){ print($i),last if $i*63%2668==1 }"847即d=847最终我们获得关键的n=2773d=847e=63取消息M=244我们看看加密:c=M**d%n = 244**847%2773用perl的大数计算来算一下:C:\Temp>perl -Mbigint -e "print 244**847%2773"465即用d对M加密后获得加密信息c=465解密:我们可以用e来对加密后的c进行解密,还原M:m=c**e%n=465**63%2773 :C:\Temp>perl -Mbigint -e "print 465**63%2773"244即用e对c解密后获得m=244 , 该值和原始信息M相等。

RSA算法分析与编程实现

RSA算法分析与编程实现

实验二 RSA算法实验目的:1.深入了解RSA加密算法的加密原理2.通过编程模拟RSA算法的加密过程实验内容:一. RSA概述①RSA加密算法是一种最常用的非对称加密算法,CFCA在证书服务中离不了它。

在公钥加密标准和电子商业中,RSA被广泛使用。

②公钥和私钥1. 随意选择两个大的质数p和q,p不等于q,计算N=pq。

2. 根据欧拉函数,不大于N且与N互质的整数个数为(p-1)(q-1)3. 选择一个整数e与(p-1)(q-1)互质,并且e小于(p-1)(q-1)4. 用以下这个公式计算d:d× e≡ 1 (mod (p-1)(q-1))5. 将p和q的记录销毁。

(N,e)是公钥,(N,d)是私钥。

(N,d)是秘密的。

Alice将她的公钥(N,e)传给Bob,而将她的私钥(N,d)藏起来。

二.RSA算法的编程实现#include<iostream>#include<cmath>using namespace std;void main(){int p,q;//定义存放两个质数的变量cout<<"请输入两个较大的素数:"<<endl;cin>>p>>q;cout<<"p="<<p<<",q="<<q<<endl;int n,o;n=p*q;o=(p-1)*(q-1);cout<<"n="<<n<<",o="<<o<<endl;cout<<"请从【0,"<<o-1<<"】中选择一个与"<<o<<"互素的数e:"<<endl;int e,i;float d;cin>>e;//输入e值for(i=1;;i++)//计算d值{d=(float)(o*i+1)/e;if(d-(int)d==0)break;}cout<<"e="<<e<<",d="<<d<<endl;cout<<"公开密钥Pk={e,n}={"<<e<<","<<n<<"}"<<endl;//输出公开密钥cout<<"秘密密钥Sk={d,n}={"<<d<<","<<n<<"}"<<endl; //输出私密密钥cout<<endl;cout<<"请输入要加密的正整数(以-1结束):"<<endl;int m1[500],m3[500],m4[500];double m2[500];int j;for(j=0;j<500;j++)//对明文进行加密{cin>>m1[j];if(m1[j]==-1)break;m2[j]=pow(m1[j],e);m4[j]=m2[j]/n;m3[j]=m2[j]-m4[j]*n;}cout<<"密文为:"<<endl;int k;for(k=0;k<j;k++)//输出密文cout<<m3[k]<<" ";cout<<endl;}三.实例描述在以下实例中只选取小数值的素数p,q,以及e,假设用户A需要将明文“key”通过RSA加密后传递给用户B,过程如下:(1)设计公私密钥(e,n)和(d,n)。

RSA加密算法_源代码__C语言实现

RSA加密算法_源代码__C语言实现
} //1、随机取一个b,2<=b<n-1
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语言代码

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语言编程实验的步骤和内容## 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语言实现

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的倍数。

RSA算法和实现及实例

RSA算法和实现及实例

RSA算法和实现及实例一、RSA算法原理1.密钥生成首先,选择两个不相等的素数p和q,并计算它们的乘积n。

然后计算n的欧拉函数φ(n)=(p-1)(q-1)。

选择一个与φ(n)互质的数e,这个数即为公钥e。

然后选择一个数d,使得(d * e)mod φ(n) = 1,即d是e的模φ(n)的乘法逆元,d即为私钥。

2.加密解密加密时,将明文M进行加密,得到密文C = M^e mod n。

解密时,用私钥d对密文C进行解密,得到明文M = C^d mod n。

二、RSA算法实现实现RSA算法需要以下几个步骤:1.选择两个大素数p和q,计算乘积n=p*q。

2.计算n的欧拉函数φ(n)=(p-1)(q-1)。

3.选择一个与φ(n)互质的正整数e,计算其模φ(n)的乘法逆元d。

4.所得到的公钥为(e,n),私钥为(d,n)。

5. 加密时,将明文M通过公钥加密得到密文C = M^e mod n。

6. 解密时,用私钥对密文C进行解密得到明文M = C^d mod n。

三、RSA算法实例假设选择的两个素数p=13,q=17,计算乘积n=p*q=221计算n的欧拉函数φ(n)=(p-1)(q-1)=12*16=192选择一个与φ(n)互质的正整数e=5计算e的模φ(n)的乘法逆元d=77所以所得到的公钥为(e,n)=(5,221),私钥为(d,n)=(77,221)。

加密时,假设明文M = 8,利用公钥进行加密:C = M^e mod n =8^5 mod 221 = 40。

解密时,利用私钥进行解密:M = C^d mod n = 40^77 mod 221 = 8所以加密后的密文为40,解密后恢复得到原始明文为8总结:本文详细介绍了RSA算法的原理、实现方法以及一个实例。

RSA算法是一种非对称加密算法,通过选择两个大素数和计算乘积、欧拉函数、乘法逆元等步骤,实现了安全可靠的加密和解密过程。

通过加密后的密文可以通过相应的私钥解密得到原始明文,确保数据的安全性。

Python25行代码实现的RSA算法详解

Python25行代码实现的RSA算法详解

Python25⾏代码实现的RSA算法详解本⽂实例讲述了Python 25⾏代码实现的RSA算法。

分享给⼤家供⼤家参考,具体如下:⽹络上很多关于RSA算法的原理介绍,但是翻来翻去就是没有⼀个靠谱的算法实现,即使有代码介绍,也都是直接调⽤JDK或者Python代码包中的API实现,或者即使有代码也都写得特别烂。

⽆形中让⼈感觉RSA加密算法竟然这么⾼深,然后就看不下去了。

还有我发现对于“⼤整数的幂次乘⽅取模”竟然采⽤直接计算的幂次的值,再取模,类似于(2 ^ 1024) ^ (2 ^ 1024),这样的计算就直接去计算了,我不知道各位博主有没有运⾏他们的代码知道这个数字有多⼤吗?这么说吧,把全宇宙中的物质都做成硬盘都放不下,更何况你的512内存的电脑。

所以我说他们的代码只可远观⽽不可亵玩已。

于是我⽤了2天时间,没有去参考⽹上的代码重新开始把RSA算法的代码完全实现了⼀遍以后发现代码竟然这么少,25⾏就全部搞定。

为了⽅便整数的计算,我使⽤了Python语⾔。

为什么⽤Python?因为Python在数值计算上⽐较直观,⽽Java语⾔需要⽤到BigInteger类,数值的计算都是⽤⽅法调⽤,所以使⽤起来⽐较⿇烦。

如果有同学对我得代码感兴趣的话,先⼆话不说,不管3X7=22,把代码粘贴进pydev中运⾏⼀遍,是驴是马拉出来溜溜。

看不懂可以私信我,我就把代码具体讲讲,如果本⽂章没有⼈感兴趣,我就不做讲解了。

RSA算法的步骤主要有以下⼏个步骤:①、选择 p、q两个超级⼤的质数②、令n = p * q。

取φ(n) =(p-1) * (q-1)。

③、取 e ∈ 1 < e < φ(n) ,( n , e )为公钥对④、令 ed mod φ(n) = 1,取得d,( n , d ) 为私钥对。

利⽤扩展欧⼏⾥的算法进⾏计算。

⑤、销毁 p、q。

密⽂ = 明⽂ ^ e mod n ,明⽂ = 密⽂ ^ d mod n。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验二 RSA算法
实验目的:
1.深入了解RSA加密算法的加密原理
2.通过编程模拟RSA算法的加密过程
实验内容:
一. RSA概述
①RSA加密算法是一种最常用的非对称加密算法,CFCA在证书服务中离不了它。

在公钥加密标准和电子商业中,RSA被广泛使用。

②公钥和私钥
1.随意选择两个大的质数p和q,p不等于q,计算N=pq。

2.根据欧拉函数,不大于N且与N互质的整数个数为(p-1)(q-1)
3.选择一个整数e与(p-1)(q-1)互质,并且e小于(p-1)(q-1)
4.用以下这个公式计算d:d× e≡ 1 (mod (p-1)(q-1))
5.将p和q的记录销毁。

(N,e)是公钥,(N,d)是私钥。

(N,d)是秘密的。

Alice将她的公钥(N,e)传给Bob,而将她的私钥(N,d)藏起来。

二.RSA算法的编程实现
#include<iostream>
#include<cmath>
using namespace std;
void main()
{
int p,q;//定义存放两个质数的变量
cout<<"请输入两个较大的素数:"<<endl;
cin>>p>>q;
cout<<"p="<<p<<",q="<<q<<endl;
int n,o;
n=p*q;
o=(p-1)*(q-1);
cout<<"n="<<n<<",o="<<o<<endl;
cout<<"请从【0,"<<o-1<<"】中选择一个与"<<o<<"互素的数e:"<<endl;
int e,i;
float d;
cin>>e;//输入e值
for(i=1;;i++)//计算d值
{
d=(float)(o*i+1)/e;
if(d-(int)d==0)
break;
}
cout<<"e="<<e<<",d="<<d<<endl;
cout<<"公开密钥Pk={e,n}={"<<e<<","<<n<<"}"<<endl;//输出公开密钥
cout<<"秘密密钥Sk={d,n}={"<<d<<","<<n<<"}"<<endl; //输出私密密钥
cout<<endl;
cout<<"请输入要加密的正整数(以-1结束):"<<endl;
int m1[500],m3[500],m4[500];
double m2[500];
int j;
for(j=0;j<500;j++)//对明文进行加密
{
cin>>m1[j];
if(m1[j]==-1)
break;
m2[j]=pow(m1[j],e);
m4[j]=m2[j]/n;
m3[j]=m2[j]-m4[j]*n;
}
cout<<"密文为:"<<endl;
int k;
for(k=0;k<j;k++)//输出密文
cout<<m3[k]<<" ";
cout<<endl;
}
三.实例描述
在以下实例中只选取小数值的素数p,q,以及e,假设用户A需要将明文“key”通过RSA 加密后传递给用户B,过程如下:
(1)设计公私密钥(e,n)和(d,n)。

令p=3,q=11,得出n=p×q=3×11=33;f(n)=(p-1)(q-1)=2×10=20;取e=3,(3与20互质)则e×d≡1 mod f(n),即3×d≡1 mod 20。

d怎样取值呢?可以用试算的办法来寻找。

试算结果见下表:
通过试算我们找到,当d=7时,e×d≡1 mod f(n)同余等式成立。

因此,可令d=7。

从而我们可以设计出一对公私密钥,加密密钥(公钥)为:KU =(e,n)=(3,33),解密密钥(私钥)为:KR =(d,n)=(7,33)。

(2)英文数字化。

将明文信息数字化,并将每块两个数字分组。

假定明文英文字母编码表为按字母顺序排列数值,即:
则得到分组后的key的明文信息为:11,05,25。

(3)明文加密
用户加密密钥(3,33) 将数字化明文分组信息加密成密文。

由C≡Me(mod n)得:
因此,得到相应的密文信息为:11,26,16。

(4)密文解密。

用户B收到密文,若将其解密,只需要计算M= Cd(mod n),即:
用户B得到明文信息为:11,05,25。

根据上面的编码表将其转换为英文,我们又得到了恢复后的原文“key”。

当然,实际运用要比这复杂得多,由于RSA算法的公钥私钥的长度(模长度)要到1024
位甚至2048位才能保证安全,因此,p、q、e的选取、公钥私钥的生成,加密解密模指数运算都有一定的计算程序,需要仰仗计算机高速完成。

四.运行结果
五.RSA的安全性
在RSA密码应用中,公钥KU是被公开的,即e和n的数值可以被第三方窃听者得到。

破解RSA密码的问题就是从已知的e和n的数值(n等于pq),想法求出d的数值,这样就可以得到私钥来破解密文。

从上文中的公式:d ≡e-1 (mod((p-1)(q-1)))或de≡1 (mod((p-1)(q-1))) 我们可以看出。

密码破解的实质问题是:从pq的数值,去求出(p-1)和(q-1)。

换句话说,只要求出p和q的值,我们就能求出d的值而得到私钥。

当p和q是一个大素数的时候,从它们的积pq去分解因子p和q,这是一个公认的数学难题。

比如当pq大到1024位时,迄今为止还没有人能够利用任何计算工具去完成分解因子的任务。

然而,虽然RSA的安全性依赖于大数的因子分解,但并没有从理论上证明破译RSA的难度与大数分解难度等价。

即RSA的重大缺陷是无法从理论上把握它的保密性能如何。

此外,RSA的缺点还有:A)产生密钥很麻烦,受到素数产生技术的限制,因而难以做到一次一密。

B)分组长度太大,为保证安全性,n 至少也要 600 bits 以上,使运算代价很高,尤其是速度较慢,较对称密码算法慢几个数量级;且随着大数分解技术的发展,这个长度还在增加,不利于数据格式的标准化。

因此,使用RSA只能加密少量数据,大量的数据加密还要靠对称加密算法。

六.心得体会
通过本次实验,我对非对称加密算法RSA的理解加深了,会运用一些现成的算法进行编程,对一些比较复杂的算法有了进一步的认识。

相关文档
最新文档