c语言实现rsa加密算法过程详解

c语言实现rsa加密算法过程详解,第1张

  一、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),

  於是乎, 解码完毕 等会会证明 c 和 a 其实是相等的 :)

  如果第三者进行窃听时, 他会得到几个数: m, n(=pq), b

  他如果要解码的话, 必须想办法得到 r

  所以, 他必须先对 n 作质因数分解

  要防止他分解, 最有效的方法是找两个非常的大质数 p, q,

  使第三者作因数分解时发生困难

  《定理》

  若 p, q 是相异质数, rm == 1 mod (p-1)(q-1),

  a 是任意一个正整数, b == a^m mod pq, c == b^r mod pq,

  则 c == a mod pq

  证明的过程, 会用到费马小定理, 叙述如下:

  m 是任一质数, n 是任一整数, 则 n^m == n mod m

  (换另一句话说, 如果 n 和 m 互质, 则 n^(m-1) == 1 mod m)

  运用一些基本的群论的知识, 就可以很容易地证出费马小定理的

  《证明》

  因为 rm == 1 mod (p-1)(q-1), 所以 rm = k(p-1)(q-1) + 1, 其中 k 是整数

  因为在 modulo 中是 preserve 乘法的

  (x == y mod z and u == v mod z =》 xu == yv mod z),

  所以, c == b^r == (a^m)^r == a^(rm) == a^(k(p-1)(q-1)+1) mod pq

  1. 如果 a 不是 p 的倍数, 也不是 q 的倍数时,

  则 a^(p-1) == 1 mod p (费马小定理) =》 a^(k(p-1)(q-1)) == 1 mod p

  a^(q-1) == 1 mod q (费马小定理) =》 a^(k(p-1)(q-1)) == 1 mod q

  所以 p, q 均能整除 a^(k(p-1)(q-1)) - 1 =》 pq | a^(k(p-1)(q-1)) - 1

  即 a^(k(p-1)(q-1)) == 1 mod pq

  =》 c == a^(k(p-1)(q-1)+1) == a mod pq

  2. 如果 a 是 p 的倍数, 但不是 q 的倍数时,

  则 a^(q-1) == 1 mod q (费马小定理)

  =》 a^(k(p-1)(q-1)) == 1 mod q

  =》 c == a^(k(p-1)(q-1)+1) == a mod q

  =》 q | c - a

  因 p | a

  =》 c == a^(k(p-1)(q-1)+1) == 0 mod p

  =》 p | c - a

  所以, pq | c - a =》 c == a mod pq

  3. 如果 a 是 q 的倍数, 但不是 p 的倍数时, 证明同上

  4. 如果 a 同时是 p 和 q 的倍数时,

  则 pq | a

  =》 c == a^(k(p-1)(q-1)+1) == 0 mod pq

  =》 pq | c - a

  =》 c == a mod pq

  首先是密钥对的生成:

  (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不再需要,可销毁,但绝不可泄露。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/dianzi/2717789.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-08-17
下一篇 2022-08-17

发表评论

登录后才能评论

评论列表(0条)

保存