1. RSA 密钥生成过程
a) 选取两个大素数p ,q ,并计算n = p*q
b) 取e, 满足e 与((p-1)*(q-1)) 互质。一般取 0x10001,
c) 计算 d , 满足 d * e mod((p-1)*(q-1)) = 1
d) 此时d ,n 为私钥,e ,n 为公钥。
e) 计算:明文A ,密文B ,
A = B^d mod n, B = A^e mod n
RSAPrivateKey ::= SEQUENCE {
version Version,
modulus INTEGER, -- n
publicExponent INTEGER, -- e
privateExponent INTEGER, -- d
prime1 INTEGER, -- p
prime2 INTEGER, -- q
exponent1 INTEGER, -- d mod (p-1)
exponent2 INTEGER, -- d mod (q-1)
coefficient INTEGER -- (inverse of q) mod p }
Version ::= INTEGER
-version is the version number, It shall be 0 for OpenSSL
-modulus is the modulus n.
-publicExponent is the public exponent e.
-privateExponent is the private exponent d.
-prime1 is the prime factor p of n.
-prime2 is the prime factor q of n.
-exponent1 is d mod (p-1).
-exponent2 is d mod (q-1).
-coefficient is the Chinese Remainder Theorem coefficient q-1 mod p.
2. CTR5 元组算法,CTR :中国剩余定理。计算更快捷。
3. E 的取值, 取一个素数,与互质。一般取 0x10001,0x11, 后者计算速度快,但安全级别不够。
4. 附Diffie-Hellman
a) 通信双方A ,B 约定素数q, n
b) A 生成 X=q^x mod n; b 生成 Y=q^y mod n
c) 交换X ,Y
d) B 计算X^y mod n, A 计算Y^x mod n 得到相同密钥
5. 判定大素数算法
a) 确定一个100 以内素数表
b) 生成一个大数,检查素数表,如果都通过的话,是素数概率很大。尝试进行RSA 运算,结果正确则确定是素数。
c) 如果不正确,每次递增2 ,重复检查。
6. RABIN-MILLER 大素数判断算法
a) 计算奇数 M 和 R ,使得 N=(2**r)*M+1. N 用二进制数 B 来表示,令 C = B - 1 。因为 N 为奇数,所以 C 的最低位为 0 ,从 C 的最低位的 0 开始向高位统计。当遇到第一个 1 时, 0 的个数为 R , M 为 B 右移 R 位的值
b) 选择随机数 A , 2 <= A < N – 1
c) 测试条件 1 若 A**M MOD N = 1 ,则 N 通过随机数 A 的测试
d) 测试条件 2 对于递增的 i , 0 <= i < r ,若有一个 i ,使得: A**((2**i)*M) MOD N = N-1 ,则 N 通过随机数 A 的测试
e) 素数结论 重复 2 - 4 的步骤,选定随机数 A (真随机数)进行测试, N 确为素数的概率和测试次数 n 有关 . 若 n = 3 ,则 N 为素数的概率为 99.90%