【现代密码学原理】——公钥密码学与RSA(学习笔记)

📖 前言:公钥或对称密码学的发展是整个密码学发展史是最伟大的一次革命。从密码学产生至今,几乎所有的密码体制都是基于代替和置换这些初等方法的。几千年来,人们对算法的研究主要是通过手工计算完成的。随着转轮加密/解密机器的出现,对称密码学有了很大的发展,利用电子机械转轮可以开发出极其复杂的加密系统,利用计算机甚至可以设计出更加复杂的系统,最著名的例子是 Lucifer 在IBM公司实现数据加密标准(DES)时设计的系统。转轮机和DES是密码学发展的重要标志,但它们都是基于代替和置换这些初等方法的。
公钥密码学与此前的密码学完全不同。首先,公钥算法基于数学函数而非代替和置换,更重要的是,与只用一个密钥的对称密码不同,公钥密码是非对称的,它使用两个独立的密钥。我们将会看到,使用两个密钥在消息的保密性、密钥分发和认证领域有着重要意义。

在这里插入图片描述


🕒 0. 思维导图

在这里插入图片描述

🕒 1. 公钥密码学

🕘 1.1 发展历程

🕤 1.1.1 古典密码时期

在这里插入图片描述

  • 密码技术可以说是艺术而不是科学,密码学家们常凭直觉或信念来进行密码设计和分析,而不是通过推理证明
  • 密码体制较为简单、易于破解,主要应用于军事、政治、外交

🕤 1.1.2 近代密码时期

在这里插入图片描述

  • 20世纪60年代以来,计算机和通信系统逐渐普及,带动了数字信息保护以及各种安全服务的需求
  • 在这段时期形成了著名的数据加密标准DES与高级加密标准AES

🕤 1.1.3 现代密码时期

在这里插入图片描述

  • 1976年Diffie 和Hellman 联合发表论文《密码学的新方向》,引入了公钥密码学的革命性概念
  • 虽然并没有提供明确的公钥加密方案,但他们的思想在密码学领域引起了广泛兴趣,促进了公钥密码体制的发展

🕘 1.2 特征

  • 传统对称密码,基于代替和置换这些初等方法,并且只使用一个密钥
  • 公钥密码体制完全不同,它基于数学函数,使用两个独立的密钥

🕘 1.3 误区

🕤 1.3.1 更安全?

  • 任何加密算法的安全性都依赖于密钥的长度、破译密文需要的计算量
  • 与密码属于公钥密码还是对称密码无关

🕤 1.3.2 更普及?

  • 现有的公钥加密方案计算量大,无法适用于所有信息的加密,仅限于密钥管理、数字签名等应用
  • 目前仍是对称加密应用范围更广

🕤 1.3.3 更容易?

  • 对称密码中通信双方使用的密钥要保持一致,需要密钥分配中心使用某种分配协议来实现
  • 公钥密码中密钥的分配也需如此

🕒 2. 公钥密码体制

🕘 2.1 对称密码的问题

Alice 和Bob 使用某对称密码来加密消息,双方要使用相同密钥K
在这里插入图片描述

1)密钥 K 可以由 Bob 指定,加密后发送给 Alice

在这里插入图片描述

2)密钥 K 也可以由 Bob 设定后,将 K 交给密钥管理中心KDC,由KDC 分配给Alice

【问题】
现在通信双方与KDC 共享密钥,作为通信本身的参与者,Alice 和 Bob是不会将密钥 K 泄露出去的

而存放在KDC数据库中的密钥 K 则面临着盗窃、索取等安全风险
在这里插入图片描述

一旦Alice 和Bob 的这把密钥K被泄露,那么无论他们采取多么强壮的加密算法,其实都是徒劳。

🕘 2.2 数字签名的问题

Bob 要给Alice 发送一封房产转移证明文件,Alice 需要确定文件具有合法的法律效力

如何在电子文件上签署Bob的名字?如何保证数字签名一定是Bob制作的?

🕘 2.3 什么是公钥密码体制

1976年 Diffie和Hellman 针对密钥安全性、数字签名等问题提出了公钥密码学的概念

但实际上这并不是公钥密码学的问世,只是第一次被公开提出而已

New Direction In Cryptography
Abstract Two kinds of contemporary developments in cryptography are examined. Widening applications of teleprocessing have given rise to a need for new types of cryptographic systems. which minimize the need for secure key distribution channels and supply the equivalent of a written signature. This paper suggests ways to solve these currently open problemsIt also discusses how the theories of communication and computation are beginning to provide the tools to solve cryptographic problems of long standing.

🕘 2.4 组成

在这里插入图片描述

🕤 2.4.1 明文

通信双方发送的原始的、有意义的可读信息/数据,称为明文X

🕤 2.4.2 加密算法

加密算法E 将 明文X 进行各种转换

🕤 2.4.3 公钥

每个用户都产生一对密钥

其中一个是公开的,存放于公开寄存器或其他可访问的文件中,即公钥PU

🕤 2.4.4 私钥

每个用户都产生一对密钥

另外一个是私有的,只有自己才知道,即私钥PR

每个用户都有公钥PU、私钥PR

选用其中一把来加密,就用剩下的一把来解密

🕤 2.4.5 密文

加密算法E 读取 明文X 和 密钥PU/PR ,产生的输出就是 密文Y

🕤 2.4.6 解密算法

解密算法D 读取 密文Y 和 密钥PR/PU ,产生的输出就是 明文X

🕘 2.5 公钥加密

在这里插入图片描述

  • Bob 给Alice 发送消息X,选择公钥算法来为消息加密
  • Bob和Alice都会产生两把密钥,其中一个是公开的,存放在公开寄存器中供他人使用,称之为公钥PU
  • 另一个密钥是私有的,称之为私钥PR

【情景一】
Bob 给Alice 发送消息X,他希望消息具有保密性,只有接收方Alice才能获取消息的内容

在这里插入图片描述

【解决】
发送方Bob 使用 接收方Alice 的公钥 𝑷 𝑼 𝒂 𝑷𝑼_𝒂 PUa 为消息 X X X加密

在这里插入图片描述

  • Bob 有一个公钥环,上面有很多人的公钥,当他要和某人进行通信,就选择对应的公钥来加密

  • Bob 现在要发送消息给Alice,所以选择Alice的公钥 𝑷 𝑼 𝒂 𝑷𝑼_𝒂 PUa, 将其加入到加密算法 E E E

  • 加密算法 E E E读取明文 X X X、公钥 𝑷 𝑼 𝒂 𝑷𝑼_𝒂 PUa,生成密文 Y Y Y
    𝒀 = 𝑬 ( 𝑷 𝑼 𝒂 , 𝑿 ) 𝒀=𝑬(𝑷𝑼_𝒂,𝑿) Y=E(PUaX)

  • Alice收到了Bob发来的密文,使用自己的私钥 𝑷 𝑹 𝒂 𝑷𝑹_𝒂 PRa 来还原出明文

  • 解密算法 D D D 读取密文 Y Y Y、私钥 𝑷 𝑹 𝒂 𝑷𝑹_𝒂 PRa,还原明文 X X X
    𝑿 = 𝑫 ( 𝑷 𝑹 𝒂 , 𝒀 ) 𝑿=𝑫(𝑷𝑹_𝒂,𝒀) X=D(PRaY)

  • 由于解密使用的私钥只有 Alice自己知道,所以其他人无法解密 ,只有 Alice具有消息的访问权

在这里插入图片描述

