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

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;```在上面的代码中,我们使用了几个辅助函数来实现扩展欧几里得算法、计算模反元素和快速幂算法。

R S A 加 密 算 法

R S A 加 密 算 法

RSA加密算法实现以及C#一.RSA算法简介大体是先生成两个大素数p和q,再生成e,e和(p-1)*(q-1)互素。

取p和q的乘积:n=p*q 为公共模数。

再生成正整数d,满足d*e-1可以被(p-1)*(q-1)整除。

这样d就为私钥,(e,n)为公钥,形成rsa的公私钥对。

其中n的二进制位称为该密钥长度,密钥越长越难破解,也就越安全。

RSA算法 :?首先, 找出三个数, p, q, r,?其中 p, q 是两个相异的质数, r 是与 (p-1)(q-1) 互质的数.?p, q, r 这三个数便是 private key?接著, 找出 m, 使得 rm == 1 mod (p-1)(q-1).?这个 m 一定存在, 因为 r 与 (p-1)(q-1) 互质, 用辗转相除法就可以得到了.?再来, 计算 n = pq.?m, n 这两个数便是 public key?编码过程是, 若资料为 a, 将其看成是一个大整数, 假设 a n.?如果 a = n 的话, 就将 a 表成 s 进位 (s = n, 通常取 s = 2^t),?则每一位数均小於 n, 然後分段编码.?接下来, 计算 b == a^m mod n, (0 = b n),?b 就是编码後的资料.?解码的过程是, 计算 c == b^r mod pq (0 = c pq),?於是乎, 解码完毕.?这段话中:m就是Exponent,n是Modulus,p是P,q是Q,r是D,而InverseQ * p == 1 mod q======================================================== ====================RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(1024); --1024 bit keyRSAParameters par = rsa.ExportParameters(false); -- export the public keystring str = rsa.ToXmlString(true);str 值如下:========================RSAKeyValuetuNKKEhLHftRx81wHKQgunAHSUmLwBWBMNqBEZvZSAmntlzJPN3Yy7N5 3lLpeacl9M1J0LjeFyyOzpWwiYsapyDo4vlGzYcUy0AojMNW5DXuG7-UK0+ LWdW2gs6mhN3CWwmynqCKnvrwv993m-iPiFXUyqQu+OhSsca7p4XZnn8= -ModulusExponentAQAB-ExponentP7X5WxuLAIYcoXt5LKelRzUZT8hjkU4qIikHBplK8TUNU5y1rDlQ9Awd b9mTIf2sILUDT7ryZZ6KlIFDfCVu3IQ==-PQxSOlCaMGBOo15EG1zwQJl1zhKicAXtzc-1nlnWiRz0cr5PiBdYJE2Rn miDNgOvz-WiU1RTvoWFTgQy5erXPBnw==-QDPjeIJk75JzH4Dt1GUlBBpJ3rZkewfFG3SDs8kEuqgxoPwSEBREflvjc yquzQQuFbIRsjRFHKmL0zy27CU3vFlIQ==-DPDQOQYXfhMe8ZsB3bW4Llp-n73pD7VaYRZIAsDxLzgJPUjcBI5xfBkjax 0X1vvtcQKvplau8wjiK3LZr-Ugw9GBBw==-DQInverseQMjXjlXM7NuJWahnVSSD2JLeDDjwEyat7xyG+9mgWCMUSM-2v ja4v9U+exOYu8T4fnwKq5+hKlA3E2Aw9IjeIxg==-InverseQ Dh7zgME+fuOvrwbB-UjKau+Uj80frui-7x8eU3f3e4XGREW+CSHObUWy uucytzoW5TR0EeS6MX4TJpRhCg4NDzp6vbye3RIN8KAsRSbd8Znh38ABer5 43rjzB-kn305bKnmbqQtO89pQEidjZX441AYu1dkqTkhLYwHQSxbFNpcE= -RSAKeyValue========================二.填充算法由于密钥长度有限,一次性加密的数据长度也有限,因此必须对明文进行分块加密,再合并加密结果。

RSA加密算法及实现

RSA加密算法及实现

RSA加密算法及实现RSA加密算法是一种非对称加密算法,广泛应用于网络通信中的数据加密和数字签名等方面。

RSA算法的核心思想是基于大数分解的难解性问题,通过数论中的数学原理实现加密过程。

下面将详细介绍RSA加密算法的原理和实现。

RSA算法的原理如下:1.密钥的生成:-随机选择两个不同的大质数p和q。

-计算n=p*q。

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

-选择一个整数e,使得1<e<φ(n),且e与φ(n)互质。

- 计算e关于φ(n)的模反元素d,使得d * e ≡ 1 (modφ(n))。

-公钥为(n,e),私钥为(n,d)。

2.加密算法:-将明文m转化为整数。

- 计算密文c = m^e mod n。

3.解密算法:- 计算明文m = c^d mod n。

1.密钥的生成:首先,使用一个大数库来生成大质数p和q,确保p和q均为质数。

然后,计算n=p*q,并计算φ(n)=(p-1)*(q-1)。

选择一个合适的e,可以是小于φ(n)的质数或者与φ(n)互质的数。

使用扩展欧几里德算法,计算e关于φ(n)的模反元素d。

最终得到公钥为(n,e),私钥为(n,d)。

2.加密算法:将明文m转化为整数。

然后,使用快速模幂算法计算密文c = m^e mod n。

3.解密算法:使用快速模幂算法,计算明文m = c^d mod n。

需要注意的是,RSA算法对加密和解密的数据长度有限制,一般建议将要加密的数据分块进行加密。

同时,为了增强安全性,一般会使用大的素数来生成密钥。

总结:RSA加密算法是一种非对称加密算法,通过数论中的数学原理实现加密过程。

它的核心思想是基于大数分解的难解性问题。

RSA算法的实现需要生成密钥对、加密和解密三个步骤。

密钥的生成需要随机选择两个大质数,并进行相应的计算。

加密算法通过快速模幂算法进行加密,解密算法也通过快速模幂算法进行解密。

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加解密算法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加密算法及实现

RSA加密算法及实现

RSA加密算法及实现RSA 是一种非对称加密算法,由Rivest、Shamir 和Adleman 三位数学家于1977年提出,现在广泛应用于电子邮件加密、数字签名和安全传输等领域。

RSA 算法基于两个大素数的乘积难以分解的特性,实现了安全的加密和解密过程。

RSA算法的核心原理是利用数论中的欧拉函数、模逆和模幂运算。

下面将详细介绍RSA算法的加密和解密流程。

1.生成密钥对首先选择两个不同的大素数p和q,计算它们的乘积n=p*q。

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

选择一个与φ(n)互质的整数e,作为公钥的指数。

再利用模逆运算求解整数d,使得(d*e)%φ(n)=1,d即为私钥的指数。

2.加密过程假设要加密的消息(明文)为m,公钥为(n,e)。

将明文转换成整数M,并满足0≤M<n。

加密过程即为计算密文C=M^e%n,然后将密文发送给接收者。

3.解密过程接收者使用私钥(n,d)进行解密。

将密文C转换成整数,并计算明文M=C^d%n。

最后将整数M转换成消息,并得到解密后的明文。

RSA算法的安全性基于分解大整数n的困难性,如果有人能够有效地分解n,并得到p和q,那么整个算法的安全性将被破坏。

目前,分解大整数依然是一个非常耗费计算资源的问题,因此RSA算法在理论上是安全的。

实现 RSA 加密算法需要涉及大数运算和模幂运算等复杂的数学运算。

下面是一个简化版的 RSA 加密算法的 Python 代码实现:```pythonimport random#扩展欧几里得算法求解模逆def extended_gcd(a, b):if b == 0:return a, 1, 0gcd, x, y = extended_gcd(b, a % b)return gcd, y, x - (a // b) * y#计算模幂运算def mod_exp(a, b, n):result = 1while b > 0:if b % 2 == 1:result = (result * a) % na=(a*a)%nb//=2return result#生成密钥对def generate_keys(:p = random.randint(100, 1000)q = random.randint(100, 1000)while p == q or not is_prime(p) or not is_prime(q): p = random.randint(100, 1000)q = random.randint(100, 1000)n=p*qphi = (p - 1) * (q - 1)e = random.randint(2, phi - 1)gcd, d, _ = extended_gcd(e, phi)#确保d为正数if d < 0:d += phireturn (n, e), (n, d)#加密过程def encrypt(message, public_key):n, e = public_keym = int.from_bytes(message.encode(, 'big')c = mod_exp(m, e, n)return c#解密过程def decrypt(ciphertext, private_key):n, d = private_keym = mod_exp(ciphertext, d, n)message = m.to_bytes((m.bit_length( + 7) // 8, 'big').decode return message#判断一个数是否为素数def is_prime(n):if n <= 1:return Falsefor i in range(2, int(n ** 0.5) + 1):if n % i == 0:return Falsereturn True#示例运行代码if __name__ == '__main__':public_key, private_key = generate_keysmessage = "Hello, RSA!"ciphertext = encrypt(message, public_key)plaintext = decrypt(ciphertext, private_key)print("Public key:", public_key)print("Private key:", private_key)print("Ciphertext:", ciphertext)print("Decrypted plaintext:", plaintext)```以上代码是一个简单的实现,仅用于理解RSA加密算法的基本原理。

