精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>C/C++>>算法集锦--------梦入玄机>>关于RSA算法的一些话(1)

主题:关于RSA算法的一些话(1)
发信人: tsingxiao()
整理人: girlrong(1999-11-13 15:02:58), 站内信件
最近大家经常在网络上讨论 security 的问题........

有一个地方讲起来非常头大, 就是网路窃听的问题.......
因为现今大部分的资料传递是使用明码,
所以, 有心人只要组一台 PC 上网, 就可以窃听到许许多多有用的资讯,
即使机器的 su 密码也不能幸免........
所以, 人们就想在资料上做加密解密的工作....
在网路上所传输的都是经过加密之後资料, 来防止第三者窃听.....

其实, 对资料作加密解密的工作并不困难,
只要会写程式的人就可以想出许许多多千奇百怪的方法......
但问题是, 如果这个演算法一但外流了,
那这个方法就破功了...... 所传的码顿时之间成为明码......
所以, 在一般公用的 service, 如 telnet, ftp..... 等,
作者不可能使用自定的演算法作加密解密的工作......

现今, 大家最常用的方法是 DES 演算法.....
DES 是一个公开的演算法, 但它在加密解密的过程中需要一个 key......
解码时如果 key 不对, 那还是没效......
所以, 只要 key 不要外流, 即使传输过程中有人窃听, 也不怕资料曝光......


但 DES 有个问题, 因为加密解密需用同一个 key,
所以在传输时, 要如何使双方都使用同一个 key?
这个问题实在很头大, 因为如果不靠其它方法,
比如你自己到对方耳边亲口告诉他, 或是寄一封挂号信给对方等等.
单靠网路的话, 这个 key 是无法不被第三者所知.........
所以, 像 KERBEROS 这类的安全系统 (它也是使用 DES 演算法),
就必须作一些人工设定 (也就是有些动作不能透过网路设定)

有个演算法, RSA, 可以解决上述的问题........
它的做法大概如下: 假设资料要由 A 机器传至 B 机器,
那, 由 B 机器用乱数决定一个 key, 我们称之为 private key,
这个 key 自始至终都只留在 B 机器里不送出来.......
然後, 由这个 private key 计算出另一个 key, 我们称之为 public key......

这个 public key 的特性是几乎不可能反演算出 private key 来.......
然後将这个 public key 透过网路丢给 A 机器.........
A 机器将资料用这个 public key 编码,
这个编码过的资料一定得使用 private key 才解得开.......
然後 A 机器将编码过的资料透过网路传给 B,
B 再用 private key 将资料解码...........

这时, 如果有第三者窃听资料时, 他只得到 B 传给 A 的 public key,
以及 A 用这个 public key 编码後的资料........
没有 private key, 第三者根本无法解码.............
所以这个方法确实能防止第三者的窃听........

嗯...... 接下来就是说明 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
                                        Q.E.D.


这个定理说明 a 经过编码为 b 再经过解码为 c 时, a == c mod n  (n = pq).
...
但我们在做编码解码时, 限制 0 <= a < n, 0 <= c < n,
所以这就是说 a 等於 c, 所以这个过程确实能做到编码解码的功能.....

--

既不能达而兼善天下
只好穷而独善自身
青山处处 斯民如土矣……

※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.96.253.41]

[关闭][返回]