我的博客和笔记我的博客和笔记
首页
文章
  • TurboLink
  • TinyEncrypt
  • UnrealStyleGuide
  • AxTrace
  • Cyclone
  • 数学相关
  • 图形学
  • 密码学
  • 编程语言
关于
GitHub
首页
文章
  • TurboLink
  • TinyEncrypt
  • UnrealStyleGuide
  • AxTrace
  • Cyclone
  • 数学相关
  • 图形学
  • 密码学
  • 编程语言
关于
GitHub
  • 我的文章

    • 从抛币协议到智能合约

      • Part1
      • Part2
    • JPEG算法解密

      • Part1
      • Part2
      • Part3
      • Part4
      • Part5
      • Github
    • SPH算法简介

      • Part1
      • Part2
      • Part3
      • Part4
      • Github
    • 赌博中的数学:Martingle策略
    • 如何生成一个随机的圆形
    • 一个简单的DH密钥协商算法的实现
    • 如何计算线段和圆的交点
    • 一道数学趣题
    • 斐波那契数列和1/89
    • 匀速贝塞尔曲线运动的实现

      • Part1
      • Part2
  • 开源项目

    • TurboLink
    • TinyEncrypt
    • UnrealStyleGuide
    • AxTrace
    • Cyclone
  • 学习笔记

    • 数学相关

      • 常用数学符号
      • 群
      • 数论(一)
      • 数论(二)
      • 数论(三)
      • 概率
    • 密码学

      • RSA
        • 1. 历史
        • 2. 密钥生成
        • 3. 加密和解密
        • 4. 举例
        • 5. 证明
        • 6. 密钥对的个数
        • 7. 交换律
      • 抛币协议
      • 智能扑克协议
    • 图形学

      • 数学基础

        • 矢量
        • 矩阵
        • 立体角
        • 几何变换(一)
        • 几何变换(二)
        • 法线变换
        • 摄像机变换
      • 光照模型

        • 传统光照模型
        • 光度学
        • 双向反射分布函数(BRDF)
        • 微平面理论(一)
        • 微平面理论(二)
        • 微平面理论(三)
        • 光照方程
      • 环境光渲染

        • 环境光渲染(一)
        • 环境光渲染(二)
    • 编程语言

      • JavaScript

        • 环境搭建
        • 基本语法
        • 函数
        • 对象和类

RSA算法


1. 历史

1977年,三位数学家RonRivest、Adi Shamir 和 Leonard Adleman 设计了一种算法,可以实现非对称加密。这种算法用他们三个人的名字命名,叫做RSA算法。

2. 密钥生成

  1. 随机选择两个不相等的质数p和q
  2. 计算n=qp,ϕ(n)=(p−1)(q−1)
  3. 选择一个整数e,满足1<e<ϕ(n),gcd(e,ϕ(n))=1
  4. 计算e的模反元素d,满足ed≡1(modϕ(n))
  5. 公钥为(e,n),密钥为(d,n)

3. 加密和解密

  1. 加密明文M,M<n,
C=E(M)=Me(modn)
  1. 解密密文C,
M=D(C)=Cd(modn)

4. 举例

  1. 爱丽丝选择了p=61,q=53, 计算
n=pq=61×53=3233ϕ(n)=(p−1)(q−1)=360×52=3120
  1. 爱丽丝选择e=17,解同余方程
17×d≡1(mod3120)

使用扩展欧几里得算法解方程

17d+3120y=1

得到d=2753

  1. 公钥为(17,3233), 密钥为(2753,3233)

  2. 鲍勃使用公钥加密明文'A'=65

E(65)=6517(mod3233)=2790
  1. 爱丽丝用私钥解密
D(2790)=27902753(mod3233)=65

5. 证明

根据加密规则Me≡C(modn),C可以写成C=Me−kn 下面证明下面的公式成立

Cd≡M(modn)

将C代入要我们要证明的那个解密规则:

(Me−kn)d≡M(modn)

它等同于求证

Med≡M(modn)

由于

ed≡1(modϕ(n))

所以

ed=hϕ(n)+1

将ed代入得到:

Mhϕ(n)+1≡M(modn)

接下来,分成两种情况证明上面这个式子。

5.1 M与n互质

根据欧拉定理,此时

Mϕ(n)≡1(modn)

得到

(Mϕ(n))h×M≡M(modn)

原式得到证明。

5.2 M与n不是互质关系

此时,由于n等于质数p和q的乘积,所以M必然等于kp或kq。 以M=kp为例,考虑到这时k与q必然互质,则根据欧拉定理,下面的式子成立:

(kp)q−1≡1(modq)

进一步得到

((kp)q−1)h(p−1)×kp≡kp(modq)

即

(kp)ed≡kp(modq)

将它改写成下面的等式

(kp)ed=tq+kp

这时t必然能被p整除,即 t=t′p

(kp)ed=t′pq+kp

因为 m=kp,n=pq,所以

Med≡M(modn)

原式得到证明。

6. 密钥对的个数

对于选定的n=pq,能够产生的密钥对{e,d,n}有多少个?

由于ed≡1(modϕ(n)),所以gcd(e,ϕ(n))=1,而且1<e<ϕ(n),所以e的个数是和ϕ(n)互质的数的个数,也就是e有ϕ(ϕ(n))个 对于d,由于ed≡1(modϕ(n)),当e确定时,方程ex≡1(modϕ(n))在1<x<ϕ(n)有且只有一个解,所以密钥对{e,d,n}的个数为ϕ(ϕ(n))个

比如p=13,q=17,那么ϕ(n)=12×16=26×3, ϕ(ϕ(n))=ϕ(26)×ϕ(3)=25×2=64 所以一共有64对密钥

7. 交换律

当通信的双方使用模数相等的RSA算法时,RSA算法满足交换律,也就是说Alice使用的密钥为{e1,d1,n}, Bob使用的密钥对为{e2,d2,n},满足

e1d1≡e2d2≡1(modϕ(n))

那么

EB(EA(M))=EA(EB(M))
Next
抛币协议