rsa算法基本流程及签名流程

rsa算法基本流程及签名流程

1、RSA算法及其实现RSA加密算法是目前应用最广泛的公钥加密算法,特别适用于通过Internet 传送的数据,常用于数字签名和密钥交换,被国际上的一些标准化组织ISO、ITU、SWIFT作为标准来采用.1。

1 RSA算法的基本原理独立地选取两个大素数(保密).计算(公开),其中为欧拉函数值(保密)。

随机选取一整数e,满足,,e是公开的密钥即公钥。

用Euclid算法计算d,,d是保密的密钥即私钥。

加密变换:对明文,密文为.解密变换:对密文,明文为。

其中,加密变换、解密变换两步也可以改为用d加密,e解密,就变成签名和验证过程.1。

2 RSA算法的实现步骤1素数的产生对随机数作素性检测,若通过则为素数,否则增加一个步长后再做素性检测,直到找出素数。

素性检测采用Fermat测试。

这个算法的理论依据是费尔马小定理:如果m是一个素数,且a不是m的倍数,那么根据费尔马小定理。

实际应用,此对于整数m,需计算,再将结果与a比较.如果两者相同,则m为素数。

选取a=2,则a一定不会是任何素数的倍数。

步骤2随机数的产生随机数不仅用于密钥生成,也用作公钥加密时的填充字符。

