RSA加解密算法C语言的实现

合集下载

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

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加密解密算法是一种公钥加密算法,发明于1977年,基于两个大质数的乘积难分解性,能够对短文本进行加解密。

以下是RSA加密解密算法的C语言程序。

一、密钥生成首先定义了一个结构体存储RSA密钥,该结构体包含三个元素:n、e和d。

- n = p * q,其中p和q为大质数;- e为与(p - 1) * (q - 1)互质的自然数,一般选取65537;- d为e模(p - 1) * (q - 1)的逆元素,即满足e * d ≡ 1 (mod (p - 1) * (q - 1)))的自然数。

generateRSAKey函数通过调用randomPrime函数生成两个大质数p和q,再通过Euclidean函数计算(p - 1) * (q - 1)的值phi,最后继续使用extendedEuclidean函数计算d的值,最终将生成的密钥存储在RSAKey结构体中。

```c#include <stdio.h>#include <stdlib.h>#include <time.h>#include <math.h>#define k 1024 // 密钥长度typedef struct {unsigned long long n;unsigned long long e;unsigned long long d;} RSAKey;unsigned long long randomPrime(unsigned long long n);unsigned long long gcd(unsigned long long a, unsigned long long b);unsigned long long Euclidean(unsigned long long a, unsigned long long b);RSAKey generateRSAKey();// 生成一个小于n的随机质数unsigned long long randomPrime(unsigned long long n) {unsigned long long p;do {p = rand() % n;while (!(p & 1)) // 确保p为奇数p = rand() % n;} while (gcd(p, n) != 1); // 确保p和n互质return p;}二、加密和解密下面定义了两个函数:encrypt和decrypt,其中encrypt函数用于将明文转换为密文,decrypt函数用于将密文转换为明文。

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实现示例,用于加密和解密一个整数。

加解密实验报告

加解密实验报告

一、实验模块1. 实验名称:加解密实验2. 实验目的:掌握基本的加密和解密方法,理解加密算法的工作原理,并能够使用C语言实现加解密功能。

3. 实验环境:Windows操作系统,C语言编译器(如Visual Studio)二、实验标题加解密实验:基于RSA算法和DES算法的加密与解密三、实验内容概述本次实验主要涉及两种加密算法:RSA算法和DES算法。

通过学习这两种算法的原理,使用C语言实现加解密功能,并验证加密和解密过程是否正确。

四、实验日期、实验操作者实验日期:2023年10月15日实验操作者:张三五、实验目的1. 理解RSA算法和DES算法的原理。

2. 使用C语言实现RSA算法和DES算法的加解密功能。

3. 验证加密和解密过程是否正确。

六、实验步骤1. RSA算法原理及实现(1)生成密钥对:使用C语言实现RSA算法的密钥生成过程,生成公钥和私钥。

(2)加密过程:使用公钥对明文进行加密,得到密文。

(3)解密过程:使用私钥对密文进行解密,得到明文。

2. DES算法原理及实现(1)密钥生成:生成DES算法的密钥,通常为56位。

(2)加密过程:使用DES算法对明文进行加密,得到密文。

(3)解密过程:使用DES算法对密文进行解密,得到明文。

3. 验证加密和解密过程(1)选择一段明文,分别使用RSA算法和DES算法进行加密,记录密文。

(2)使用相应的私钥或密钥对密文进行解密,得到明文。

(3)比较加密后的密文和解密后的明文,验证加密和解密过程是否正确。

七、实验环境1. 操作系统:Windows 102. 编译器:Visual Studio 20193. 编程语言:C语言八、实验过程1. RSA算法实验(1)生成密钥对```c#include <stdio.h>#include <stdlib.h>// RSA算法生成密钥对void generateKeys(int n, int e, int d, int p, int q) {// 初始化公钥和私钥p = 61;q = 53;n = p q;e = 17;// 计算私钥d = 2753;}int main() {int p, q, n, e, d;generateKeys(&p, &e, &d, &q, &n);printf("Public Key: (%d, %d)\n", n, e); printf("Private Key: (%d, %d)\n", n, d); return 0;}```(2)加密过程```c#include <stdio.h>#include <math.h>// RSA算法加密int encrypt(int m, int n, int e) {int c = pow(m, e) % n;return c;}int main() {int m, n, e, c;printf("Enter the message: ");scanf("%d", &m);printf("Public Key: (%d, %d)\n", n, e);c = encrypt(m, n, e);printf("Encrypted Message: %d\n", c);return 0;}```(3)解密过程```c// RSA算法解密int decrypt(int c, int n, int d) {int m = pow(c, d) % n;return m;}int main() {int c, n, d, m;printf("Enter the encrypted message: "); scanf("%d", &c);printf("Private Key: (%d, %d)\n", n, d); m = decrypt(c, n, d);printf("Decrypted Message: %d\n", m);return 0;}```2. DES算法实验(1)密钥生成```c#include <stdio.h>// DES算法密钥生成void generateDESKey(char key, char desKey) {// 将密钥转换为DES密钥for (int i = 0; i < 56; i++) {desKey[i] = key[i / 8] & (1 << (7 - (i % 8))); }}int main() {char key[8];char desKey[56];printf("Enter the DES key: ");scanf("%s", key);generateDESKey(key, desKey);printf("DES Key: ");for (int i = 0; i < 56; i++) {printf("%02x", desKey[i]);}printf("\n");return 0;}```(2)加密过程```c#include <stdio.h>// DES算法加密void encryptDES(char input, char key, char output) { // 使用DES算法对输入数据进行加密// 此处省略加密算法的具体实现}int main() {char input[64];char key[8];char output[64];printf("Enter the message: ");scanf("%s", input);printf("DES Key: ");scanf("%s", key);encryptDES(input, key, output);printf("Encrypted Message: %s\n", output);return 0;}```(3)解密过程```c#include <stdio.h>// DES算法解密void decryptDES(char input, char key, char output) { // 使用DES算法对输入数据进行解密// 此处省略解密算法的具体实现}int main() {char input[64];char key[8];char output[64];printf("Enter the encrypted message: ");scanf("%s", input);printf("DES Key: ");scanf("%s", key);decryptDES(input, key, output);printf("Decrypted Message: %s\n", output);return 0;}```3. 验证加密和解密过程(1)RSA算法验证```c#include <stdio.h>#include <math.h>// RSA算法加密int encrypt(int m, int n, int e) {int c = pow(m, e) % n;return c;}// RSA算法解密int decrypt(int c, int n, int d) {int m = pow(c, d) % n;return m;}int main() {int m, n, e, d, c, m2;printf("Enter the message: ");scanf("%d", &m);printf("Public Key: (%d, %d)\n", n, e);c = encrypt(m, n, e);printf("Encrypted Message: %d\n", c);printf("Enter the Private Key: (%d, %d)\n", n, d); m2 = decrypt(c, n, d);printf("Decrypted Message: %d\n", m2);if (m == m2) {printf("Encryption and Decryption are successful!\n"); } else {printf("Encryption and Decryption failed!\n");}return 0;}```(2)DES算法验证```c#include <stdio.h>// DES算法加密void encryptDES(char input, char key, char output) {// 使用DES算法对输入数据进行加密// 此处省略加密算法的具体实现}// DES算法解密void decryptDES(char input, char key, char output) {// 使用DES算法对输入数据进行解密// 此处省略解密算法的具体实现}int main() {char input[64];char key[8];char output[64];printf("Enter the message: ");scanf("%s", input);printf("DES Key: ");scanf("%s", key);encryptDES(input, key, output);printf("Encrypted Message: %s\n", output);decryptDES(output, key, input);printf("Decrypted Message: %s\n", input);if (strcmp(input, "Hello") == 0) {printf("Encryption and Decryption are successful!\n");} else {printf("Encryption and Decryption failed!\n");}return 0;}```九、实验结论通过本次实验,我们掌握了RSA算法和DES算法的原理,并使用C语言实现了加解密功能。

