rsa算法c语言实现欧拉函数证明,RSA算法推导

预备知识:

0. 模运算基本性质

(a + b) % p = (a % p + b % p) % p

(a - b) % p = (a % p - b % p) % p

(a * b) % p = (a % p * b % p) % p

(a^b) % p = ((a % p)^b) % p

推论: (符号定义,模等:a≡b (% p) <=> a%p = b % p)

若a≡b (% p),则对于任意的c,都有(a + c) ≡ (b + c) (%p);

若a≡b (% p),则对于任意的c,都有(a * c) ≡ (b * c) (%p);

若a≡b (% p),c≡d (% p),则 (a + c) ≡ (b + d) (%p),(a - c) ≡ (b - d) (%p), (a * c) ≡ (b * d) (%p),(a / c) ≡ (b / d) (%p);

证明方法:a = k1*p + a%p; b = k2*p + b % p, 将这两个式子带入上面等式的左边,即可求证

1. 互质(coprime)

两个数的最大公因子是1,则这两个数互质

2. 欧拉函数

定义:φ(n) 表示小于n且与n互质的数的个数

欧拉函数:如果p是一个质数,则φ(p^k) = p^k - p^(k-1) = p^k(1-1/p)

证明:

p是大于1的整数,则p和p-1构成互质关系,比如57和56

小于等于p^k的正整数一共p^k个,和p^k不互质的数,一定是p的倍数,他们是 p, 2*p, 3*p, ..... p^(k-1) * p

所以小于等于p^k 与 p^k互质的数,有 p^k - p^(k-1)个

推理:如果p,q是质数,φ(p * q) = φ(p) * φ(q)

证明:网搜中国剩余定理,略

3. 欧拉定理

欧拉定理:

如果两个正整数a和n互质,则n的欧拉函数 φ(n) 满足:a^φ(n) ≡ 1 (mod  n)

(欧拉函数证明)

费马小定理:

a是不能被素数p整除的正整数,则有a^(p-1) ≡ 1 (mod p) => 欧拉定理代进来就可以证明了

个人推理:

如果两个正整数a和n互质,则n的欧拉函数 φ(n) 满足:a^(k * φ(n)) ≡ 1 (mod  n)

个人推理证明:

a^(k * φ(n)) % p = ((a ^ φ(n) )^k) % p = ((a ^ φ(n) ) % p)^k % p = 1^k % p = 1

欧拉定理的应用的例子:计算 7^222 的个位数

解:

∵ 7 和 10 互质,φ(10) = 4 ∴ 7^4 mod 10 = 1

7^222 % 10 = ((7^4)^55 %10)* (7^2%10) = 7^2 % 10 (参见欧拉定理个人推理) = 9

带入 (a^b) % p = ((a % p)^b) % p, 7^222 = (7^4)^55 mod

4. 模反元素

定义:

ab ≡ 1(mod n),其中a和n互质,则称b为a的对n的模反元素

定理:

如果a和n互质,则a的模反元素必定存在

证明:

a * a^(φ(n)-1) = a ^ φ(n) ; 根据欧拉定理:a ^ φ(n) ≡ 1(mod n)

那么 a^(φ(n)-1) 就是a对n的模反元素,必然是存在的

RSA原理&过程

秘钥生成过程

1.  p 和 q是两个大素数

2. n = p * q

3. φ(n) = (p-1) * (q-1)  (参见欧拉定理推理)

4. 找一个与φ(n)互质的数e  且1 < e < φ(n)

5. 找到一个正整数d, d * e ≡ 1(mod φ(n)) (d为e的模反元素)

求解过程: (e的存在性,就是欧拉定理)

d * e - 1 = k * φ(n) => 等效于求解 d * e + k * φ(n) = 1, 其中 e, φ(n) 已知,

因为这个方程是一条直线,可以得到无数个解,能某一种的解法通常能得到一组解

6. 综上,这个时候,公钥和私钥产生了

公钥: (e, n)

私钥:(d, n)

安全性证明

(1)ed≡1 (mod φ(n))。只有知道e和φ(n),才能算出d

(2)φ(n)=(p-1)(q-1)。只有知道p和q,才能算出φ(n)。

(3)n=pq。只有将n因数分解,才能算出p和q。=>

