发送方只需要加密,接收方只需要脱密。如果加密脱密有两个不同密钥,那么双方只需要有各自需要的密钥就行了。
基本思想
单向函数
-
对于 定义域中的任何 ,可容易地求出函数值 。
-
对于值域中的绝大多数 ,很难求出相应的 使 。
单向陷门函数
-
对于 的定义域中任何 ,可容易地求出 。
-
如果不知道函数 的可变参数,则对于值域中的绝大多数 ,很难求出对应的 使 。
-
若知道函数 的可变参数,可以容易地求出 使 成立。
其中可变参数就是陷门信息。
RSA公钥密码
-
用户选取两个不同的大素数 算出 。
-
选择加密密钥 ,使 ,由 求出 的逆元 ,将 作为脱密密钥。
公开参数 ,保密参数 ,明文与密文空间
加密
脱密
为什么可以这样脱密?
由于 为两个不同素数之积,故由 可知,对所有 ,都有:
性能分析
大合数真的非常大,一般 2048 bit 或以上;
模指数运算可用平方乘算法实现,设 其中 1 的个数为 ,则完成 需要执行 次模 平方运算和 次模乘运算。
快速脱密
孙子定理
在 中有唯一解:
其中 ,且
即 是 至 的双射。

大数模运算
类似于没有 AVX 时的 workaround.

一般采用蒙哥马利算法。
大素数生成算法
一般是先生成随机大数,再检验素性。
素性检验
有确定性算法和概率算法(常用 Rabin、 Miller算法)。
例如,Rabin素性检测法:
欧拉定理已知,若 为素数
反之若 ,就一定是合数。
若 ,可能为素数也可能为合数。
设 为奇,则 , 为奇,
由
可得
若 为素数,则下列式子必有一个成立
于是引入素性集
若选取的某个奇数 在该集合中,必为合数,否则可能为素数也可能为合数。

误判概率 ,多判几次,素数概率就非常高。