𝑿 = 𝑫 ( 𝑷 𝑹 𝒃 , 𝒀 ) = 𝑫 ( 𝑷 𝑹 𝒃 , 𝑬 ( 𝑷 𝑼 𝒃 , 𝑿 ) ) 𝑿=𝑫(𝑷𝑹_𝒃,𝒀)=𝑫( 𝑷𝑹_𝒃,𝑬(𝑷𝑼_𝒃,𝑿) ) X=D(PRbY)=D(PRbE(PUbX))

密码分析者可推导明文、私钥的估计值

🕘 2.6 私钥加密

【情景二】
Bob 给Alice 发送消息X,他希望Alice 接收后不会对消息的真实来源产生怀疑

在这里插入图片描述

【解决】
发送方Bob 使用 他自己的私钥 𝑷 𝑹 𝒃 𝑷𝑹_𝒃 PRb 为消息X加密

在这里插入图片描述

  • Bob 给Alice 发送明文 X X X,加密时使用的是他自己的私钥 𝑷 𝑹 𝒃 𝑷𝑹_𝒃 PRb,生成的密文为 Y Y Y

  • 加密算法 E E E 读取明文 X X X 和私钥 𝑷 𝑹 𝒃 𝑷𝑹_𝒃 PRb,生成密文 Y Y Y
    𝒀 = 𝑬 ( 𝑷 𝑹 𝒃 , 𝑿 ) 𝒀=𝑬(𝑷𝑹_𝒃,𝑿) Y=E(PRbX)

  • Alice 收到了Bob 发来的密文 Y Y Y,将其输入解密算法 D D D,并从公钥环中找出发送方Bob 的公钥 𝑷 𝑼 𝒃 𝑷𝑼_𝒃 PUb,还原出明文 X X X

  • 解密算法 D D D 读取密文 Y Y Y 和公钥 𝑷 𝑼 𝒃 𝑷𝑼_𝒃 PUb,生成明文 X X X
    𝑿 = 𝑫 ( 𝑷 𝑼 𝒃 , 𝒀 ) 𝑿=𝑫(𝑷𝑼_𝒃,𝒀) X=D(PUbY)

  • 𝒀 = 𝑬 ( 𝑷 𝑹 𝒃 , 𝑿 ) , 𝑿 = 𝑫 ( 𝑷 𝑼 𝒃 , 𝒀 ) 𝒀=𝑬(𝑷𝑹_𝒃,𝑿),𝑿=𝑫(𝑷𝑼_𝒃,𝒀) Y=E(PRbX)X=D(PUbY)

  • Alice 收到了据说是Bob 发出的密文,若Alice 能使用Bob的公钥解密出明文,那么消息来源正确,因为只有Bob 才知道加密使用的私钥

在这里插入图片描述

𝑿 = 𝑫 ( 𝑷 𝑼 𝒂 , 𝒀 ) = 𝑫 ( 𝑷 𝑼 𝒂 , 𝑬 ( 𝑷 𝑹 𝒂 , 𝑿 ) ) 𝑿=𝑫(𝑷𝑼_𝒂,𝒀)=𝑫( 𝑷𝑼_𝒂,𝑬(𝑷𝑹_𝒂,𝑿) ) X=D(PUaY)=D(PUaE(PRaX))

密码分析者可获取明文,推导私钥的估计值

多选题
Alice和Bob 已知对方的公钥,现在Alice收到了Bob 发来的密文,以下说法正确的有:
A. 如果A 用 𝑷 𝑼 𝒃 𝑷𝑼_𝒃 PUb解密成功,那么密文是用 𝑷 𝑹 𝒃 𝑷𝑹_𝒃 PRb加密的
B. 如果A 用 𝑷 𝑼 𝒃 𝑷𝑼_𝒃 PUb解密成功,那么密文一定是B 发来的
C. 如果A 用 𝑷 𝑹 𝒂 𝑷𝑹_𝒂 PRa解密成功,那么密文是用 𝑷 𝑼 𝒂 𝑷𝑼_𝒂 PUa加密的
D. 如果B 用 𝑷 𝑼 𝒂 𝑷𝑼_𝒂 PUa加密密文,那么明文是一定只能被A 看到
答案:全选,其中B不严谨,可能重放攻击

🕘 2.7 双重加密

【情景三】
Bob 给Alice 发送消息X,他既希望消息只能被Alice查看,也希望Alice 接收后不会对消息的真实来源产生怀疑

在这里插入图片描述

【解决】
发送方Bob 先使用 他自己的私钥 𝑷 𝑹 𝒃 𝑷𝑹_𝒃 PRb加密,再使用接收方Alice 的公钥 𝑷 𝑼 𝒂 𝑷𝑼_𝒂 PUa 加密

在这里插入图片描述

用发送方的私钥签名,用接收方的公钥加密

多选题
关于公钥密码中的密钥,以下说法正确的是:
A. 每个用户都拥有自己的公钥PU和私钥PR
B. 公钥PU 一定是用来加密的
C. 用户知道他人的PU、自己的PU和PR
D. 用PR 加密得到的密文不具有保密性
答案:ACD

在这里插入图片描述

🕘 2.8 公钥密码的应用

🕤 2.8.1 对消息的加解密

  • 发送方用接收方的公钥对消息加密
    在这里插入图片描述
    在这里插入图片描述

  • PGP是一种用于提高电子邮件通信的安全性的加密程序消息加密。 PGP用到公钥密码体制RSA对于加密明文的密钥进行加密

🕤 2.8.2 数字签名(身份鉴别)

  • 发送方用其私钥对消息进行签名

在这里插入图片描述
在这里插入图片描述

  • IPsec是一种安全的网络协议套件,可对数据包进行身份验证和加密,常用于VPN的搭建。
  • IPsec使用RSA签名完成对用户的身份验证

🕤 2.8.3 密钥交换

收发双方交换中间密钥 𝒀 𝑨 、 𝒀 𝑩 𝒀_𝑨 、𝒀_𝑩 YAYB,经过变换后得到最终密钥 𝑲 𝑲 K

在这里插入图片描述

SSH是一种加密网络协议,用于通过不安全的网络安全地运行网络服务。典型的应用程序包括远程命令行,登录和远程命令执行。

在这里插入图片描述

证书

在这里插入图片描述

❗ 转载请注明出处
作者:HinsCoder
博客链接:🔎 作者博客主页

🕘 2.9 要求

无论是上述哪种应用,加密解密的成功实现都建立在一个支持双密钥的密码算法上

Diffie和Hellman虽然没有证明出这种算法一定存在,但他们给出了算法应该满足的条件

在这里插入图片描述

  • 【条件一】
    为某用户生成公钥𝑷𝑼 、私钥𝑷𝑹,在计算上是容易实现的

  • 【条件二】
    已知接收方的公钥 𝑷 𝑼 𝒂 𝑷𝑼_𝒂 PUa、要发送的明文 X X X ,生成密文 𝒀 = 𝑬 ( 𝑷 𝑼 𝒂 , 𝑿 ) 𝒀=𝑬(𝑷𝑼_𝒂,𝑿) Y=E(PUaX),在计算上是容易实现的

  • 【条件三】
    接收方使用自己的私钥 𝑷 𝑹 𝒂 𝑷𝑹_𝒂 PRa 对收到的密文 Y Y Y进行解密,生成明文 𝑿 = 𝑫 ( 𝑷 𝑹 𝒂 , 𝒀 ) 𝑿=𝑫(𝑷𝑹_𝒂,𝒀) X=D(PRaY) ,在计算上是容易实现的

  • 【条件四】
    已知某用户的公钥 𝑷 𝑼 𝒂 𝑷𝑼_𝒂 PUa,攻击者想要从中推导出该用户的私钥 𝑷 𝑹 𝒂 𝑷𝑹_𝒂 PRa ,在计算上是不可行的

  • 【条件五】
    已知某用户的公钥 𝑷 𝑼 𝒂 𝑷𝑼_𝒂 PUa,截获到加密后的密文 Y Y Y,想要使用 𝑷 𝑼 𝒂 𝑷𝑼_𝒂 PUa 推导出明文 X X X ,在计算上是不可行的