它必须具有足够的随机性,以防止破译者掌握随机数的规律后重现密钥的配制过程或者探测到加密块中的明文。

因为在计算机上不可能产生真正的随机数,实际采用周期大于2256位的伪随机序列发生器。

步骤3密钥的生成(1)选择e的值为2623883或者94475891;(2)随机生成大素数p,直到gcd(e, p—1)=1;(3)随机生成不同于p的大素数q,直到gcd(e,q—1)=1;(4)计算n=pq,φ(n)=(p-1)(q—1);(5)计算d,;(6)计算dmod(p—1),dmod(q—1);(7)计算(q—1)modp;(8)将(e,n)放入RSA公钥;将n,e,dmod(p—1),dmod(q-1),(q-1)modp 放入RSA私钥。

步骤4加密利用RSA加密,第一步需要将明文数字化.假定A、B统一明文编码方式为空格=00,A=01,B=02,C=03,…,Z=26, 则明文数字化HI为08、09;然后把明文M分成等长数据块,块长为s,其中,s尽可能大。

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

数学文化课程报告题目:RSA公钥加密算法及实现RSA公钥加密算法及实现摘要公钥密码是密码学界的一项重要发明,现代计算机与互联网中所使用的密码技术都得益于公钥密码。

公钥密码是基于数学的上的困难问题来保证其性。

其中RSA加密算法是一项重要的密码算法,RSA利用大整数的质数分解的困难性,从而保证了其相对安全性。

但如果发现了一种快速进行质数分解的算法,则RSA算法便会失效。

本文利用C 语言编程技术进行了RSA算法的演示[1]。

关键词:C语言编程、RSA算法、应用数学。

