首页 > 其他分享 >RSA的原理和简单实践

RSA的原理和简单实践

时间:2025-01-16 17:32:15浏览次数:1  
标签:实践 phi RSA textbf kp let 原理 mod equiv

RSA加密是一种非对称加密,原理是:

  • 使⽤算法可以⽣成两把钥匙 A 和 B
  • 使⽤ A 加密的信息,使⽤ B 可以解开
  • 使⽤ B 加密的信息,使⽤ A 可以解开

⽇常使⽤中,我们把⼀把作为公钥公开发布。⼀把作为私钥,⾃⼰保留。这样,任何⼈都可以使⽤我们的公钥加密信息发给我们,我们则可以使⽤⾃⼰的私钥解开。

只要把私钥保存好,这个通信系统就⾮常安全。

数学基础

1. 欧拉函数

欧拉函数的输入是一个正整数,输出小于这个正整数的、跟它互质的整数数量。

定义是:

\[\phi(n)=n(1-\frac{1}{p_1})(1-\frac{1}{p_2})\cdots(1-\frac{1}{p_m}) \]

\(p_1, p_2, \cdots, p_m\) 表示 \(n\) 的 $ m $ 个质因子,重复的算一个。

比如5,它是个质数,只有它自己一个因子,所以\(\phi(5) = 5 \times (1 - \frac{1}{5}) = 4\)。
当然你也能猜出来,因为跟一个质数互质的数就是从1到它的前驱数的全部自然数,所以对于任意质数 \(p\) 都有

\[\phi(p) = p-1 \]

对于合数呢?比如 \(6 = 2 \times 3\),所以 \(\phi(6) = 6 \times \frac{1}{2} \times \frac{2}{3} = 2\) ,也就是6有2个互质数,我们数一下就是1和5。
再看一个比如12,\(12 = 2^2 \times 3\),所以 \(\phi(12) = 12 \times \frac{1}{2} \times \frac{2}{3} = 4\)。我们数一下12的互质数有1、5、7、11四个。

规定\(\phi(1)=1\)

欧拉函数的证明比较简单,可以自行AI。

2. 欧拉定理

当正整数 \(a\) 和 \(n\) 互质时,有

\[a^{\phi(n)}\equiv 1 (\textbf{mod } n ) \]

换句话说,\(a^{\phi(n)} - 1\) 可以被 \(n\) 整除。

例如,7和10互质。\(7^{\phi(10)} = 7^4 = 2401\),减去1时10的倍数;
反过来,\(10^{\phi(7)} = 10^6 = 100,0000\),减去1是999999,\(999999 \div 7 = 142857\) (就是1/7 的循环节)。

3. 模反元素

从上面计算的过程可以看出来,如果正整数 \(a\) 和 \(n\) 互质时,一定能找出一个正整数 \(b\),使得

\[ab \equiv 1 (\textbf{mod } n) \]

\(b\) 就叫 \(a\) 的模反元素。
模反元素肯定存在。最起码,由于 \(a^{\phi(n)} = a a^{\phi(n) - 1} \equiv 1 (\textbf{mod } n)\) 所以 $ b = a^{\phi(n) - 1}$。

实际上,\(b\) 加减 \(n\) 的倍数都是 \(a\) 的模反元素。
比如上面看到了,10对7的模反元素可以是10万,因为100万减1是7的倍数。那么用10万减去7的14285倍也就是99995得到5,5乘以10得到50,再减1也是7的倍数。

密钥生成

上面就是全部的数学基础。通过这些可以来生成密钥了。

1. 随机选择两个大质数p和q并计算他们的积n

为了演示,这里选择p = 7和q = 11,有 n = 77。
实际应用中,要求n的位数在600位以上才能保证安全。

因为要求n的二进制位大于2048,折成十进制就是617位以上

2. 计算n的欧拉函数 \(\phi(n)\)

虽然n很大,但是由于p和q是质数,所以就简单了

\[\phi(n) = (p -1)(q-1) \]

在我们例子里就是6*10 = 60。

后面为了写起来方便,用字母 \(z\) 表示欧拉函数的结果:\(z = \phi(n)\)。

3. 选择一个数e跟 \(\phi(n)\) 互质并计算e的模反元素d

要找一个数跟 \(z\) 互质,e可以比 \(\phi(n)\) 更大。不过 \(\phi(n)\) 已经很大了,所以一般最大也就使用65537。

使用公开的数不会降低系统安全性

这里需要跟60互质,我们选择e = 13。
简单应用上面的方法,可以得到 \(d = e^{\phi({60})-1}\)。
这个60比较小,\(60=2^2 \times 3 \times 5\), 所以\(\phi(60) = 16\), \(d = 13 ^ {15}\) 虽然大但是也能算出来。

但是在实际中,\(z\) 通常大得很,就算能求出它的欧拉函数值,模反元素也算不出来。

扩展欧几里得算法