在公钥密码学的概念提出后几十年中,只有几个满足这些条件的算法

如RSA、椭圆曲线、Diffie-Hellman、DSS等,WHY?

🕤 2.9.1 单向函数

𝒇 ( 𝑿 ) = 𝒀 𝒇(𝑿) =𝒀 f(X)=Y
𝒇 − ( 𝒀 ) ~ 𝑿 𝒇^− (𝒀)~𝑿 f(Y)X

(1)给定x,计算y=f(x)是容易的;
(2)给定y,计算x使y=f(x)是困难的;

例子:
x = 512 , f ( x ) = x 2 = 51 2 2 = 262144 f ( x ) = 262144 , x = x 2 = 262144 \begin{array}{l} x=512, f(x)=x^{2}=512^{2}=262144 \\ f(x)=262144, x=\sqrt{x^{2}}=\sqrt{262144} \end{array} x=512,f(x)=x2=5122=262144f(x)=262144,x=x2 =262144

所谓计算x=f-1(Y)困难是指计算上相当复杂,已无实际意义。

🕤 2.9.2 单向陷门函数

𝒇 k ( 𝑿 ) = 𝒀 𝒇_k(𝑿) =𝒀 fk(X)=Y
𝒇 k − ( 𝒀 ) = 𝑿 𝒇^−_k(𝒀) =𝑿 fk(Y)=X
𝒇 − ( 𝒀 ) ~ 𝑿 𝒇^− (𝒀)~𝑿 f(Y)X

(1)对于函数f,给定参数k、X,计算函数值 f(x)=Y 很容易
(2)若给定参数k、Y,计算函数的逆f-(y)=X 很容易
(3)若只给定函数值Y,缺少参数k,计算函数的逆f-(Y)=X 是不可行的

找到合适的单向陷门函数是公钥密码体制的关键

(1)用正变换作加密,加密效率高
(2)用逆变换作解密,安全,攻击者不能破译
(3)把陷门作为密钥只分给合法用户,确保合法用户能够方便解密,而非法用户不能破译。

🕘 2.10 攻击

🕤 2.10.1 穷举密钥

  • 为了抗穷举攻击,密钥应该足够长;为了便于实现加密和解密,密钥又必须足够短
  • 所以公钥密码仅限于密钥管理和数字签名

🕤 2.10.2 穷举明文

  • Bob 给Alice 发送DES密钥,使用公钥加密算法 E E E、Alice的公钥 𝑷 𝑼 𝒂 𝑷𝑼_𝒂 PUa来加密,生成密文 Y Y Y

  • 攻击者已知明文共56位,对所有可能的明文都使用 𝑷 𝑼 𝒂 𝑷𝑼_𝒂 PUa来加密,当结果与 Y Y Y相同,就获取了明文的内容

🕒 3. 模运算

🕘 3.1 模算术运算

在这里插入图片描述

对于任意整数𝒂,对其进行模𝒏 运算,即 𝒂   𝒎 𝒐 𝒅   𝒏 𝒂 \ 𝒎𝒐𝒅 \ 𝒏 a mod n,表示为带余除法为
𝒂 = 𝒒 𝒏 + 𝒓 , 𝟎 ≤ 𝒓 < 𝒏 𝒂=𝒒𝒏+𝒓,𝟎≤𝒓<𝒏 a=qn+r0r<n
𝒓 = 𝒂   𝒎 𝒐 𝒅   𝒏 𝒓=𝒂 \ 𝒎𝒐𝒅 \ 𝒏 r=a mod n

由上可知,运算符 (𝒎𝒐𝒅 𝒏) 将所有整数映射到集合{𝟎,𝟏,…(𝒏−𝟏)}中

🕤 3.1.1 性质

  1. [ ( a   m o d   n ) + ( b   m o d   n ) ]   m o d   n = ( a + b )   m o d   n [(a \bmod n)+(b \bmod n)] \bmod n=(a+b) \bmod n [(amodn)+(bmodn)]modn=(a+b)modn
  2. [ ( a   m o d   n ) − ( b   m o d   n ) ]   m o d   n = ( a − b )   m o d   n [(a \bmod n)-(b \bmod n)] \bmod n=(a-b) \bmod n [(amodn)(bmodn)]modn=(ab)modn
  3. [ ( a   m o d   n ) × ( b   m o d   n ) ]   m o d   n = ( a × b )   m o d   n [(a \bmod n) \times(b \bmod n)] \bmod n=(a \times b) \bmod n [(amodn)×(bmodn)]modn=(a×b)modn

分别使用带余除法表示𝒂,𝒃 可以很容易地证明
普通算术的加、减、乘 同样适用于模算术

🕤 3.1.2 例子

𝟏 𝟏 𝟕 𝒎 𝒐 𝒅   𝟏 𝟑 𝟏𝟏^𝟕 𝒎𝒐𝒅 \ 𝟏𝟑 117mod 13

1 1 7 = 𝟏 𝟏 × 𝟏 𝟏 𝟐 × 𝟏 𝟏 𝟒 {\color{blue}11^7}={\color{red}𝟏𝟏} ×{\color{green}𝟏𝟏^𝟐}×{\color{purple}𝟏𝟏^𝟒} 117=11×112×114
𝟏 𝟏   𝑚 𝑜 𝑑   13 = 11 {\color{red}𝟏𝟏} \ 𝑚𝑜𝑑 \ 13=11 11 mod 13=11
𝟏 𝟏 𝟐   𝑚 𝑜 𝑑   13 = 121   𝑚 𝑜 𝑑   13 = 4 {\color{green}𝟏𝟏^𝟐} \ 𝑚𝑜𝑑 \ 13=121 \ 𝑚𝑜𝑑 \ 13=4 112 mod 13=121 mod 13=4
𝟏 𝟏 𝟒   𝑚 𝑜 𝑑   13 = ( 1 1 2 × 1 1 2 )   𝑚 𝑜 𝑑   13 {\color{purple}𝟏𝟏^𝟒} \ 𝑚𝑜𝑑 \ 13=(11^2×11^2) \ 𝑚𝑜𝑑 \ 13 114 mod 13=(112×112) mod 13
= [ ( 1 1 2   𝑚 𝑜 𝑑   13 ) × ( 1 1 2 𝑚 𝑜 𝑑   13 ) ]   𝑚 𝑜 𝑑   13 =[(11^2 \ 𝑚𝑜𝑑 \ 13)×(11^2 𝑚𝑜𝑑 \ 13)] \ 𝑚𝑜𝑑 \ 13 =[(112 mod 13)×(112mod 13)] mod 13
= ( 4 × 4 )   𝑚 𝑜 𝑑   13 = 16   𝑚 𝑜 𝑑   13 = 3 =(4×4) \ 𝑚𝑜𝑑 \ 13=16 \ 𝑚𝑜𝑑 \ 13=3 =(4×4) mod 13=16 mod 13=3