非对称加密解密算法RSA的C实现

非对称加密解密算法RSA的C实现

非对称加密解密算法RSA的C实现RSA加密算法是一种非对称加密算法,常用于数据加密和数字签名。

其安全性基于大数分解的困难性,即质因数分解。

RSA加密算法的全称为Rivest-Shamir-Adleman加密算法,是由Ron Rivest、Adi Shamir和Leonard Adleman于1977年共同提出的。

RSA算法的加密过程如下:1.选择两个不同的质数p和q,计算它们的乘积n=p*q。

2.选择一个整数e,满足1<e<φ(n),且e和φ(n)互质,其中φ(n)=(p-1)*(q-1)。

3. 计算e关于φ(n)的模反元素d,即满足(e*d)mod φ(n) = 14.公钥为(n,e),私钥为(n,d)。

5. 对于要加密的明文m,使用公钥(n, e)进行加密,得到密文c,公式为c = (m^e)mod n。

6. 对于要解密的密文c,使用私钥(n, d)进行解密,得到明文m,公式为m = (c^d)mod n。

以下是使用C语言实现RSA加密和解密的代码:```c#include <stdio.h>#include <stdlib.h>#include <math.h>//求最大公约数int gcd(int a, int b)if (b == 0)return a;return gcd(b, a % b);//求模反元素int mod_inverse(int e, int phi) int d;for (d = 1; d <= phi; d++)if ((e * d) % phi == 1)return d;}return -1; // 模反元素不存在//加密函数int encrypt(int m, int e, int n) int c = fmod(pow(m, e), n); return c;//解密函数int decrypt(int c, int d, int n)int m = fmod(pow(c, d), n);return m;//主函数int maiint p, q, n, phi, e, d, m, c;printf("请输入两个质数p和q: ");scanf("%d%d", &p, &q);n=p*q;phi = (p - 1) * (q - 1);printf("请输入一个整数e(1 < e < %d且与%d互质): ", phi, phi);scanf("%d", &e);// 检查e和phi是否互质if (gcd(e, phi) != 1)printf("输入的e不符合要求,请重新输入!\n");return 0;}d = mod_inverse(e, phi);if (d == -1)printf("模反元素不存在,解密失败!\n");return 0;}printf("请输入要加密的明文m: ");scanf("%d", &m);c = encrypt(m, e, n);printf("加密后的密文c为: %d\n", c);m = decrypt(c, d, n);printf("解密后的明文m为: %d\n", m);return 0;```以上代码中,首先通过输入两个质数p和q,计算得到公共模数n和欧拉函数φ(n),然后要求输入一个符合条件的整数e,通过计算求得模反元素d。

