发送方只需要加密,接收方只需要脱密。如果加密脱密有两个不同密钥,那么双方只需要有各自需要的密钥就行了。
-
对于 F(x) 定义域中的任何 x,可容易地求出函数值 y=F(x)。
-
对于值域中的绝大多数 y,很难求出相应的 x 使 y=F(x)。
-
对于 F 的定义域中任何 x,可容易地求出 y=F(x)。
-
如果不知道函数 F 的可变参数,则对于值域中的绝大多数 y,很难求出对应的 x 使 y=F(x)。
-
若知道函数 F 的可变参数,可以容易地求出 x 使 y=F(x) 成立。
其中可变参数就是陷门信息。
-
用户选取两个不同的大素数 p,q 算出 N=pq,λ(N)=lcm(p−1,q−1)。
-
选择加密密钥 e:0<e<λ(N),使 gcd(e,λ(N))=1,由 ed=1modλ(N) 求出 e 的逆元 d:0<d<λ(N),将 d 作为脱密密钥。
公开参数 N,e,保密参数 p,q,d,λ(N),明文与密文空间 Z/(N)
c=memodN
m=cdmodN
由于 N=pq 为两个不同素数之积,故由 edmodλ(N)=1 可知,对所有 m∈Z/(N),都有:
cdmodN=medmodN=medmodλ(N)modN=m1modN=m
大合数真的非常大,一般 2048 bit 或以上;
模指数运算可用平方乘算法实现,设 e=emem−1...e0 其中 1 的个数为 k,则完成 xemodn 需要执行 m 次模 n 平方运算和 k 次模乘运算。
{xmodp=x1xmodq=x2
在 Z(n) 中有唯一解:
x=(qq−1x1+pp−1x2)modn
其中 n=pq,且
p−1∈Z/(q)使pp−1modq=1q−1∈Z/(p)使qq−1modp=1
即 x⟼(xmodp,xmodq) 是 Z(n) 至 Z(p)×Z/(q) 的双射。
类似于没有 AVX 时的 workaround.
一般采用蒙哥马利算法。
一般是先生成随机大数,再检验素性。
有确定性算法和概率算法(常用 Rabin、 Miller算法)。
例如,Rabin素性检测法:
欧拉定理已知,若 n 为素数
∀a∈Zn∗an−1≡1modn
反之若 an−1=1modn,就一定是合数。
若 an−1≡1modn,可能为素数也可能为合数。
设 n 为奇,则 n−1=2eu,u 为奇,
由 an−1≡1modn
可得 (au−1)∏t=0e−1(a2tu+1)=0modn
若 n 为素数,则下列式子必有一个成立
au−1=0modna2tu+1=0modn(t=0,1,2,...,e−1)
于是引入素性集
Pn={n:∀a∈Zn∗,au=1modn,∀t<e,a2tu=−1modn}
若选取的某个奇数 n 在该集合中,必为合数,否则可能为素数也可能为合数。
误判概率 ≤41,多判几次,素数概率就非常高。