𝟏 𝟏 𝟕 𝑚 𝑜 𝑑 13 𝟏𝟏^𝟕 𝑚𝑜𝑑 13 117mod13
= ( 11 × 1 1 2 × 1 1 4 ) 𝑚 𝑜 𝑑 13 =(11×11^2×11^4)𝑚𝑜𝑑 13 =(11×112×114)mod13
= ( 11 × 4 × 3 ) 𝑚 𝑜 𝑑 13 =(11×4×3)𝑚𝑜𝑑13 =(11×4×3)mod13
= 132 𝑚 𝑜 𝑑 13 =132 𝑚𝑜𝑑 13 =132mod13
= 2 =2 =2

🕤 3.1.3 模8加法矩阵

在这里插入图片描述

  • 整数x也存在模8 下的负数y,即 ( x + y ) m o d 8 = 0 (x+y)mod 8=0 (x+y)mod8=0
  • 定位x所在的行,值为0的列上方即是y

🕤 3.1.4 模8乘法矩阵

在这里插入图片描述

  • 整数x也存在模8 下的倒数y,即 ( x × y ) m o d 8 = 1 (x×y)mod 8=1 (x×y)mod8=1
  • 定位x所在的行,值为1的列上方即是y

🕘 3.2 回顾欧几里得算法

🕤 3.2.1 求最大公因子

𝒂 = 𝒒 𝟏 𝒃 + 𝒓 𝟏 𝒂=𝒒_𝟏 𝒃+𝒓_𝟏 a=q1b+r1

𝒅 = 𝒈 𝒄 𝒅 ( 𝒂 , 𝒃 ) = 𝒈 𝒄 𝒅 ( 𝒃 , 𝒂   𝒎 𝒐 𝒅   𝒃 ) 𝒅=𝒈𝒄𝒅(𝒂,𝒃)=𝒈𝒄𝒅(𝒃,𝒂 \ 𝒎𝒐𝒅 \ 𝒃) d=gcd(a,b)=gcd(b,a mod b)

  • 求𝒂,𝒃 的最大公因子,先用𝒃 带余除 𝒂
  • 若余数𝒓_𝟏不为0,求𝒂,𝒃 的最大公因子𝒅 就变成了求 除数𝒃和余数𝒂 𝒎𝒐𝒅 𝒃 的最大公因子
  • 为求出最大公因子,可重复使用上式

例子:

gcd ⁡ ( 18 , 12 ) = gcd ⁡ ( 12 , 6 ) = gcd ⁡ ( 6 , 0 ) = 6 \operatorname{gcd}(18,12)=\operatorname{gcd}(12,6)=\operatorname{gcd}(6,0)=6 gcd(18,12)=gcd(12,6)=gcd(6,0)=6
gcd ⁡ ( 11 , 10 ) = gcd ⁡ ( 10 , 1 ) = gcd ⁡ ( 1 , 0 ) = 1 \operatorname{gcd}(11,10)=\operatorname{gcd}(10,1)=\operatorname{gcd}(1,0)=1 gcd(11,10)=gcd(10,1)=gcd(1,0)=1
gcd ⁡ ( 55 , 22 ) = gcd ⁡ ( 22 , 55   m o d   22 ) = gcd ⁡ ( 22 , 11 ) = 11 \operatorname{gcd}(55,22)=\operatorname{gcd}(22,55 \bmod 22)=\operatorname{gcd}(22,11)=11 gcd(55,22)=gcd(22,55mod22)=gcd(22,11)=11

🕘 3.3 扩展欧几里得算法 ☆

𝒂 𝒙 + 𝒃 𝒚 = 𝒈 𝒄 𝒅 ( 𝒂 , 𝒃 ) 𝒂𝒙+𝒃𝒚=𝒈𝒄𝒅(𝒂,𝒃) ax+by=gcd(a,b)

  • 扩展欧几里得算法对于接下来要学习的 高级加密标准AES、公钥加密算法RSA 非常重要
  • 对于给定的𝒂,𝒃,不仅可以计算出最大公因子𝒅,还可得到整数𝒙,𝒚 满足如上方程

已知: 𝒂 = 𝒒 𝒃 + 𝒓 𝒂=𝒒𝒃+𝒓 a=qb+r
𝒂 𝒙 𝟏 + 𝒃 𝒚 𝟏 = 𝒈 𝒄 𝒅 ( 𝒂 , 𝒃 ) 𝒂𝒙_𝟏+𝒃𝒚_𝟏=𝒈𝒄𝒅(𝒂,𝒃) ax1+by1=gcd(a,b)
𝒃 𝒙 𝟐 + ( 𝒂   𝒎 𝒐 𝒅   𝒃 ) 𝒚 𝟐 = 𝒈 𝒄 𝒅 ( 𝒃 , 𝒂   𝒎 𝒐 𝒅   𝒃 ) 𝒃𝒙_𝟐+(𝒂 \ 𝒎𝒐𝒅 \ 𝒃)𝒚_𝟐=𝒈𝒄𝒅(𝒃,𝒂 \ 𝒎𝒐𝒅 \ 𝒃) bx2+(a mod b)y2=gcd(b,a mod b)

求解: 𝒂 𝒙 𝟏 + 𝒃 𝒚 𝟏 = 𝒃 𝒙 𝟐 + ( 𝒂 𝒎 𝒐 𝒅 𝒃 ) 𝒚 𝟐 𝒂𝒙_𝟏+𝒃𝒚_𝟏=𝒃𝒙_𝟐+(𝒂 𝒎𝒐𝒅 𝒃)𝒚_𝟐 ax1+by1=bx2+(amodb)y2
𝒂 𝒙 𝟏 + 𝒃 𝒚 𝟏 = 𝒃 𝒙 𝟐 + ( 𝒂 − 𝒒 𝒃 ) 𝒚 𝟐 𝒂𝒙_𝟏+𝒃𝒚_𝟏=𝒃𝒙_𝟐+(𝒂−𝒒𝒃)𝒚_𝟐 ax1+by1=bx2+(aqb)y2
𝒂 𝒙 𝟏 + 𝒃 𝒚 𝟏 = 𝒃 𝒙 𝟐 + 𝒂 𝒚 𝟐 − 𝒒 𝒃 𝒚 𝟐 𝒂𝒙_𝟏+𝒃𝒚_𝟏=𝒃𝒙_𝟐+𝒂𝒚_𝟐−𝒒𝒃𝒚_𝟐 ax1+by1=bx2+ay2qby2
𝒂 𝒙 𝟏 + 𝒃 𝒚 𝟏 = 𝒂 𝒚 𝟐 + 𝒃 ( 𝒙 𝟐 − 𝒒 𝒚 𝟐 ) 𝒂𝒙_𝟏+𝒃𝒚_𝟏=𝒂𝒚_𝟐+𝒃(𝒙_𝟐−𝒒𝒚_𝟐) ax1+by1=ay2+b(x2qy2)
𝒙 𝟏 = 𝒚 𝟐 𝒚 𝟏 = 𝒙 𝟐 − 𝒒 𝒚 𝟐 𝒙_𝟏= 𝒚_𝟐 \qquad \qquad 𝒚_𝟏= 𝒙_𝟐−𝒒𝒚_𝟐 x1=y2y1=x2qy2
(这里看了好久也没明白有什么用T^T,希望有小伙伴能解释下)

解等式 1759 x + 550 y = g c d ( 1759 , 550 ) 1759x + 550y = gcd(1759,550) 1759x+550y=gcd(1759,550)