换一种思路。既然 \(ed \equiv 1 (\textbf{mod } z)\),也就是 \(ed-kz=1\),k是某个整数。
而扩展欧几里得算法不仅可以求出两个整数a和b的最大公约数d,还可以找到整数x和y,使得

\[ax+by=d \]

算法实现很简单:

fn extended_gcd(a: i64, b: i64) -> (i64, i64, i64) {
    if b == 0 {
        (a, 1, 0)
    } else {
        let (gcd, x1, y1) = extended_gcd(b, a % b);
        let x = y1;
        let y = x1 - (a / b) * y1;
        (gcd, x, y)
    }
}

代入13和60,得到d=-23。给它加60的倍数使它变成正数,所以d=37。

这样,公钥就是[n, e]=[77,13],私钥就是[n,d]=[77,37]。

私钥的安全性

已知公钥能算出私钥吗?

  • 因为 \(ed \equiv 1 (\textbf{mod } z)\),而e已知,所以想算出d需要知道z
  • \(z = \phi(n) = (p -1)(q-1)\),需要拿到p和q
  • \(n = p \times q\),n已知,分解质因数可得p和q

所以这套逻辑的保证就是第三步很难。而一旦成功分解了,私钥就很容易算了。

加密和解密

加密过程

被加密的消息 m 需要是⼀个⼩于 n 的整数(我们可以将任意字节流直接解读为⼀个⽆符号整数)。如果消息太⼤,解读为整数以后⽐ n 要⼤,那么就分段加密。
实际应用中,我们不会直接⽤ RSA 来加密消息,⽽是⽤ RSA 来加密⼀个对称秘钥,再⽤这个秘钥加密消息。

加密的过程就是计算下面这个c的过程:

\[m^{e} \equiv c (\textbf{ mod } n) \]

假设我们要加密的消息是50,使用上面的计算

\[50^{13} \equiv c (\textbf{ mod } 77) \]

可得c=29,这就是加密后的消息。
计算c的算法可以参考

fn main() {
    let base = 50; // 原始消息,不能大于77
    let exponent = 13;
    let modulus = 77;
    let result = modular_exponentiation(base, exponent, modulus);
    println!("{}", result); // 加密结果
}

fn modular_exponentiation(base: i64, exponent: i64, modulus: i64) -> i64 {
    let mut result = 1;
    let mut base = base % modulus;
    let mut exponent = exponent;
    while exponent > 0 {
        if exponent % 2 == 1 {
            result = (result * base) % modulus;
        }
        exponent >>= 1;
        base = (base * base) % modulus;
    }
    result
}

解密过程

解密过程是一样的,依据是

\[c^{d} \equiv m (\textbf{ mod } n) \]

    let base = 29;
    let exponent = 37;
    let modulus = 77;
    let result = modular_exponentiation(base, exponent, modulus);
    println!("{}", result);

输出结果是50,就是我们原来的消息。

解密依据的证明

为什么当 \(m^{e} \equiv c (\textbf{ mod } n)\) 时会有 \(c^{d} \equiv m (\textbf{ mod } n)\) 呢?


\[\because m^{e} \equiv c (\textbf{ mod } n) \\ \therefore c= m^e-kn \]

代入目标式:

\[({m^e-kn})^d\equiv m (\textbf{ mod } n) \]

根据二项式定理,左边展开后除了第一项是$ m^{ed}$ 其余项都含有 \(kn\),必然是n的倍数,所以舍弃这些项。只要证明

\[m^{ed} \equiv m (\textbf{ mod } n) \]

即可。
根据定义,

\[\because ed \equiv 1 (\textbf{ mod } z) \\ \therefore ed = 1+hz \]

代入可得

\[m^{1+hz} = m^{h \phi(n) + 1} \equiv m (\textbf{ mod } n) \]

  1. 当m和n互质时

\[\because m^{\phi(n)} \equiv 1(\textbf{ mod } n) \\ \therefore m^{\phi(n)} = rn + 1 \\ m^{\phi(n)h} = (rn + 1)^h \overset{\underset{\mathrm{二项式定理}}{}}{=} tn + 1 \\ \therefore m^{\phi(n)h} \equiv 1(\textbf{ mod } n) \\ \therefore m^{\phi(n)h} m \equiv m(\textbf{ mod } n) \]

得证。
2. 当m和n不互质
不互质时m只能时p或q的倍数。
以 \(m = kp\) 为例,k必然小于q,因为m<n。因为q是质数,所以k与q互质。同时m也跟q互质,否则m就大于n了。

\[\because m^{\phi(q)} \equiv 1(\textbf{ mod } q) \\ \therefore (kp)^{q-1} \equiv 1(\textbf{ mod } q) \\ \therefore (kp)^{q-1} =tq + 1 \\ \therefore (kp)^{(q-1)h(p-1)} =(tq + 1)^{h(p-1)} \]

又根据二项式定理

\[(kp)^{(q-1)h(p-1)} \equiv 1(\textbf{ mod } q) \\ \therefore (kp)^{(q-1)h(p-1)} kp \equiv kp (\textbf{ mod } q) \\ (kp)^{ed} \equiv kp (\textbf{ mod } q) \\ \therefore (kp)^{ed} = kp + tq \]