RSA public key encryption algorithmAbstractPublic key cryptography is an important invention in cryptography, thanks to public key cryptography, and it is used in modern computer and Internet password technology. Public key cryptography is based on the mathematics difficult problem to ensure its confidentiality. The RSA public key encryption algorithm is an important cryptographic algorithm, RSA using the difficulty that large integer is hard to be factorized into prime Numbers to ensure it safety. But if you can find a kind of fast algorithm to do the factorization, RSA algorithm will be failure. In this paper we used C language programming technology to demonstrate the RSA algorithm.Keywords:C language programming、RSA algorithm、Applied mathematics目录第1章引言 (1)第2章RSA公钥密码算法的基本理论知识 (2)2.1模运算操作、费马小定理与欧拉定理 (2)2.1.1 模运算操作 (2)2.1.2 费马小定理 (2)2.1.3 欧拉定理 (2)2.2 RSA算法的过程 (3)2.3 RSA算法的可行性 (3)第3章RSA算法的演示 (4)3.1 RSA程序的设计 (4)3.2 RSA算法的实现 (5)3.3 RSA算法的演示 (6)第4章结果分析与讨论 (7)第5章结论 (8)致 (9)参考文献 (10)附录 (111)附录A 各函数C语言代码 (111)第1章引言计算机与网络技术的高速发展,使密码技术成为信息安全技术的核心。

它主要由密码编码技术和密码分析技术两大分支组成。

密码编码技术的主要任务是寻求产生安全性高的有效密码算法和协议,以满足对消息进行加密或认证的要求。

密码分析技术的主要任务是破译密码或伪造认证信息,实现窃取信息或进行诈骗破坏话动。

这两个分支既相互对立又相互依存,正是由于这种对立统一关系,才推动了密码学自身的发展[2]。

公钥加密中,密钥分为加密和解密密钥两种,发送者用加密密钥对消息进行加密,解密者用解密密钥对明文解密,公钥和密钥是一一对应的,一对公钥和密钥称为密钥对,由公钥加密的密文必须由与该公钥配对的密钥解密。

密钥对中的两个密钥具有非常密切的关系,不能单独生成。

RSA公钥加密算法是1977年由罗纳德·维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。

1987年首次公布,当时他们三人都在麻省理工学院工作。

RSA就是他们三人姓氏开头字母拼在一起组成的。

RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的绝大多数密码攻击,已被ISO推荐为公钥数据加密标准。

今天只有短的RSA钥匙才可能被强力方式解破。

到2008年为止,世界上还没有任何可靠的攻击RSA算法的方式。

只要其钥匙的长度足够长,用RSA加密的信息实际上是不能被解破的。

但在分布式计算和量子计算机理论日趋成熟的今天,RSA加密安全性受到了挑战。

RSA算法基于一个十分简单的数论事实:将两个大质数相乘十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。

RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作。

RSA是被研究得最广泛的公钥算法,从提出到现今的三十多年里,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一[3]。

第2章RSA公钥密码算法的基本理论知识2.1模运算操作、费马小定理与欧拉定理2.1.1模运算操作对任意整数a和任意正整数n,存在唯一的整数q和r,满足。

0<r<=n,并且a=n*q+r,值q=[a/n]称为除法的商,其中[b]表示小于等于x的最大整数。

值r=a rood n称为除法的余数,因此,对于任意整数,可表示为:a=[a/n]+(a mod n) (2.1)且有(a*b)mod c =((a mod c)*(b mod c))mod c (2.2)费马定理和欧拉定理在公钥密码学中有重要的作用。

2.1.2费马小定理如果P是素数,a是不能被P整除的正整数,则:a p-1≡1 mod p (2.3)2.1.3欧拉定理对于任何互质的整数a和n,有在数论中,欧拉定理,(也称费马-欧拉定理)是一个关于同余的性质。

欧拉定理表明,若n,a为正整数,且n,a互质,φ(n)在1到n中为与n互质的数的个数,则:aφ(n) =1 mod n (2.4) 欧拉定理证明:将1~n中与n互质的数按顺序排布:x1,x2……xφ(n) (显然,共有φ(n)个数)我们考虑这么一些数:m1=a*x1;m2=a*x2;m3=a*x3……mφ(n)=a*xφ(n)1)这些数中的任意两个都不模n同余,因为如果有mS≡mR (mod n) (这里假定mS更大一些),就有:mS-mR=a(xS-xR)=qn,即n能整除a(xS-xR)。

但是a与n互质,a与n的最大公因子是1,而xS-xR<n,因而左式不可能被n整除。