a b q i   d x i y i 1759 550 3 1 − 111 355 550 109 5 1 22 − 111 109 5 21 1 − 1 22 5 4 1 1 1 − 1 4 1 4 1 0 1 1 0 1 1 0 \begin{array}{|c|c|c|c|c|c|} \hline a & b & q_{i} & \mathrm{~d} & x_{i} & y_{i} \\ \hline 1759 & 550 & 3 & 1 & -111 & 355 \\ \hline 550 & 109 & 5 & 1 & 22 & -111 \\ \hline 109 & 5 & 21 & 1 & -1 & 22 \\ \hline 5 & 4 & 1 & 1 & 1 & -1 \\ \hline 4 & 1 & 4 & 1 & 0 & 1 \\ \hline 1 & 0 & & 1 & 1 & 0 \\ \hline \end{array} a1759550109541b5501095410qi352114 d111111xi111221101yi35511122110

因此 1759 × ( − 111 ) + 550 × 355 = g c d ( ) = 1 1759×(-111)+550×355 = gcd() = 1 1759×111+550×355=gcd()=1

🕘 3.4 扩展欧几里得求乘法逆元 ☆

原理:
𝟏 𝟏   ( 𝒎 𝒐 𝒅 𝟏 𝟕 ) 𝟏𝟏 \ (𝒎𝒐𝒅 𝟏𝟕) 11 (mod17)
𝒈 𝒄 𝒅 ( 𝟏 𝟕 , 𝟏 𝟏 ) = 𝟏 𝒈𝒄𝒅(𝟏𝟕,𝟏𝟏)=𝟏 gcd(17,11)=1
𝟏 𝟏 𝒚 ( 𝒎 𝒐 𝒅 𝟏 𝟕 ) = 𝟏 𝟏𝟏𝒚(𝒎𝒐𝒅 𝟏𝟕)=𝟏 11y(mod17)=1
𝟏 𝟏 𝒚 = 𝟏 𝟕 𝒙 + 𝟏 𝟏𝟏𝒚=𝟏𝟕𝒙+𝟏 11y=17x+1
𝟏 𝟏 𝒚 − 𝟏 𝟕 𝒙 = 𝟏 𝟏𝟏𝒚−𝟏𝟕𝒙=𝟏 11y17x=1
𝟏 𝟏 𝒚 + 𝟏 𝟕 𝒙 = 𝟏 = 𝒈 𝒄 𝒅 ( 𝟏 𝟕 , 𝟏 𝟏 ) 𝟏𝟏𝒚+𝟏𝟕𝒙=𝟏=𝒈𝒄𝒅(𝟏𝟕,𝟏𝟏) 11y+17x=1=gcd(17,11)

a b q i   d x i y i 17 11 1 1 2 − 3 11 6 1 1 − 1 2 6 5 1 1 1 − 1 5 1 5 1 0 1 1 0 1 1 0 \begin{array}{|c|c|c|c|c|c|} \hline a & b & q_{i} & \mathrm{~d} & x_{i} & y_{i} \\ \hline 17 & 11 & 1 & 1 & 2 & -3 \\ \hline 11 & 6 & 1 & 1 & -1 & 2 \\ \hline 6 & 5 & 1 & 1 & 1 & -1 \\ \hline 5 & 1 & 5 & 1 & 0 & 1 \\ \hline 1 & 0 & & 1 & 1 & 0 \\ \hline \end{array} a1711651b116510qi1115 d11111xi21101yi32110

( − 3 )   m o d   17 = 14 (-3) \ mod \ 17 = 14 (3) mod 17=14,因此y = 14,即所求乘法逆元

练习题
计算乘法逆元: 5   m o d   17 5 \ mod \ 17 5 mod 17
5 y ( m o d 17 ) = 1 5y(mod17)=1 5y(mod17)=1
g c d ( 5 , 17 ) = 1 gcd(5,17)=1 gcd(5,17)=1
17 x + 5 y = 1 17x+5y=1 17x+5y=1
a b q i d x i y i 17 5 3 1 − 2 7 5 2 2 1 1 − 2 2 1 2 1 0 1 1 0 1 1 0 \begin{array}{|c|c|c|c|c|c|} \hline a & b & q_{i} & d & x_{i} & y_{i} \\ \hline 17 & 5 & 3 & 1 & -2 & 7 \\ \hline 5 & 2 & 2 & 1 & 1 & -2 \\ \hline 2 & 1 & 2 & 1 & 0 & 1 \\ \hline 1 & 0 & & 1 & 1 & 0 \\ \hline \end{array} a17521b5210qi322d1111xi2101yi7210
7   m o d   17 = 7 7 \ mod \ 17 = 7 7 mod 17=7,因此y = 7,即所求乘法逆元

🕒 4. RSA算法 ☆☆☆

在这里插入图片描述

  • RSA算法 由Ron Rivest、Adi Shamir、Leonard Adleman共同提出,于2002年得图灵奖

  • RSA 最早满足了公钥算法的全部要求,迄今为止被广泛接受并实现应用

  • RSA也是分组密码

  • 明文和密文均是0到某n-1之间的整数
    (n: 1024位二进制数、309位十进制数)

  • 数学基础:欧拉定理、大整数因子分解的困难性
    (已知整数n,n是两个素数的积,即n=pq 。求解p、q的值)

加密:对每组明文分组M和密文分组C,加密过程:
𝑪 = 𝑴 e   𝒎 𝒐 𝒅   𝒏 𝑪=𝑴^e \ 𝒎𝒐𝒅 \ 𝒏 C=Me mod n

解密:对密文分组M的解密运算为:
𝑴 = 𝑪 𝒅   𝒎 𝒐 𝒅   𝒏 = ( 𝑴 𝒆 ) 𝒅   𝒎 𝒐 𝒅   𝒏 = 𝑴 𝒆 𝒅   𝒎 𝒐 𝒅   𝒏 𝑴=𝑪^𝒅 \ 𝒎𝒐𝒅 \ 𝒏=(𝑴^𝒆)^𝒅 \ 𝒎𝒐𝒅 \ 𝒏= 𝑴^{𝒆𝒅} \ 𝒎𝒐𝒅 \ 𝒏 M=Cd mod n=(Me)d mod n=Med mod n

