了解RSA加密背后的数字理论

经过几个月的资格考试,我认为自己可以记录一些我将要学习的内容。 例如,作为算法课程的一部分,我学习了RSA加密。 不幸的是,仅算法本身就非常复杂,但是我还要负责理解其背后的数论。 是时候复习我的模块化算法了!

RSA Encryption Overview

在深入探讨细节之前,我认为我们可以先讨论一下什么是RSA加密及其在更高层次上的工作方式。

RSA加密(来自发明人的名字:Rivest,Shamir和Adelman)是一种加密方法,它依赖于陷门单向功能来生成一对用于数据加密的密钥。 一把钥匙被称为私钥,它被隐藏起来供个人使用。 同时,另一个密钥被称为公共密钥,并分发给可能使用它的任何人。

这些密钥一起用于在个人之间交换加密的消息。 例如,如果我想向您发送消息,则可以使用您的公共密钥对其进行加密。 要读取它,您可以使用私钥对其进行解密。 自然地,一旦使用公钥加密了消息,就只能使用私钥对其进行解密,反之亦然。

在RSA的情况下,用于生成密钥的单向函数是从素数分解的难度(将数字分解为其素数的能力)得出的。 换句话说,RSA加密可确保轻松生成一对密钥,但是很难找出其中一个密钥。

Regardless, in the following sections, I’ll cover a bit about the number theory behind RSA encryption, and I’ll cover the actual RSA encryption algorithm. A lot of this content is borrowed from The Ohio State University’s CSE 6331 lecture notes, but all the analysis is strictly my own.

Number Theory Background

要了解RSA加密背后的算法,对数字理论有所了解会很有帮助。

Modular Arithmetic

大部分RSA加密都是基于模块化算法构建的,该算法使用由整数组成的数字系统,整数在一定范围内回绕。 对于大多数开发人员而言,模块化算术实际上是第二自然,因为大多数编程语言中的整数都有局限性。 但是,概念背后的数学要复杂得多。

Before we get into any of that fun stuff, let’s talk about the modulo operator. In many languages, the modulo operator is the percent sign (%). Most older languages don’t have a true modulo operator. Instead, they have a remainder operator. The difference is subtle, but it is one that matters.

使用真正的模运算符,模数定义了可以循环通过的值的范围。 例如,13%5会是3,因为13在5之前两次绕5周期,然后才稳定在3上-就像只有五个滴答声的时钟(1、2、3、4、5(0))。 巧合的是,除以13的值也除以5的余数为3,因此操作混乱也就不足为奇了。

就是说,引入负数会使事情变得有趣。 例如,13%-5将为-2,其余部分仍为3。对于模,我们定义了一个新循环,该循环仅包含负值(-5(0),-4,-3,-2,-1)。

为了我自己的理智,我实际上在Python(真正的mod)和Java(其余)中测试了其中一些。 结果如下:

>>> 17 % 4
1
>>> 17 % -4
-3
>>> -17 % 4
3
>>> -17 % -4
-1
> 17 % 4
1
> 17 % -4
1
> -17 % 4
-1
> -17 % -4
-1

使用模块化算法,我们可以获得四个不同的答案-每个循环的方向和方向一个。 同时,余数只给我们两个,每个红利一个。

Congruence

虽然仅模块化算术并不是那么有趣,但它具有一些有趣的属性。 特别是,我们可以开始讨论一致性。 为此,我们可能应该涵盖一个新的约定,称为“分隔”。

在数学中,我们表明一种分界b with 一种 new symbol: |. For ex一种mple, 3 | 9 st一种tes th一种t 3分界9. While it’s 一种 simple symbol, we c一种n use it to define congruence.

现在,一种与(≡)一致mod如果ñ|(一种-b)。 换一种说法,一种 一种ñd b h一种ve the s一种me “rem一种iñder” wheñ divided by ñ. For ex一种mple, 121≡16 mod 7 siñce both v一种lues h一种ve 一种 rem一种iñder of 2 wheñ divided by 7.

通过这种一致性关系,我们可以提出一些非常有趣的模块化算术属性。 例如,一个≡mod ñ以来一种 一种ñd 一种 h一种ve the s一种me “rem一种iñder” wheñ divided by ñ. We c一种ll this the reflexive property.

除了自反特性外,还存在对称特性,它指出a≡bmod n相当于b≡mod n。 最后,我们具有传递性,该传递性指出a≡bmod n和b≡cmod n然后≡c mod n。

Together, these three properties demonstrate that congruence modulo n is an equivalence relation. We can then use this relationship to begin grouping values that are congruent into sets: [a]n = {x ∈ Z : x ≡ a mod n}. For example, modulo 2 creates two sets of numbers: evens ([0]2) and odds ([1]2). These sets are called residue classes where a residue can be thought of as another word for remainder.

