准备资料
资料提炼
- 通过阅读 盲签名源码 可以知道,当一个明文
m经过盲化、签名,最后再去盲的操作后的最终结果为:
其中:
m为明文r为随机数n和e组成公钥,n和d组成私钥,根据 RSA 加密算法定义可知:e和d满足:$ed \equiv 1 \pmod {\phi(n)}$- $r^{-1}$ 为 r 对于 n 的模反元素,满足:$r^{-1} \cdot r \equiv 1 \pmod {n}$
| 说明 | 公式 | 编号 |
|---|---|---|
| 结合律 | $((a \cdot b) \% n \cdot c) \% n = (a \cdot (b \cdot c) \% n) \% n$ | 1 |
| 模结合律 | $a^{b} \% n = ((a \% n)^{b}) \% n$ | 2 |
| 乘法分配律 | $(a \cdot b) \% n = (a \% n \cdot b \% n) \% n$ | 3 |
证明过程
由盲签名的原理可知,我们需要证明:
下面是证明过程:
即需要证明 $(r^{ed} r^{-1}) %n = 1$ ,根据 RSA 加密算法的定义,得出已知条件 $ed = k \cdot \phi(n) + 1$, 代入后有:
令 $r^{\phi(n)}=p,\ p \bmod n=q$,则有:
根据 盲签名源码 可知,r 与 n 被特意取值满足了互质条件,符合欧拉定理。那就有了 $r^{\phi(n)}\bmod n=1$,即 $q=1$,原式得证。
盲签原理
为什么我们要证明
因为根据 RSA 加解密过程,再结合业务场景,我们能总结出加密过程为:
解密过程为:
我们传给服务器的是盲化后的内容,即:
服务器用私钥将这个内容做加密操作后,然后我们再其做去盲处理就拿到了服务器对原文的加密结果。即:
其他人就可以用公钥来校验这个结果是否满足等式 $m = c^{e} \% n$
安全性
我们来看看交给服务器的盲化后的字串:
式子里总共有四个未知量:m、r、e、n,服务器只知道 e 和 n,没有 r 求不出 m。
再来考虑一下 r 被穷举的难度有多大呢?
根据源码的 这段代码 可知,r 的选取需满足以下条件:
现在的 RSA 算法中的 n 一般都是 1024 位,那么 r 就是小于 $2^{80}$ 且与 n 互质的正整数。
那这样的数有多少个呢?
根据 资料 我们知道小于 n 且与 n 互质的正整数的个数叫做 欧拉函数,写作 $\phi(n)$ 。在 RSA 算法里,设 p、q 是任意两个质数,$\phi(n)$ 满足下面的条件:
当 n 足够大时,并假设 p、q 亦足够大(事实上 p、q 也确实足够大),那么 $\phi(n)$ 取其二次方项:
所以可知小于 n 且与 n 互质的数大致是成均匀分布,那么满足条件的 r 的个数大约是 $2^{80}$
所以 r 被穷举的难度取决于 r 的随机范围。
我看 最新代码 是把 $2^{80}$ 扩大到 $2^{512}$ 了