满足条件:
(1)可以找到e、d、n,使得对所有 𝑴 < 𝒏 𝑴<𝒏 M<n,有 𝑴 𝒆 𝒅   𝒎 𝒐 𝒅   𝒏 = 𝑴   𝒎 𝒐 𝒅   𝒏 𝑴^{𝒆𝒅} \ 𝒎𝒐𝒅 \ 𝒏=𝑴 \ 𝒎𝒐𝒅 \ 𝒏 Med mod n=M mod n 𝒆 𝒅   ≡   𝟏   𝒎 𝒐 𝒅   ϕ ( 𝒏 ) \color{red}𝒆𝒅 \ ≡ \ 𝟏 \ 𝒎𝒐𝒅 \ \phi(𝒏) ed  1 mod ϕ(n)
(2)对所有𝑴<𝒏 ,计算𝑴e和𝑪𝒅是比较容易的。
(3)由e和n确定d是不可行的。

  1. 挑选p、q
    p = 17 , q = 11 p=17,q=11 p=17,q=11
  • Alice 现在要产生自己的公钥PU 与 私钥PR
  • 首先选择两个素数p、q,它们只能被1和自身整除,Alice选择了p=17,q=11
  • p、q保密,Alice选定得到
  1. 计算n
    𝒏 = 𝒑 𝒒 = 𝟏 𝟕 × 𝟏 𝟏 = 𝟏 𝟖 𝟕 𝒏=𝒑𝒒=𝟏𝟕×𝟏𝟏=𝟏𝟖𝟕 n=pq=17×11=187
  • 然后计算这两个素数pq的乘积n=187
  • n 公开,Alice计算得到
  1. 计算 ϕ ( 𝒏 ) \phi(𝒏) ϕ(n)
    ϕ ( 𝒏 ) = ϕ ( 𝒑 𝒒 ) \phi(𝒏) = \phi(𝒑𝒒) ϕ(n)=ϕ(pq)
    = ( 𝒑 − 𝟏 ) × ( 𝒒 − 𝟏 ) =(𝒑−𝟏)×(𝒒−𝟏) =(p1)×(q1)
    = 𝟏 𝟔 × 𝟏 𝟎 = 𝟏 𝟔 𝟎 =𝟏𝟔×𝟏𝟎=𝟏𝟔𝟎 =16×10=160
    计算乘积n的欧拉函数 ϕ ( 𝒏 ) = 160 \phi(𝒏)=160 ϕ(n)=160

  2. 挑选e
    𝒈 𝒄 𝒅 ( ϕ ( 𝒏 ) , 𝒆 ) = 𝟏 𝒈𝒄𝒅(\phi(𝒏),𝒆)=𝟏 gcd(ϕ(n)e)=1 𝟏 < 𝒆 < ϕ ( 𝒏 ) 𝟏<𝒆< \phi(𝒏) 1<e<ϕ(n)

  • 选出一个e,使得e与 ϕ ( 𝒏 ) \phi(𝒏) ϕ(n)互素,且保证e小于 ϕ ( 𝒏 ) \phi(𝒏) ϕ(n),Alice挑选的 e = 7 e=7 e=7
  • e 公开,Alice选定得到
  1. 计算d
    𝒅 ≡ 𝒆 ( − 𝟏 ) ( 𝒎 𝒐 𝒅 ϕ ( 𝒏 ) ) 𝒅\equiv𝒆^{(−𝟏) } ( 𝒎𝒐𝒅 \phi(𝒏) ) de(1)(modϕ(n))
  • 计算数值d,即求e在 m o d 160 mod 160 mod160下的乘法逆元,使用扩展欧几里得算法
  • d 保密,由Alice计算得到

插播:扩展欧几里得算法
7   ( 𝒎 𝒐 𝒅 160 ) 7 \ (𝒎𝒐𝒅 160) 7 (mod160)
𝒈 𝒄 𝒅 ( 160 , 7 ) = 𝟏 𝒈𝒄𝒅(160,7)=𝟏 gcd(160,7)=1
7 𝒚 ( 𝒎 𝒐 𝒅 160 ) = 𝟏 7𝒚(𝒎𝒐𝒅 160)=𝟏 7y(mod160)=1
7 𝒚 = 160 𝒙 + 𝟏 7𝒚=160𝒙+𝟏 7y=160x+1
7 𝒚 − 160 𝒙 = 𝟏 7𝒚−160𝒙=𝟏 7y160x=1
7 𝒚 + 160 𝒙 = 𝟏 = 𝒈 𝒄 𝒅 ( 160 , 7 ) 7𝒚+160𝒙=𝟏=𝒈𝒄𝒅(160,7) 7y+160x=1=gcd(160,7)

ϕ ( n ) e q i   d x i y i 160 7 22 1 − 1 23 7 6 1 1 1 − 1 6 1 6 1 0 1 1 0 1 1 0 \begin{array}{|c|c|c|c|c|c|} \hline \phi(n) & e & q_{i} & \mathrm{~d} & x_{i} & y_{i} \\ \hline 160 & 7 & 22 & 1 & -1 & 23 \\ \hline 7 & 6 & 1 & 1 & 1 & -1 \\ \hline 6 & 1 & 6 & 1 & 0 & 1 \\ \hline 1 & 0 & & 1 & 1 & 0 \\ \hline \end{array} ϕ(n)160761e7610qi2216 d1111xi1101yi23110

因此x=23=d,即所求乘法逆元

  1. 组成公私钥
    𝑷 𝑼 𝒂 = { 𝒆 , 𝒏 } = { 𝟕 , 𝟏 𝟖 𝟕 } 𝑷𝑼_𝒂=\{𝒆,𝒏\}=\{𝟕,𝟏𝟖𝟕\} PUa={e,n}={7,187}
    𝑷 𝑹 𝒂 = { 𝒅 , 𝒏 } = { 𝟐 𝟑 , 𝟏 𝟖 𝟕 } 𝑷𝑹_𝒂=\{𝒅,𝒏\}=\{𝟐𝟑,𝟏𝟖𝟕\} PRa={d,n}={23,187}
  • 将数值组合{e,n}作为公钥公开,将{d,n}作为私钥保密
  1. 生成密文Y
  • Bob 要给Alice 发送消息X,使用Alice的公钥 𝑷 𝑼 𝒂 𝑷𝑼_𝒂 PUa 加密

  • 算法规定将公钥中的数值e作为幂值,将数值n作为模数
    𝒀 = 𝑬 ( 𝑷 𝑼 𝒂 , 𝑿 ) 𝒀=𝑬(𝑷𝑼_𝒂,𝑿) Y=E(PUaX)
    = 𝑬 ( 𝒆 , 𝒏 , 𝑿 ) =𝑬({𝒆,𝒏},𝑿) =E(e,nX)
    = 𝑿 𝒆   𝒎 𝒐 𝒅   𝒏 =𝑿^𝒆 \ 𝒎𝒐𝒅 \ 𝒏 =Xe mod n
    = 𝟖 𝟖 𝟕   𝒎 𝒐 𝒅   𝟏 𝟖 𝟕 =𝟖𝟖^𝟕 \ 𝒎𝒐𝒅 \ 𝟏𝟖𝟕 =887 mod 187

  • RSA 也是分组密码,可以处理的明文X < n

  • 若Bob发送的明文X=88,Alice的公钥为{7,187},得出密文Y=11

  1. 还原明文X
  • Alice 收到密文Y后,使用她自己的私钥 𝑷 𝑹 𝒂 𝑷𝑹_𝒂 PRa进行解密

  • 解密算法函数与加密相同,仍然将密钥第一部分d作为幂值,第二部分n作为模数
    𝑿 = 𝑫 ( 𝑷 𝑹 𝒂 , 𝒀 ) 𝑿=𝑫(𝑷𝑹_𝒂,𝒀) X=D(PRaY)
    = 𝑫 ( { 𝒅 , 𝒏 } , 𝒀 ) =𝑫(\{𝒅,𝒏\},𝒀) =D({d,n}Y)
    = 𝒀 𝒅   𝒎 𝒐 𝒅   𝒏 =𝒀^𝒅 \ 𝒎𝒐𝒅 \ 𝒏 =Yd mod n
    = 𝟏 𝟏 𝟐 𝟑   𝒎 𝒐 𝒅   𝟏 𝟖 𝟕 =𝟏𝟏^{𝟐𝟑} \ 𝒎𝒐𝒅 \ 𝟏𝟖𝟕 =1123 mod 187

  • 私钥 𝑷 𝑹 𝒂 = { 23 , 187 } 𝑷𝑹_𝒂=\{23,187\} PRa={23,187}

  • 计算得到的结果X=88,与Bob发送的原始数值相同