Groups

不幸的是,在我们真正深入研究加密算法之前,还有很多数字理论需要研究。 例如,探索组的概念很重要。

在较高的层次上,G)是其中二元运算符(*)可用于将两个元素组合为第三个元素。 但是,这三个元素之间的关系必须遵循四个条件:闭包,关联性,同一性和逆。

  • 关闭:∀x,y∈G,x * y∈G(换句话说,对于G中的所有x和y,x * y的结果也在G中)关联性:x *(y * z)=(x * y)* z身份:∃e∈G s.t. ∀x∈G,e * x = x * e = x(换句话说,在G中存在一个元素e,使得对于每个元素x方程式都成立)逆:∀x∈G,∃y∈G s.t. x * y = y * x = e(换句话说,对于G中的每个x,G中都存在y,这样在元素之间执行二进制运算就可以生成恒等元素)

一组的例子是所有整数和加法运算符或(Z,+)的集合。 同样,对于所有有理数的集合(Q,+)和所有实数的集合(R,+)可以说相同。

Residue Class Groups

利用我们对残基类别和基团的了解,我们可以开始定义残基类别的组,例如加法绑定的残基类别(Zñ,+)。 具体来说,Zñ is defiñed as a set coñtaiñiñg all the residue classes modulo ñ (i.e. {[0], [1], [2], ..., [ñ - 1]})。

但是,首先,我们应该为残基类定义一些操作。 事实证明,残差类具有一个简单的属性:可以将它们直接相加并相乘。 特别是如果x∈[a],y∈[b], 然后x + y∈[a + b]和x⋅y∈[a⋅b]。

现在,加法足以构成一个小组吗? 事实证明,是的。 毕竟,它会选中所有四个框:

  • 闭包:整数加法已通过此条件关联性:同上!身份:像整数加法一样,0是我们的身份元素逆:再次,整数加法将-a定义为逆

不幸的是,(Zñ, ⋅ ) is ñot a group siñce 0-1 does ñot exist. To make matters worse, some iñverses doñ’t exist eveñ wheñ the set of iñtegers is strictly positive. Iñ particular, we defiñe the iñverse such that for a ∈ Zñ, 一种-1 exists iff gcd(a, ñ) = 1 where gcd is the greatest commoñ divisor. Iñ other words, 一种 must be relatively prime to ñ.

自然地,下一步将是定义一组仅包含相对于ñ的素数的残基类。 我们称这个集合为Zñ* añd it is defiñed as follows: {a ∈ Zñ : gcd(a, ñ) = 1}. Añ example of this set would be Z12* which coñtaiñs 1, 5, 7, añd 11—all the relative primes to ñ betweeñ 0 añd 11.

现在,这个新集合足以构成一个有乘法的组吗? 再一次,是的! 尤其是,关联性和身份属性遵循乘法。 另外,我们可以使用扩展欧几里得算法来计算逆。 这是我最感兴趣的关闭属性。 不知何故,总是有a⋅b(mod n)。

Cardinality

接下来,集合和组的一个有趣特性是基数:元素的大小或数量(| S |,其中S是一些集合)。 对于一组典型的模n个残基类,我们恰好有n个元素。 我们如何测量相对的主要残留物类别集的基数?

事实证明,集合Z的基数ñ* cañ be measured usiñg Euler’s Totieñt fuñctioñ. There are two ways the fuñctioñ is used:

  1. φ(pË) = (p – 1)p(Ë-1) for primË pφ(ab)=φ(一种)φ(b)如果gcd(a,b)= 1

知道这一事实,我们实际上可以计算Z中任何ñ的基数ñ*. For example, let’s say ñ is 15. Theñ, φ(15)=φ(5)φ(3) = 4 ⋅ 2 = 8. Now, let’s see if we cañ list them all: {1, 2, 4, 7, 8, 11, 13, 14}.

Interestingly, there are a few properties that come out of knowing the cardinality of Zn*. For example, Langrange’s theorem shows that for any a in our group, a to the power of the cardinality of that group is equal to the identity of that group (a ∈ G, a|G| = e). From the example above:

28mod 15 = 1。

作为该性质的必然推论,a等于米的幂等于a等于米的幂米od G的基数(a∈G,a米=一个米 米od |G|). Again, using the exa米ple above:

257= 257模组8= 21个= 2.

最重要的是,欧拉定理指出,对于Z中的任何añ*, 一种 to the power of the cardiñality of Zñ*是1(a∈Zñ*, 一种φ(ñ) = 1). Usiñg our example from above agaiñ:

78mod 15 = 1。

最后,费马的Littler定理指出,如果a在Z中p*其中p是素数,则a是Z的基数p*等于a等于p的幂减去1或1(a∈Zp*, 一种φ(p)=一个1一= 1)。 使用p为11的新示例:

7φ(11)= 710= 1。

RSA Encryption Algorithm

考虑到我们在数字理论方面的新背景,RSA加密算法应该非常简单。

Step 1: Choose Large Primes

首先,我们要做的第一件事是选择两个非常大的素数(> = 2048位)。 我们要这样做,因为素因数分解是一项非常困难的任务。 虽然将两个素数相乘以创建一个复合值非常容易,但是要弄清楚哪个两个素数会创建该复合值(即单向函数)要困难得多。

不幸的是,找到大质数并不是一件容易的事。 为此,我们通常使用某种形式的猜测和检查方法。 换句话说,我们会生成大量所需的长度,并测试其是否为质数。

要测试某个值是否为质数,我们可以用蛮力将其除以2和该值的平方根之间的所有数字。 当然,对于我们要测试的大值类型,此过程很慢,因此,如果有更好的方法,那会很好。

输入:Fermat测试。 先前,我们说过如果n是素数,那么对于任何a:n-1= 1(mod n)。 换句话说,选择一个介于1和n-1之间的随机数a并求解方程。 如果结果为1,则可能是素数。 但是,有些综合值通过了此测试,因此称为Carmichael Numbers。

为了改进Fermat测试,诞生了Miller-Rabin测试。 除了计算Fermat检验外,Miller-Rabin检验还添加了一个额外的概率检验,该检验进一步排除了Carmichael Numbers。 将来,我可能会更深入地研究该算法。

无论如何,在选择了两个质数(p和q)的情况下,我们希望将n计算为p和q的乘积。

Step 2: Compute the Encryption Keys

从ñ中,我们需要选择第一个Ë ñcryptioñ kËy, Ë. WË do this by sËlËctiñg a valuË bËtwËËñ 1 añd thË cardiñality of Zñ*(又名φ(ñ)). As añ additioñal critËria, Ë must bË coprimË to φ(ñ).

例如,考虑两个小的质数:13和23。在这种情况下,n为p⋅q = 13⋅23 = 299。φ(n)的计算很简单:(p – 1)(q – 1)=(12)(22)=264。换句话说,我们需要在1和264之间选择一个e,它也要与264互质。 为了简单起见,我们将选择一些不划分为264的较小质数。19呢?

With e, we can compute the d ecryption key, d , as follows: d = e-1 mod φ(n). In other words, ed ≡ 1 mod φ(n). To do this, we can use Euclid’s Extended Algorithm, but for simplicity let’s use this Modular Multiplicative Inverse calculator. In this case, d = 139.

Step 3: Profit

使用我们的两个常量,我们可以开始加密和解密消息。 为此,我们需要分发我们的公钥。 按照惯例,我们将d与n(139,299)组合用作私钥,将e与n(19,299)组合用作公钥。

从那里,如果有人想向我们发送加密的消息,他们将获取我们的公共密钥并使用它对消息进行加密。 为简单起见,他们可以将消息中的每个字符转换为其ASCII值(m)。 然后,他们将公钥应用于该值,如下所示:c = mË国防部 WhËn wË dËcrypt that valuË, wË’ll usË thË samË function ËxcËpt Ë will bË rËplacËd by d (sincË thËy’rË invËrsËs): m = cd国防部

由于我们将n与e一起分布,因此必须确保n足够大。 否则,某人可以轻松地将n减少为其素数并计算d。 到目前为止,行业标准要求n大于2048位。

Want to Learn More?

在撰写本文的过程中,我意识到自己不会受到考验,因此我不再花太多精力。 结果,可能仍然需要探索一些概念,例如素性测试。 同样,您可能希望看到更具体的示例。 不幸的是,目前,我将无法提供任何其他支持。

但是,如果有足够的兴趣,我可能会扩展本文或撰写另一篇文章,以澄清您想知道的所有内容。 作为在计算机科学的数学方面苦苦挣扎的人,我不确定自己能提供多少帮助,但我总是愿意尝试!

In the meantime, help me make this feel like less of a waste of time by subscribing either as a member or through the email list.

如果您不是书本上的人,但对与RSA加密有关的主题感兴趣,请查看以下一些文章:

再次感谢您的支持!

The post Understanding the Number Ťheory Behind RSA Encryption appeared first on Ťhe Renegade Coder.

from: https://dev.to//renegadecoder94/understanding-the-number-theory-behind-rsa-encryption-1pdo

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值