也就是说这些数中的任意两个都不模n同余,φ(n)个数有φ(n)种余数。

2)这些数除n的余数都与n互质,因为如果余数与n有公因子r,那么a*xi=pn+qr=r(……),a*xi与n不互质,而这是不可能的。

那么这些数除n的余数,都在x1,x2,x3……xφ(n)中,因为这是1~n中与n互质的所有数,而余数又小于n.由1)和2)可知,数m1,m2,m3……mφ(n)(如果将其次序重新排列)必须相应地同余于x1,x2,x3……xφ(n).故得出:m1*m2*m3……mφ(n)≡x1*x2*x3……xφ(n) (mod n)或者说a^[φ(n)]*(x1*x2*x3……xφ(n))≡x1*x2*x3……xφ(n)或者为了方便:K{a^[φ(n)]-1}≡0 ( mod n ) 这里K=x1*x2*x3……xφ(n)。

以上定理是我们证明RSA算法可行性的基础[4]。

2.2RSA算法的过程N=p*q,其中p和q是素数,L为(p-1)和(q-1)的公倍数,L=lcm((p-1),(q-1))(由欧拉函数得出)。

E为与L互质的随机数,D是使得(D*E)mod L =1的数。

M为明文,E为加密后的密文,{E,N}为公钥,可以公开,{D,N}为私钥由自己保管。

甲向乙发送自己的公钥,乙用公钥加密后,将密文发送给甲,甲用私钥解密,得到密文。

加密算法为:E=M E mod N。

解密算法为:M=E D mod N。

其中有M与E小于N,均大于0。

2.3 RSA算法的可行性RSA算法的可逆性表明其理论上的可行性,要证明可逆性即证明:M=C D=(M E)D=M e*d mod n因为E*D=1mod L,这说明存在E*D=t*L+1,其中t为正整数且有t>=1。

所以:M E*D=M t*L+1 mod N=((M t*L mod N)(M mod N))mod N 因此可以通过证明M t*L=1 mod N成立来证明。

欧拉定理证明有a L =1 mod n,所以:M t*L=1 mod N从理论上证明算法可逆,第3章RSA算法的演示在编写程序之前先理清思路,设计关键的函数的入口、出口、功能、编写出伪代码。

之后,便是进行函数编写、调试阶段。

最后,便将函数组合在一起,使之成为一个完整的程序。

3.1 RSA程序的设计程序中有判断是否为质数、求两个数的公倍数、判断是否互质、求最大互质数、由E和L求出密钥D、加密算法和解密算法。

各函数算法见附录A。

3.2 RSA算法的实现RSA加密产生公钥和密钥过程可分为以下四步:(1)得出公钥中的N:随机取两个不同的素数,p和q,N=p*q。

(2)求出L:L的值为(p-1)和(q-1)的最小公倍数,L=lcm((p-1),(q-1))。

(3)求出一个随机的公钥E:求出一个与L互质的数E,有gcd(E,L)=1。

(4)求出一个随钥D:密钥D应满足(D*E)mod L=1;主函数的代码如下:int main(){long int p,q,E,D,N,L,ming,mi;display();srand(time(NULL));do{p=rand()%500;}while(p<100||!(iszs(p)));do{q=rand()%500;}while(!(iszs(q))||p==q);N=p*q;L=lcm(p-1,q-1);E=gcd(L);D=qiuD(E,L);if(D<=0||E<=0) return 0;printf("p=%ld q=%ld N=%ld L=%ld E=%ld D=%ld\n",p,q,N,L,E,D);printf("{E=%ld,N=%ld},{D=%ld,N=%ld}\n",E,N,D,N);printf("Let's do it!\n");do{do{printf("请输入一个小于N=%ld的正整数:",N);scanf("%ld",&ming);getchar();}while(ming>N||ming<=0);mi=Encryption(E,N,ming);ming=Decryption(D,N,mi);printf("公钥:E=%ld N=%ld 密文:%ld\n密钥:D=%ld N=%ld 明文:%ld\n",E,N,mi,D,N,ming);printf("还想再来一次吗?[y/n]:");}while('y'==getchar());printf("See you!\n");return 0;}3.3 RSA算法的演示完成编程后,便做了一次测试,测试结果如图3-1所示。

相关文档
最新文档