小结

  1. 素数 p , q p, q p,q
  2. n = p × q \boldsymbol{n}=\boldsymbol{p} \times \boldsymbol{q} n=p×q
  3. ϕ ( n ) = ( p − 1 ) × ( q − 1 ) \boldsymbol{\phi}(\boldsymbol{n})=(\boldsymbol{p}-\mathbf{1}) \times(\boldsymbol{q}-\mathbf{1}) ϕ(n)=(p1)×(q1)
  4. gcd ⁡ ( e , ϕ ( n ) ) = 1 \operatorname{gcd}(e, \phi(n))=1 gcd(e,ϕ(n))=1
  5. d ≡ e − 1 (   m o d   ϕ ( n ) ) d \equiv e^{-1}(\bmod \phi(n)) de1(modϕ(n))
  6. P U = { e , n } , P R = { d , n } P U=\{e, n\}, P R=\{d, n\} PU={e,n},PR={d,n}
  7. Y = X e   m o d   n Y=X^{e} \bmod n Y=Xemodn
  8. X = Y d   m o d   n X =Y^{d} \bmod n X=Ydmodn

视频资料
🔎 【推荐】探秘公钥加密算法 RSA
🔎 数学不好也能听懂的算法 - RSA加密和解密原理和过程
🔎 【软件科普】如何保证发出去的微信和QQ消息不被篡改?详解RSA加密算法
🔎 银行密码系统安全吗?质数(素数)到底有啥用?李永乐老师11分钟讲RSA加密算法
🔎 【RSA加密算法】| RSA加密过程详解 | 公钥加密| 密码学| 信息安全

🕘 4.1 RSA计算问题

🕤 4.1.1 模幂运算

𝟐 𝟑   𝒎 𝒐 𝒅   𝟏 𝟖 𝟕 = 𝟖   𝒎 𝒐 𝒅   𝟏 𝟖 𝟕  √ 𝟐^𝟑 \ 𝒎𝒐𝒅 \ 𝟏𝟖𝟕=𝟖 \ 𝒎𝒐𝒅 \ 𝟏𝟖𝟕 \ √ 23 mod 187=8 mod 187 
𝟐 𝟏 𝟑   𝒎 𝒐 𝒅   𝟏 𝟖 𝟕 = ? 𝟐^{𝟏𝟑} \ 𝒎𝒐𝒅 \ 𝟏𝟖𝟕= ? 213 mod 187=?

【问题】

  • 在RSA中,加密和解密都需要进行模幂运算
  • 当指数e选取的比较大,若先计算幂值,乘法次数太多,中间结果较大,计算效率低

𝟐 𝟏 𝟑 𝒎 𝒐 𝒅 𝟏 𝟖 𝟕 = ( 𝟐 𝟏 × 𝟐 𝟒 × 𝟐 𝟖 ) 𝒎 𝒐 𝒅 𝟏 𝟖 𝟕 𝟐^{𝟏𝟑} 𝒎𝒐𝒅 𝟏𝟖𝟕=(𝟐^𝟏×𝟐^𝟒×𝟐^𝟖 ) 𝒎𝒐𝒅 𝟏𝟖𝟕 213mod187=(21×24×28)mod187
= ( ( 𝟐 𝟏 𝒎 𝒐 𝒅 𝟏 𝟖 𝟕 ) × ( 𝟐 𝟒 𝒎 𝒐 𝒅 𝟏 𝟖 𝟕 ) × ( 𝟐 𝟖 𝒎 𝒐 𝒅 𝟏 𝟖 𝟕 ) ) 𝒎 𝒐 𝒅 𝟏 𝟖 𝟕 =((𝟐^𝟏 𝒎𝒐𝒅 𝟏𝟖𝟕)×(𝟐^𝟒 𝒎𝒐𝒅 𝟏𝟖𝟕)×(𝟐^𝟖 𝒎𝒐𝒅 𝟏𝟖𝟕))𝒎𝒐𝒅 𝟏𝟖𝟕 =((21mod187)×(24mod187)×(28mod187))mod187

【解决方法】

  • 运用模运算的性质,将其分解为若干个因子,模运算的中间结果容易计算,算法效率提高了

𝟐 𝟏 𝟑 𝒎 𝒐 𝒅 𝟏 𝟖 𝟕 = ( 𝟐 𝟏 × 𝟐 𝟒 × 𝟐 𝟖 ) 𝒎 𝒐 𝒅 𝟏 𝟖 𝟕  √ 𝟐^{𝟏𝟑} 𝒎𝒐𝒅 𝟏𝟖𝟕=(𝟐^𝟏×𝟐^𝟒×𝟐^𝟖 ) 𝒎𝒐𝒅 𝟏𝟖𝟕 \ √ 213mod187=(21×24×28)mod187 
𝟐 𝟏 𝟑 0   𝒎 𝒐 𝒅   𝟏 𝟖 𝟕 = ? 𝟐^{𝟏𝟑0} \ 𝒎𝒐𝒅 \ 𝟏𝟖𝟕= ? 2130 mod 187=?

【问题】
当指数e选取的非常大,RSA算法如何有效地对其因子分解呢?

【解决方法二】
使用快速模幂算法 增加 RSA的效率
a b 𝒎 𝒐 𝒅   n a^{b} 𝒎𝒐𝒅 \ n abmod n
如计算 𝟐 𝟏 𝟗 𝒎 𝒐 𝒅   𝟑 𝟑 𝟐^{𝟏𝟗} 𝒎𝒐𝒅 \ 𝟑𝟑 219mod 33

i 4 3 2 1 0 b i 1 0 0 1 1 c 1 2 4 9 19 f 2 4 16 17 17 \begin{array}{|c|c|c|c|c|c|} \hline \boldsymbol{i} & 4 & 3 & 2 & 1 & 0 \\ \hline \boldsymbol{b}_{\boldsymbol{i}} & 1 & 0 & 0 & 1 & 1 \\ \hline \boldsymbol{c} & 1 & 2 & 4 & 9 & 19 \\ \hline \boldsymbol{f} & 2 & 4 & 16 & 17 & 17 \\ \hline \end{array} ibicf411230242041611917011917

其中 i i i表示2的幂, b i b_i bi 10011 10011 10011其实就是19的二进制数。

流程参考下面伪代码

k = 最高幂值 (本题是4)
c = 0; f = 1
for(i = k , i > 0 , i--)
	do c = 2 × c 
		f = (f × f) mod n
	if bi = 1
	    c = c + 1
		f = (f × a) mod n
return f

右下角的 f = 17 f = 17 f=17 即为所求结果。

练习题
已知RSA算法的公钥为{37,55},请使用 快速模幂算法 计算明文2所对应的密文。
i 5 4 3 2 1 0 b i 1 0 0 1 0 1 c 1 2 4 9 18 37 f 2 4 16 17 14 7 \begin{array}{|c|c|c|c|c|c|c|} \hline \boldsymbol{i} & 5& 4 & 3 & 2 & 1 & 0 \\ \hline \boldsymbol{b}_{\boldsymbol{i}} & 1 & 0 & 0 & 1 & 0 & 1 \\ \hline \boldsymbol{c} & 1 & 2 & 4 & 9 & 18 & 37 \\ \hline \boldsymbol{f} & 2 & 4 & 16 & 17 & 14 & 7\\ \hline \end{array} ibicf51124024304162191710181401377

🕤 4.1.2 使用公钥

𝑷 𝑼 = { 𝒆 , 𝒏 } 𝑷𝑼=\{𝒆,𝒏\} PU={e,n}
𝑿 𝒆 𝒎 𝒐 𝒅   𝒏 = 𝒀 𝑿^𝒆 𝒎𝒐𝒅 \ 𝒏=𝒀 Xemod n=Y

