# 公钥密码

5 min read
Table of Contents

发送方只需要加密,接收方只需要脱密。如果加密脱密有两个不同密钥,那么双方只需要有各自需要的密钥就行了。

基本思想

单向函数

  1. 对于 F(x)F(x) 定义域中的任何 xx,可容易地求出函数值 y=F(x)y = F(x)

  2. 对于值域中的绝大多数 yy,很难求出相应的 xx 使 y=F(x)y = F(x)

单向陷门函数

  1. 对于 FF 的定义域中任何 xx,可容易地求出 y=F(x)y = F(x)

  2. 如果不知道函数 FF可变参数,则对于值域中的绝大多数 yy,很难求出对应的 xx 使 y=F(x)y = F(x)

  3. 若知道函数 FF可变参数,可以容易地求出 xx 使 y=F(x)y = F(x) 成立。

其中可变参数就是陷门信息

RSA公钥密码

  1. 用户选取两个不同的大素数 p,qp,q 算出 N=pq,λ(N)=lcm(p1,q1)N = p q, \lambda(N) = lcm(p - 1, q - 1)

  2. 选择加密密钥 e:0<e<λ(N)e: 0 < e < \lambda(N),使 gcd(e,λ(N))=1gcd(e, \lambda(N)) = 1,由 ed=1modλ(N)e d = 1 \mod \lambda(N) 求出 ee 的逆元 d:0<d<λ(N)d: 0 < d < \lambda(N),将 dd 作为脱密密钥。

公开参数 N,eN, e,保密参数 p,q,d,λ(N)p, q, d, \lambda(N),明文与密文空间 Z/(N)Z/(N)

加密

c=memodNc = m^e \mod N

脱密

m=cdmodNm = c^d \mod N

为什么可以这样脱密?

由于 N=pqN = p q 为两个不同素数之积,故由 edmodλ(N)=1e d \mod \lambda(N) = 1 可知,对所有 mZ/(N)m \in Z / (N),都有:

cdmodN=medmodN=medmodλ(N)modN=m1modN=mc^d \mod N = m^{e d} \mod N = m^{e d mod \lambda(N)} \mod N = m^1 \mod N = m

性能分析

大合数真的非常大,一般 2048 bit 或以上;

模指数运算可用平方乘算法实现,设 e=emem1...e0e = e_{m} e_{m-1} ... e_{0} 其中 1 的个数为 kk,则完成 xemodnx^e \mod n 需要执行 mm 次模 nn 平方运算和 kk 次模乘运算。

快速脱密

孙子定理

{xmodp=x1xmodq=x2\left\{ \begin{matrix} x \mod p = x_1 \\ x \mod q = x_2 \end{matrix} \right.

Z(n)Z(n) 中有唯一解:

x=(qq1x1+pp1x2)modnx = (q q^{-1} x_1 + p p^{-1} x_2) \mod n

其中 n=pqn = p q,且

p1Z/(q)使pp1modq=1q1Z/(p)使qq1modp=1p^{-1} \in Z / (q) 使 p p^{-1} \mod q = 1 \\ q^{-1} \in Z / (p) 使 q q^{-1} \mod p = 1

x(xmodp,xmodq)x \longmapsto (x \mod p, x \mod q)Z(n)Z(n)Z(p)×Z/(q)Z(p) \times Z/(q) 的双射。

大数模运算

类似于没有 AVX 时的 workaround.

一般采用蒙哥马利算法。

大素数生成算法

一般是先生成随机大数,再检验素性。

素性检验

有确定性算法和概率算法(常用 Rabin、 Miller算法)。

例如,Rabin素性检测法:

欧拉定理已知,若 nn 为素数

aZnan11modn\forall a \in Z^*_n \qquad a^{n-1} \equiv 1 \mod n

反之若 an11modna^{n-1} \neq 1 mod n,就一定是合数。

an11modna^{n-1} \equiv 1 \mod n,可能为素数也可能为合数。


nn 为奇,则 n1=2eun - 1 = 2^e uuu 为奇,

an11modna^{n-1} \equiv 1 \mod n

可得 (au1)t=0e1(a2tu+1)=0modn(a^u - 1) \prod_{t=0}^{e-1} (a^{2^t u} + 1) = 0 \mod n

nn 为素数,则下列式子必有一个成立

au1=0modna2tu+1=0modn(t=0,1,2,...,e1)\begin{matrix} a^u - 1 = 0 \mod n \\ a^{2^t u} + 1 = 0 \mod n \\ (t = 0,1,2,...,e-1) \end{matrix}

于是引入素性集

Pn={n:aZn,au1modn,t<e,a2tu1modn}P_n = \{ n: \forall a \in Z^*_n, a^u \neq 1 \mod n, \forall t < e, a^{2^t u} \neq -1 \mod n \}

若选取的某个奇数 nn 在该集合中,必为合数,否则可能为素数也可能为合数。

误判概率 14\le \frac{1}{4},多判几次,素数概率就非常高。

My avatar

Thanks for reading my blog post! Feel free to check out my other posts or contact me via the social links in the footer.


More Posts

Comments