RSA加解密算法C语言的实现

RSA加解密算法C语言的实现

RSA加解密算法C语言的实现RSA(Rivest-Shamir-Adleman)是一种非对称加密算法,常用于保护网络通信的安全性。

它的主要思想是通过生成一对公钥和私钥,使用公钥进行加密,使用私钥进行解密,从而保证安全性。

RSA算法的实现一般包括生成密钥对、加密和解密三个部分。

1.生成密钥对RSA算法的第一步是生成一对公钥和私钥。

生成密钥对的过程如下:1)选择两个较大的质数p和q;2)计算N=p*q,确定模数N;3)计算欧拉函数φ(N)=(p-1)*(q-1);4)选择一个整数e,满足1<e<φ(N)且e与φ(N)互质;5)计算e关于模φ(N)的乘法逆元d,满足d * e ≡ 1 (modφ(N))。

生成密钥对的代码实现如下:```c#include <stdio.h>typedef unsigned long long int ulli;ulli gcd(ulli a, ulli b)if (b == 0)return a;}return gcd(b, a % b);ulli inverse(ulli e, ulli phi)ulli d = 0;ulli x1 = 0, x2 = 1, y1 = 1, y2 = 0; ulli temp_phi = phi;while (e > 0)ulli quotient = phi / e;ulli remainder = phi - quotient * e; phi = e;e = remainder;ulli x = x2 - quotient * x1;ulli y = y2 - quotient * y1;x2=x1;x1=x;y2=y1;y1=y;}if (phi != 1)return -1; // 没有乘法逆元}if (y2 < 0)d = temp_phi + y2;} elsed=y2;}return d;int mainulli p, q, N, phi, e, d;printf("Enter two prime numbers: ");scanf("%llu %llu", &p, &q);N=p*q;phi = (p - 1) * (q - 1);printf("Enter a number e such that 1 < e < phi(N) and gcd(e, phi(N)) = 1: ");scanf("%llu", &e);d = inverse(e, phi);printf("Public Key (N, e) = (%llu, %llu)\n", N, e);printf("Private Key (N, d) = (%llu, %llu)\n", N, d);return 0;```2.加密RSA算法的第二步是使用公钥进行加密。

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加密算法了。

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++语言

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加密解密算法C语言代码

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

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语言实现 实验报告

RSA算法C语言实现 实验报告