【问题】

  • 为了加快RSA使用公钥的运算速度,通常都会选择一个特定的e,如3、17、65537
  • 若e太小,如e=3,可使用中国剩余定理进行攻击

🕤 4.1.3 使用私钥

𝑷 R = { d , 𝒏 } 𝑷R=\{d,𝒏\} PR={d,n}
Y d 𝒎 𝒐 𝒅   𝒏 = X Y^d 𝒎𝒐𝒅 \ 𝒏=X Ydmod n=X

【问题】

  • 私钥d是选取了e后通过计算得来,无法控制大小
  • 可以借用中国剩余定理、费马定理简化运算,将算法效率提高4倍

🕤 4.1.3 密钥产生

𝑷 U = { e , 𝒏 } 𝑷U=\{e,𝒏\} PU={e,n} 𝑷 𝑹 = { 𝒅 , 𝒏 } 𝑷𝑹=\{𝒅,𝒏\} PR={d,n}

【问题】

  • 攻击者知道n,但不知道构成n的因子p、q
  • 为避免穷举得到因子,p、q应该足够大,目前还没有可靠的方法可以产生任意大素数,只能随机生成较大的奇数,使用Miller-Rabin算法测试

🕘 4.2 RSA的安全性

🕤 4.2.1 穷举攻击

攻击者试图穷举所有可能的私钥

🕤 4.2.2 数学攻击

𝒏 = 𝒑 × 𝒒 𝒏=𝒑×𝒒 n=p×q
ϕ ( 𝒏 ) = ( 𝒑 − 𝟏 ) × ( 𝒒 − 𝟏 ) \phi(𝒏)=(𝒑−𝟏)×(𝒒−𝟏) ϕ(n)=(p1)×(q1)
𝒅 ≡ 𝒆 ( − 𝟏 ) ( 𝒎 𝒐 𝒅 ϕ ( 𝒏 ) ) 𝒅≡𝒆^{(−𝟏)} (𝒎𝒐𝒅 \phi(𝒏)) de(1)(modϕ(n))

【数学攻击的途径】
①将n分解为两个素因子
②直接确定 ϕ ( 𝒏 ) \phi(𝒏) ϕ(n)而不确定p和q,这样同样能确定d
③直接确定d,而不确定 ϕ ( 𝒏 ) \phi(𝒏) ϕ(n)

因子分解问题的进展情况
 十进制位数   二进制位数(近似值)   完成日期  100 332 1991  年  4  月  110 365 1992  年  4  月  120 398 1993  年  6  月  129 428 1994  年  4  月  130 431 1996  年  4  月  140 465 1999  年  2  月  155 512 1999  年  8  月  160 530 2003  年  4  月  174 576 2003  年  12  月  200 663 2005  年  5  月  193 640 2005  年  11  月  232 768 2009  年  12  月  \begin{array}{|c|c|c|} \hline \text { 十进制位数 } & \text { 二进制位数(近似值) } & \text { 完成日期 } \\ \hline 100 & 332 & 1991 \text { 年 } 4 \text { 月 } \\ \hline 110 & 365 & 1992 \text { 年 } 4 \text { 月 } \\ \hline 120 & 398 & 1993 \text { 年 } 6 \text { 月 } \\ \hline 129 & 428 & 1994 \text { 年 } 4 \text { 月 } \\ \hline 130 & 431 & 1996 \text { 年 } 4 \text { 月 } \\ \hline 140 & 465 & 1999 \text { 年 } 2 \text { 月 } \\ \hline 155 & 512 & 1999 \text { 年 } 8 \text { 月 } \\ \hline 160 & 530 & 2003 \text { 年 } 4 \text { 月 } \\ \hline 174 & 576 & 2003 \text { 年 } 12 \text { 月 } \\ \hline 200 & 663 & 2005 \text { 年 } 5 \text { 月 } \\ \hline 193 & 640 & 2005 \text { 年 } 11 \text { 月 } \\ \hline 232 & 768 & 2009 \text { 年 } 12 \text { 月 } \\ \hline \end{array}  十进制位数 100110120129130140155160174200193232 二进制位数(近似值332365398428431465512530576663640768 完成日期 1991  4  1992  4  1993  6  1994  4  1996  4  1999  2  1999  8  2003  4  2003  12  2005  5  2005  11  2009  12  

因子分解方法

  • 在20世纪90年代中期,分解算法都采用二次筛法, 如对RSA-129的分解.
  • RSA-130的分解则采用了一个新算法,称为一般数域筛法,该算法在分解RSA-130时所做的计算仅比分解RSA-129多20%.

在这里插入图片描述

  • 对特殊形式的数字,特殊数域筛法比一般数域筛法快得多。
  • 估计在未来一段比较长的时期,密钥长度介于1024比特至2048比特之间的RSA是安全的.

🕤 4.2.3 计时攻击

↓ ↓ ↓ ↓ ↓ \hspace{2.4em} \downarrow\hspace{1em} \downarrow\hspace{1.3em} \downarrow\hspace{1.5em} \downarrow\hspace{1.5em} \downarrow
i 4 3 2 1 0 b i 1 0 0 1 1 c 1 2 4 9 19 f 2 4 16 17 17 \begin{array}{|c|c|c|c|c|c|} \hline \boldsymbol{i} & 4 & 3 & 2 & 1 & 0 \\ \hline \boldsymbol{b}_{\boldsymbol{i}} & 1 & 0 & 0 & 1 & 1 \\ \hline \boldsymbol{c} & 1 & 2 & 4 & 9 & 19 \\ \hline \boldsymbol{f} & 2 & 4 & 16 & 17 & 17 \\ \hline \end{array} ibicf411230242041611917011917

【攻击】对解密过程(模幂运算)进行计时
【过程】
①从最左位 𝒃 𝒌 𝒃_𝒌 bk开始,一位一位地进行
②若该位为1,则要执行 𝒇 = ( 𝒇 × 𝒂 ) 𝒎 𝒐 𝒅   𝒏 𝒇=(𝒇×𝒂) 𝒎𝒐𝒅 \ 𝒏 f=(f×a)mod n,对于一些𝒇 和 𝒂,执行的时间异常慢
③若该位为0,则整个过程执行得很快

【解决方法】

  • 不变的幂运算时间:保证所有幂运算的返回结果前的执行时间都相同
  • 随机延时:加入随机延时来迷惑计时攻击者,仍然可能被攻击
  • 隐蔽:执行幂运算前将密文乘上一个随机数

练习题:用下图所示的RSA算法对下列数据实现加密和解密
a .   p = 3 ; q = 11 , e = 7 ; M = 5 ; a. \ p=3;q=11,e=7;M=5; a. p=3;q=11,e=7;M=5;
b .   p = 5 ; q = 11 , e = 3 ; M = 9 ; b. \ p=5;q=11,e=3;M=9; b. p=5;q=11,e=3;M=9;
在这里插入图片描述
解答:
在这里插入图片描述
在这里插入图片描述


OK,以上就是本期知识点“公钥密码学与RSA”的知识啦~~ ,感谢友友们的阅读。后续还会继续更新,欢迎持续关注哟📌~
💫如果有错误❌,欢迎批评指正呀👀~让我们一起相互进步🚀
🎉如果觉得收获满满,可以点点赞👍支持一下哟~

❗ 转载请注明出处
作者:HinsCoder
博客链接:🔎 作者博客主页

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值