RSA签名与验签
RSA密钥对产生的数学基础
欧拉函数
欧拉函数(Euler’s totient function),记作φ(n),是数论中的一个重要函数。它表示小于等于n且与n互质的正整数的个数。
欧拉函数的性质:
- 如果n是一个质数,那么φ(n) = n - 1
- 如果p和q是两个互质的正整数,那么φ(pq) = φ(p) * φ(q)
- 如果n = p^k,其中p是质数,k是正整数,那么φ(n) = p^k - p^(k-1)
欧拉定理: 对于任何整数n和与n互质的整数a,有a^φ(n) ≡ 1 (mod n)
费马小定理是欧拉定理的一个特例。当n是质数时,欧拉定理变为费马小定理:对于任何整数a,有a^(n-1) ≡ 1 (mod n)。
生成RSA密钥对
RSA签名的数学原理:
- 选择两个大质数p和q,计算它们的乘积n = pq
- 计算欧拉函数φ(n) = (p-1)(q-1)
- 选择一个整数e,使得1 < e < φ(n)且e与φ(n)互质(通常选择65537)
- 计算e的模φ(n)的乘法逆元d,即ed ≡ 1 (mod φ(n))
- 公钥为(n, e),私钥为(n, d)
RSA签名的数学基础
签名过程:
- 计算签名S = H(M)^d mod n
验证过程:
- 计算哈希值H(M)
- 使用公钥计算签名的哈希值:H’(S) = S^e mod n
- 比较H(M)和H’(S)是否相等
数学逻辑推理:
| |
RSA常见的两种签名实现
对原始消息签名和验签
| |
对消息摘要进行签名和验签
| |
单元测试验证
| |
RSA盲签名
盲签名的步骤
在RSA盲签名中,签名者对与原始消息M相关的"盲化"版本进行签名,而不是直接对原始消息M进行签名,这使得签名者无法识别所签名的消息的内容。
盲签名步骤:
- 发送者对消息M计算哈希值H(M)
- 发送者选择一个随机的盲因子r,使得1 < r < n且r与n互质
- 发送者使用签名者的公钥(n, e)对盲因子r进行加密:r’ = r^e mod n
- 发送者计算盲化的哈希值:H’(M) = H(M) * r’ mod n
- 发送者将盲化的哈希值H’(M)发送给签名者
- 签名者使用私钥(n, d)对盲化的哈希值进行签名:S’ = H’(M)^d mod n
- 签名者将盲签名S’返回给发送者
- 发送者计算原始签名:S = S’ * r^(-1) mod n
- 验证签名:计算S^e mod n并检查是否等于H(M)
为什么不选择对原始消息进行盲签名
直接对原始消息进行盲签名可能带来以下问题:
- 效率问题:当原始消息较大时,计算成本很高
- 消息长度限制:RSA加密和签名有长度限制
- 安全性问题:可能面临已知明文攻击和所选明文攻击
- 完整性验证:可能无法确保消息的完整性
盲签名的示例代码
注意:以下代码仅做示例使用,不可用于生产环境!
| |
简单的调用示例
| |
运行效果
当运行上述代码时,会输出盲签名生成的过程和最终的验证结果。如果一切正常,验证结果应该为True,表明盲签名机制正常工作。

盲签名技术在需要保护用户隐私的场景中非常有用,比如电子投票系统、数字货币等,它可以确保签名者无法获取被签名消息的具体内容,同时又能提供有效的数字签名。