要使等式成立,每一项都需要是p的倍数,所以tq是p的倍数。因为q不是p的倍数,所以t是p的倍数 t = vp:

\[(kp)^{ed} = kp + vpq \\ m^{ed} = m + vn \\ \therefore m^{ed} \equiv m (\textbf{ mod } n) \]

得证。

标签:实践,phi,RSA,textbf,kp,let,原理,mod,equiv
From: https://www.cnblogs.com/somefuture/p/18674659

相关文章

  • 自然语言处理(GloVe):原理、特点、应用、技术、相关学术分享
    目录GloVe的基本原理GloVe的特点GloVe的应用GloVe与其他词嵌入技术相关学术会议分享GloVe(GlobalVectorsforWordRepresentation)是一种用于生成词嵌入(wordembeddings)的算法,旨在将单词表示为稠密向量,从而捕捉单词之间的语义关系。GloVe是由斯坦福大学的研究人员提出......
  • Python生成成绩报告单:从理论到实践
    在教育信息化日益普及的今天,自动化生成和处理学生成绩报告单已成为学校和教育机构的一项重要任务。Python作为一种功能强大且易于学习的编程语言,非常适合用于这种数据处理和报告生成任务。本文将详细介绍如何使用Python生成成绩报告单,包括理论概述和完整的代码示例。一、理论概述......
  • 如何让项目进度一目了然?办公可视化工具的最佳实践
    在数字化办公浪潮中,信息的快速流转与精准解读成为提升竞争力的关键要素。办公可视化工具应运而生,它宛如一座桥梁,跨越了数据的繁杂海洋,将晦涩难懂的数据转化为直观易懂的视觉呈现。从项目管理角度来看,可视化工具能够将项目进度、任务分配等关键信息以清晰的图表、看板形式展现,让团......
  • 20221320 冯泰瑞 《信息安全综合实践》课程设计报告——基于文本文件信息隐藏和二值图
    20221320冯泰瑞《信息安全综合实践》课程设计报告——基于文本文件信息隐藏和二值图像信息隐藏的回声信息隐藏算法实现任务简介隐藏原理研究发现,HAS(HumanAudioSystem,人类听觉系统)存在感知掩蔽效应,即强信号的存在会使其附近的弱信号难以被感知。因此,当回声与原声的间隔充分......
  • 市面上唯一一本全面解析Transformer的书《Transformer、BERT、GPT 大语言模型原理深度
    Transformer,BERT,andGPT:IncludingChatGPTandPromptEngineering,出版于2023年11月,作者是奥斯瓦尔德·坎佩萨托(OswaldCampesato)奥斯瓦尔德·坎佩萨托(OswaldCampesato):专门研究深度学习、Java、Android和TensorFlow。他是25本书的作者/合著者,其中包括TensorF......
  • CMAC原理剖析
    NOTE可用于数据完整性校验和保证消息来源合法性,算法强度取决于分组算法强度、消息鉴别码长度以及消息鉴别算法参考GB/T15852.1-2008信息技术安全技术消息鉴别码第1部分:采用分组密码的机制MAC长度大于零并且小于等于密码算法分组长度如果消息既需要加密有需要校验完整性,必......
  • 【微服务】微服务常见限流方案及TSF限流原理
    一、限流前考虑什么二、如何进行限流三、关于TSF的限流在微服务高并发的一些场景下,微服务之间的调用量不断增加,大流量因素很可能会引起服务雪崩,微服务的稳定性对业务系统的影响也比较大。一般微服务容错组件都提供了限流的方式来保护我们的系统,本文主要介绍微服务限流的......
  • 利用Python按关键字搜索阿里巴巴商品:代码示例与实践指南
    在电商领域,能够快速获取商品信息对于市场分析、选品上架、库存管理和价格策略制定等至关重要。阿里巴巴作为全球最大的电商平台之一,提供了丰富的商品数据。虽然阿里巴巴开放平台提供了官方API来获取商品信息,但有时使用爬虫技术来抓取数据也是一种有效的手段。本文将介绍如何利......
  • 【游戏设计原理】65 - 细节
    细节背后对应的是资源,而资源要投入到对玩家有意义的地方。而决定是否有意义的标准是什么呢?决定某个细节是否对玩家有意义,核心在于玩家体验。以下是几个判断标准和角度,帮助确定哪些细节值得投入资源:1.对核心体验的支持细节是否能增强玩家对游戏核心机制或主题的体验?如......
  • 探秘AutoGen框架:从入门到实践的全攻略(25/30)
    一、引言在人工智能技术日新月异的当下,多智能体协作与大型语言模型(LLM)的应用日益广泛。微软推出的AutoGen框架,犹如一颗璀璨的新星,为开发者们提供了一个强大的工具,以实现高效的多智能体对话和复杂任务的自动化处理。AutoGen框架致力于简化多智能体系统的开发过程,使开发者能......