广州大学学生实验报告开课学院及实验室:年月日学院年级、专业、班姓名学号实验课程名称成绩实验项目名称实验4 非对称密码算法实验指导老师实验目的掌握产生RSA密钥对的程序设计方法掌握产生RSA加密/解密的程序设计方法实验内容编写函数求出1~65535之间的全部素数取8-bit的两个素数p,q,并用来生成一对RSA密钥编写RSA加密/解密程序(可以限制N为16-bit,并利用上述的p,q)加密你的学号+姓名并随后解密实验步骤【RSA算法流程】加密:1、取8-bit的两个素数p,q,并用来生成一对RSA密钥2、根据欧拉函数,求得r=(p-1)(q-1)3、选择一个小于r的整数e,求得e关于模r的模反元素,命名为d。

(模反元素存在,当且仅当e与r互质)4、(N,e)是公钥,(N,d)是私钥。

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

5、利用公式将n加密为c,公式:)(m od Ncn e≡,其中e为公钥解密:利用公式将c加密为n ,公式:)(mod Nnc d≡,其中d为私钥RSA算法的C代码实现1、判断是否为素数2、随机产生素数p,q,最大为8bit3、产生公钥e(根据欧拉函数r,从2开始遍历寻找符合条件的e,直到int变量溢出)4、产生私钥d(从1开始遍历符合条件的d,直到变量溢出)5、实现加解密公式的代码(a是加解密文本,b为公钥或私钥,c为N=pq)运行结果截屏:实验中遇到的问题与解决方法:1、p,q值过大,导致加密后数据溢出(将获得的p,q的结果mod 254后加1)2、加密后的数据用char类型存储溢出(char类型太小,改用int或更大的数据类型存储加密结果更好)3、cin遇到空格直接返回结果,没有获取空格后的字符串,无法一次读取学号+空格+姓名(改用gets函数)4、scanf函数与gets函数冲突(这是因为二者使用的结束标记不同。

输入字符串时,scanf()或cin>>遇到空格、回车、Tab 结束,但在缓冲区中还留着这些结束符,此后如果使用gets()想去获取下一行字符串,它碰到的却是前面遗留下来的回车(或者回车之前还有空格等空白符),那么这次gets()就直接失效了,解决方法:用一句while(getchar()!='\n'); 来处理掉缓冲区里的回车换行符,或者改用cin函数)5、p,q值过小,导致N过小,加密后的字符无法被解密还原为原文(这是因为公式mod N,结果的范围从0~N-1,所以假如N小于原文的值则解密将出错,解决方法为扩大p,q取值,所以p,q按课件的要求取8bit范围的数可能会出错,范围要扩大到涵盖原文取值,建议取值为逼近8bit的素数)实验总结:略。

rsa加密算法_源代码_c__实现

rsa加密算法_源代码_c__实现

RSA算法#include <iostream>#include <stdlib>#include <time>using namespace std;//RSA算法所需参数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)=1unsigned __int64 d; //私匙,e*d=1 (mod f),gcd(n,d)=1unsigned __int64 s; //块长,满足2^s<=n的最大的s,即log2(n)} RSA_PARAM;//小素数表const static long g_PrimeTable[]={3,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;const unsigned __int64 adder=1343545677842234541;//随机数类class RandNumber{/* */private:unsigned __int64 randSeed;/* */public:RandNumber(unsigned __int64 s=0);unsigned __int64 Random(unsigned __int64 n);};/* */RandNumber::RandNumber(unsigned __int64 s){if(!s){randSeed= (unsigned __int64)time(NULL);}else{randSeed=s;}}/* */unsigned __int64 RandNumber::Random(unsigned __int64 n){randSeed=multiplier * randSeed + adder;return randSeed % n;}static RandNumber g_Rnd;/*模乘运算,返回值x=a*b mod n*/inline unsigned __int64 MulMod(unsigned __int64 a, unsigned __int64 b, unsigned __int64 n) {return a * b % n;}/*模幂运算,返回值x=base^pow mod n*/unsigned __int64 PowMod(unsigned __int64 &base, unsigned __int64 &pow, unsigned __int64 &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);} b--; //c=a * c % n; //这里也会溢出,若把64位整数拆为两个32位整数不知是否可以解决这个问题。

rsa加密解密算法C语言代码

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的数组都改变了。

基于VC的RSA加密与解密实现技术

基于VC的RSA加密与解密实现技术

基于VC的RSA加密与解密实现技术一、RSA基本原理对明文分组M和密文分组C,加密与解密过程如下:C = POW (M , e) mod nM = POW(C , d) mod n = POW(POW( M ,e), d) mod n=POW( M,e*d)其中POW是指数函数,mod是求余数函数。

其中收发双方均已知n,发送放已知e,只有接受方已知d,因此公钥加密算法的公钥为KU={ e , n},私钥为KR={d , n}。

该算法要能用做公钥加密,必须满足下列条件:1. 可以找到e ,d和n,使得对所有M<n ,POW(M ,e*d)=M mod n .2. 对所有M<n,计算POW (M , e)和POW(C , d)是比较容易的。

3. 由e 和n确定d是不可行的下面介绍RSA算法,该算法中到的下列的元素:两个素数p, q (保密的,选定的)n=p*q (公开的,计算得出的)e , gcd ( x(n),e) =1;1<e<x(n) (公开的,选定的)d≡POW(e,-1) mod x(n) (保密的,计算得出的)这里,私钥为{d ,n},公钥为{e ,n}。

假定用户A已公布了其公钥,用户B要发送消息M给A,那么用户B计算C= POW (M , e) mod n,并发送C,在接受端,用户A计算M = POW(C , d) mod n 以解出消息M。

二、开发平台及语言1、开发平台:Microsoft V isual Studio c++ 6.02.语言:c++三、应用程序界面设计及变量的连接和方法的名称对象ID Caption 连接变量或方法成组框IDC_STA TIC 产生密钥过程无编辑框IDC_PRIME_EDIT1 无m_PrimeEdit1/long编辑框IDC_PRIME_EDIT2 无m_PrimeEdit2/long编辑框IDC_PUBN_EDIT 无m_PubNEdit/long编辑框IDC_PUBX_EDIT 无m_PubXEdit/long编辑框IDC_PUBKEY_EDI 无m_PubKeyEdit/long编辑框IDC_PRIKEY_EDIT 无m_PriKeyEdit/CEdit命令按钮IDC_CALCULA TE_BUTTON 计算OnCalculateButton()命令按钮IDC_PUBKEY_BUTTON 公有密钥OnPubkeyButton()命令按钮IDC_PRIKEY_BUTTON 私有密钥OnPrikeyButton()命令按钮IDC_HIDE_PRIKEY_BUTTON 隐藏私钥OnHidePrikeyButton()命令按钮IDC_SHOW_PRIKEY_BUTTON 显示私钥OnShowPrikeyButton()命令按钮IDC_STA TIC 加密和解密过程无编辑框IDC_RESOURCE_EDIT 无m_ResourceEdit/CEditOnChangeResourceEdit()编辑框IDC_CRYPTOGRAPH_EDIT 无m_CryptographEdit/CEdit编辑框IDC_OPEN_EDIT 无m_OpenEdit/CEdit编辑框IDC_LINE 无m_Line/CEdit编辑框IDC_CHAR 无m_Char/CEdit命令按钮IDC_ENCRYPT_BUTTON 数字加密OnEncryptButton()命令按钮IDC_OPEN_BUTTON 数字解密OnOpenButton()命令按钮IDC_CLEAR_BUTTON Clear OnClearButton()命令按钮IDC_EXIT_BUTTON Exit OnExitButton()命令按钮IDC_ENCRYPT_TEXT_BUTTON 文本加密OnEncryptTextButton()命令按钮IDC_OPEN_TEXTBUTTON 文本解密OnOpenTextbutton()菜单ID_CALCULA TE_MENU 计算OnCalculateMenu()菜单ID_PUBKEY_MENU 公有密钥OnPubkeyMenu()菜单ID_PRIKEY_MENU 私有密钥OnPrikeyMenu()菜单ID_HIDE_MENU 隐藏私钥OnHideMenu()菜单ID_SHOW_MENU 显示私钥OnShowMenu()菜单ID_CLEAR_MENU 清除OnClearMenu()菜单ID_EXIT_MENU 退出OnExitMenu()菜单ID_ENCRYPTNUM_MENU 数字加密OnEncryptnumMenu()菜单ID_OPENNUM_MENU 数字解密OnOpennumMenu()菜单ID_ENCRYPTTEXT_MENU 文本加密OnEncrypttextMenu()菜单ID_OPENTEXT_MENU 文本解密OnOpentextMenu()菜单ID_ABOUT_MENU 关于OnAboutMenu()四、RSADlg.h声明// RSADlg.h : header file#if !defined(AFX_RSADLG_H__D491C4A6_0DE9_4430_BE31_2150D1C5E35F__INCLUDE D_)#define AFX_RSADLG_H__D491C4A6_0DE9_4430_BE31_2150D1C5E35F__INCLUDED_ #if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000#include <math.h>/////////////////////////////////////////////////////////////////// CRSADlg dialogclass CRSADlg : public CDialog{// Constructionpublic:char CalculateModOfChar(double num1, double num2);char CalculateModOfChar(const char cChar, double num,long *ps);double calculatemod(double num1, double num2);int primeNumber(long m);CRSADlg(CWnd* pParent = NULL); // standard constructor// Dialog Data//{{AFX_DA TA(CRSADlg)enum { IDD = IDD_RSA_DIALOG };CEdit m_OpenEdit;CEdit m_CryptographEdit;CEdit m_PriKeyEdit;CEdit m_ResourceEdit;CEdit m_Line;CEdit m_Char;long m_PubNEdit;long m_PubXEdit;long m_PrimeEdit1;long m_PrimeEdit2;long m_PubKeyEdit;//}}AFX_DA TA// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CRSADlg)protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support//}}AFX_VIRTUAL// Implementationprotected:HICON m_hIcon;// Generated message map functions//{{AFX_MSG(CRSADlg)virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();afx_msg void OnCalculateButton();afx_msg void OnPubkeyButton();afx_msg void OnPrikeyButton();afx_msg void OnChangeResourceEdit();afx_msg void OnHidePrikeyButton();afx_msg void OnShowPrikeyButton();afx_msg void OnClearButton();afx_msg void OnExitButton();afx_msg void OnEncryptButton();afx_msg void OnOpenButton();afx_msg void OnEncryptTextButton();afx_msg void OnOpenTextbutton();afx_msg void OnCalculateMenu();afx_msg void OnPubkeyMenu();afx_msg void OnPrikeyMenu();afx_msg void OnHideMenu();afx_msg void OnShowMenu();afx_msg void OnClearMenu();afx_msg void OnExitMenu();afx_msg void OnEncryptnumMenu();afx_msg void OnOpennumMenu();afx_msg void OnEncrypttextMenu();afx_msg void OnOpentextMenu();afx_msg void OnAboutMenu();//}}AFX_MSGDECLARE_MESSAGE_MAP()private:long lArrayOfCount[300]; //文本加密和解密过程中记数功能};//{{AFX_INSERT_LOCA TION}}// Microsoft V isual C++ will insert additional declarations immediately before the previous line. #endif// !defined(AFX_RSADLG_H__D491C4A6_0DE9_4430_BE31_2150D1C5E35F__INCLUDED _)五、映射消息的应用程序代码1、void CRSADlg::OnCalculateButton() //计算按钮处理函数{UpdateData(TRUE);int flag1,flag2;flag1=primeNumber(m_PrimeEdit1);flag2=primeNumber(m_PrimeEdit2);if(flag1==1)m_PrimeEdit1=m_PrimeEdit1;else m_PrimeEdit1=0;if(flag2==1)m_PrimeEdit2=m_PrimeEdit2;else m_PrimeEdit2=0;m_PubNEdit=m_PrimeEdit1*m_PrimeEdit2;m_PubXEdit=(m_PrimeEdit1-1)*(m_PrimeEdit2-1);UpdateData(FALSE);}2、int CRSADlg::primeNumber(long m) //判断是否为素数{int flag=1;long temp=(long)sqrt(m);for(int i=2;i<=temp;i++){if(m%i==0){flag=0;break;}}if(flag==0) return 0;else return 1;}3、void CRSADlg::OnPubkeyButton() //公有密钥按钮处理函数{UpdateData(TRUE);if(primeNumber(m_PubKeyEdit)==0||m_PubXEdit%m_PubKeyEdit==0||m_PubKeyEdit>m_Pub XEdit)m_PubKeyEdit=0;UpdateData(FALSE);}4、void CRSADlg::OnPrikeyButton(){UpdateData(TRUE);double privatenum;char cBuffer[32];for(double i=1; ;i++){double temp=fmod((i*m_PubXEdit+1),m_PubKeyEdit);if(temp==0.0 && (i*m_PubXEdit+1)/m_PubKeyEdit<m_PubXEdit){privatenum=(i*m_PubXEdit+1)/m_PubKeyEdit;break;}}sprintf(cBuffer,"%0.0f",privatenum);m_PriKeyEdit.SetWindowText(cBuffer);}5、void CRSADlg::OnChangeResourceEdit(){CString METext;char Count[10];int nCharNum,nLineNum;m_ResourceEdit.GetWindowText(METext);nCharNum=METext.GetLength();nLineNum=m_ResourceEdit.GetLineCount();nCharNum-=(nLineNum-1);itoa(nCharNum,Count,10);m_Char.SetWindowText(Count);itoa(nLineNum,Count,10);m_Line.SetWindowText(Count);}6、void CRSADlg::OnHidePrikeyButton(){m_PriKeyEdit.ShowWindow(SW_HIDE);}8、void CRSADlg::OnExitButton(){OnOK();}9、void CRSADlg::OnOpenButton() //数字解密按钮处理函数{char sArray[20];char Count[32];double number1,number2;double nPriKey;m_PriKeyEdit.GetWindowText(sArray,20);nPriKey=atof((LPCTSTR)sArray);m_CryptographEdit.GetWindowText(sArray,20);number1=atof((LPCTSTR)sArray);number2=calculatemod(number1,nPriKey);sprintf(Count,"%0.0f",number2);m_OpenEdit.SetWindowText(Count);}10、double CRSADlg::calculatemod(double num1, double num2) //数字加密和解密算法{ //求余处理函数double mul=1.0;for(long i=0;i<(long)num2;i++){mul*=fmod(num1,m_PubNEdit);mul=fmod(mul,m_PubNEdit);}mul=fmod(mul,m_PubNEdit);return mul;}11、void CRSADlg::OnEncryptTextButton(){long *point=lArrayOfCount;CString sArray;int nCount;m_Char.GetWindowText(sArray);nCount=atoi(sArray);char sResourceText[300];char sCryptogramText[300];char *pResourceText=sResourceText;char *pCryptogramText=sCryptogramText;m_ResourceEdit.GetWindowText(sResourceText,nCount+1);for(int i=0;i<nCount;i++){*pCryptogramText=CalculateModOfChar(*pResourceText,m_PubKeyEdit,point);//调用文本加密求余函point++; //指向下个地址,准备记录下个数pResourceText++;pCryptogramText++;}*pCryptogramText[nCount]='\0';m_CryptographEdit.SetWindowText(sCryptogramText);}12、void CRSADlg::OnOpenTextbutton(){long *point1=lArrayOfCount;char sArray[10];int nCount;double fPriKey;m_Char.GetWindowText(sArray,10);nCount=atoi((LPCTSTR)sArray);m_PriKeyEdit.GetWindowText(sArray,10);fPriKey=atof((LPCTSTR)sArray);char sOpenText[300];char sCryptogramText[300];char *pOpenText=sOpenText;char *pCryptogramText=sCryptogramText;m_CryptographEdit.GetWindowText(sCryptogramText,300);double tempnumber;for(int i=0;i<nCount;i++){tempnumber=(*point1)*128+*pCryptogramText;*pOpenText=CalculateModOfChar(tempnumber,fPriKey); //调用文本解密求余函数,得到解密字符point1++; //指向记录下个数字pCryptogramText++;pOpenText++;}*pOpenText[nCount]='\0';m_OpenEdit.SetWindowText(sOpenText);}13、char CRSADlg::CalculateModOfChar(const char cChar, double num,long *ps){ //文本加密算法求余处理函数double mul=1;for(long i=0;i<num;i++){mul*=fmod((double)cChar,m_PubNEdit);mul=fmod(mul,m_PubNEdit);}*ps=(long)mul/128;return (char)fmod(mul,128);}14、char CRSADlg::CalculateModOfChar(double num1, double num2){ //文本函数解密处理函数double mul=1;for(long i=0;i<num2;i++){mul*=fmod(num1,m_PubNEdit);mul=fmod(mul,m_PubNEdit);}return (char)mul;}15、void CRSADlg::OnCalculateMenu(){OnCalculateButton();}16、void CRSADlg::OnPubkeyMenu(){OnPubkeyButton();}17、void CRSADlg::OnPrikeyMenu(){OnPrikeyButton();}18、void CRSADlg::OnHideMenu(){OnHidePrikeyButton();}19、void CRSADlg::OnShowMenu(){OnShowPrikeyButton();}20、void CRSADlg::OnClearMenu(){OnClearButton();}21、void CRSADlg::OnExitMenu(){OnExitButton();}22、void CRSADlg::OnEncryptnumMenu(){OnEncryptButton();}23、void CRSADlg::OnOpennumMenu(){OnOpenButton();}24、void CRSADlg::OnEncrypttextMenu(){OnEncryptTextButton();}25、void CRSADlg::OnOpentextMenu(){OnOpenTextbutton();}26、void CRSADlg::OnAboutMenu(){MessageBox("卖石头创作QQ:170758887\n\nRSA V1.0 版权所有(C) 2006\n\nEmail:zero_dian@\n\n\n");}27、void CRSADlg::OnEncryptButton() //数字加密按钮处理函数{char sArray[20];char Count[32];double number1,number2;m_ResourceEdit.GetWindowText(sArray,20);number1=atof((LPCTSTR)sArray);number2=calculatemod(number1,m_PubKeyEdit);//itoa(number2,Count,10);sprintf(Count,"%0.0f",number2);m_CryptographEdit.SetWindowText(Count);}28、void CRSADlg::OnShowPrikeyButton(){m_PriKeyEdit.ShowWindow(SW_SHOW);}29、void CRSADlg::OnClearButton(){m_ResourceEdit.SetSel(0,-1);m_ResourceEdit.ReplaceSel("");m_PriKeyEdit.SetSel(0,-1);m_PriKeyEdit.ReplaceSel("");m_CryptographEdit.SetSel(0,-1);m_CryptographEdit.ReplaceSel("");m_OpenEdit.SetSel(0,-1);m_OpenEdit.ReplaceSel("");UpdateData(FALSE);}本文来自CSDN博客,转载请标明出处:/zero_dian/archive/2006/01/06/572501.aspx。

RSA加解密算法C语言的实现

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

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

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

#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{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){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 的数组都改变了。

*/{ int d[MAX];mov (a,d);while (cmp(d,b)!=(-1))/*/c=a-b-b-b-b-b.......until(c<b)*/{sub(d,b,c);mov(c,d);/*/c复制给a*/}return ;void divt(int t[MAX],int b[MAX],int *c ,int *w)/*//试商法//调用以后w为a mod b, C为a div b;*/{int a1,b1,i,j,m;/*w用于暂时保存数据*/int d[MAX],e[MAX],f[MAX],g[MAX],a[MAX];mov(t,a);for(i=0;i<MAX;i++)e[i]=0;for(i=0;i<MAX;i++)d[i]=0;for(i=0;i<MAX;i++) g[i]=0;a1=a[MAX-1];b1=b[MAX-1];if (cmp(a,b)==(-1)){c[0]=0;c[MAX-1]=1;mov(t,w);return;}else if (cmp(a,b)==0){c[0]=1;c[MAX-1]=1;w[0]=0;w[MAX-1]=1;return;}m=(a1-b1);for(i=m;i>=0;i--)/*341245/3=341245-300000*1--->41245-30000*1--->11245-3000*3--->2245-300*7--->145-30*4=25--->25-3*8=1*/{for(j=0;j<MAX;j++)d[j]=0;d[i]=1;d[MAX-1]=i+1;mov(b,g);mul(g,d,e);while (cmp(a,e)!=(-1)){c[i]++;sub(a,e,f);mov(f,a);/*f复制给g*/}for(j=i;j<MAX;j++)/*高位清零*/e[j]=0;}mov(a,w);if (c[m]==0) c[MAX-1]=m;else c[MAX-1]=m+1;return;}void mulmod(int a[MAX] ,int b[MAX] ,int n[MAX],int *m)/*解决了 m=a*b mod n;*/ {int c[MAX],d[MAX];int i;for(i=0;i<MAX;i++)d[i]=c[i]=0;mul(a,b,c);divt(c,n, d,m);for(i=0;i<m[MAX-1];i++)printf("%d",m[m[MAX-1]-i-1]);printf("\nm length is : %d \n",m[MAX-1]);}/*接下来的重点任务是要着手解决 m=a^p mod n的函数问题。

相关文档
最新文档