加密过程: (M 明文;C 密文)

1. 将明文内容,适当切割,这样每一段明文能用 0 ~ n-1 的一个整数表示

2. 对于每一段明文M

M^e ≡ C (mod n): 公钥加密 C = M^e mod n

3. 解密时

C^d ≡ M (mod n):私钥解密 M = C^d mod n

要证明 C^d ≡ M (mod n) ①

∵M^e ≡ C (mod n)  ∴ C = M^e - kn ②;k为一个常数

将②代入①,

只需证明

(M^e - k*n)^d ≡ M (mod n)  ②

根据本文开头同余的定义

(M^e - k*n)^d % n = (M^e%n - k*n%n)^d % n = (M^e%n)^d%n =  M^(ed) %n

所以要证明②,只需证明

M^(ed) ≡ M (mod n) ③

∵ed ≡ 1 (mod φ(n))  ∴ ed = hφ(n)+1, 代入 ③得到,只需证明

M^(hφ(n)+1) ≡M (mod n)  ④

接下来分两种情况:

A. M与N互质

M^(hφ(n)+1) = M^(hφ(n)) * M 根据欧拉定理,M^(hφ(n)) mod n = 1, 得证

B. M与N不互质 (有时间了再推导一下)

因为 N = p * q两个素数的乘积,∴ M = kp or M = kq,只需证明M=kp的情况,代入M = kp, 有:

M^(hφ(n)+1) = (kp) ^ (hφ(n)+1) = (kp)^(h(p-1)(q-1)) * kp ⑤

∵ (kp)^φ(q)  ≡ 1 (mod q) …… p,q 互质,欧拉定理

∴(kp)^(q-1) ≡ 1 (mod q) 代入⑤有

(kp)^(h(p-1)(q-1)) * kp ≡ (kp)^(q-1) (mod n)  ≡ (kp)^(p-1) (mod (p*q))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RSA算法是一种非对称加密算法,它可以用来加密和解密数据,也可以用来生成数字签名。它的安全性基于一个数学难题:大质数分解。RSA算法实现包括以下几个步骤: 1. 选择两个大质数p和q,并计算它们的乘积n=p*q。 2. 计算欧拉函数phi(n)=(p-1)*(q-1)。 3. 选择一个小于phi(n)且与phi(n)互质的整数e,作为加密指数。 4. 计算d,使得d*e mod phi(n)=1,d称为解密指数。 5. 将n和e公开,作为公钥;将n和d保密,作为私钥。 6. 加密时,将明文m转化为整数M,计算C=M^e mod n,C即为密文。 7. 解密时,将密文C计算出明文m=M^d mod n。 以下是一个简单的RSA算法C语言实现示例: ``` #include <stdio.h> #include <stdlib.h> #include <math.h> int gcd(int a, int b) { if (b == 0) return a; else return gcd(b, a % b); } int main() { int p, q, n, phi_n, e, d, i, flag; char message[100]; int ascii_message[100]; int encrypted_message[100], decrypted_message[100]; printf("Enter two prime numbers: "); scanf("%d %d", &p, &q); n = p * q; phi_n = (p - 1) * (q - 1); printf("Enter a number e such that 1<e<phi(n) and gcd(e,phi(n))=1: "); scanf("%d", &e); for (i = 2; i < phi_n; i++) { if (gcd(i, phi_n) == 1) { flag = 1; break; } } if (flag == 0) { printf("No valid value of e\n"); exit(0); } d = (int)fmod(pow(e, -1), phi_n); printf("Public key (n,e): (%d,%d)\n", n, e); printf("Private key (n,d): (%d,%d)\n", n, d); printf("Enter message: "); scanf("%s", message); for (i = 0; message[i] != '\0'; i++) { ascii_message[i] = (int)message[i]; encrypted_message[i] = (int)fmod(pow(ascii_message[i], e), n); } printf("Encrypted message: "); for (i = 0; message[i] != '\0'; i++) { printf("%d ", encrypted_message[i]); } for (i = 0; message[i] != '\0'; i++) { decrypted_message[i] = (int)fmod(pow(encrypted_message[i], d), n); } printf("\nDecrypted message: "); for (i = 0; message[i] != '\0'; i++) { printf("%c", decrypted_message[i]); } return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值