????????这里我们将探讨为什么素数在密码学中很重要。我们将根据特定的密码系统( RSA 算法)来进行深入了解。
????????每个数字都可以分解为它的素数。一般来说,找到一个数的因数是非常困难的。要找到一个自然数的所有素因数,必须尝试将其除以它的可能因数。
????????找到一个大数的质因数是非常困难的。但计算具有给定素数的数字非常容易:
????????理想情况下,我们使用两个大的素数。然后我们计算这两者的乘积来加密消息。为了解密它,我们需要素数之一,因为没有简单的方法可以单独计算素数 1 和素数 2。但在我们详细讨论如何准确使用这些数字之前,让我们先看一下不同的加密系统。
????????在密码学中,我们有两种重要的方法来加密消息:对称加密和非对称加密。
????????在对称情况下,双方共享相同的密钥。我们使用相同的密钥来加密和解密消息。只要只有两个人拥有钥匙,并且他们有办法安全地彼此分享,那就非常安全。
????????现在我们可以想象,这种方法实现起来是非常困难的。如果我们想给某人写一封加密的电子邮件,我们不必首先与他亲自会面来交换密钥。
????????这就是为什么在非对称加密中,我们有两种不同的密钥,一种用于加密,一种用于解密。一把钥匙是给消息作者的。写完消息后,他可以使用收件人的公钥对其进行加密。顾名思义,该密钥是公开的,并且可以在密钥数据库中进行查找。由于它仅用于加密,因此公开不会造成任何损害。另一方面,还有私钥。该密钥仅对一个人(即消息的接收者)可见。他可以用它来解密他收到的消息:
????????现在我们已经了解了两种不同的加密系统,让我们看看在非对称加密的情况下如何创建公钥和私钥。首先,应该知道,我们不能直接加密文本,而必须先将其转换为数字。这个过程称为填充,发生在一个为每个符号分配一个数字的列表中。然后我们将每个数字连接起来创建另一个数字,这里我们称之为,然后对其进行加密。一个非常简单的填充列表只是将每个字母分配到其在字母表中的位置,例如,“A”分配给?1,“B”分配给?2?等。虽然此列表只允许非常简单的单词,但足以理解?RSA?背后的理论。?
????????我们在以下过程中使用这种机制来创建两个密钥,一个私钥和一个公钥:
? ? ? ? 1、选择两个随机的、随机独立的素数,p和q。
? ? ? ? 2、计算两者的乘积N = pq。
? ? ? ? 3、计算两者的?Phi?函数:
? ? ? ? 4、选择一个与N互质且小于N的自然数g
? ? ? ? 5、计算g模的乘法逆k,即,
????????N和g现在构建我们的公钥,我们将使用它们来加密消息。k是我们的私钥,用来解密。为了更清楚地看到这一点,我们来看看加密和解密过程。
????????现在,我们使用公钥对消息进行加密:
????????我们用以下方法解密它:
????????正如我们所看到的,只有当我们有的乘法逆时,我们才能解密。
????????由于在可预见的未来不可能计算出较大的素数(N),因此没有私钥就无法解密消息。这使得系统非常安全。
????????我们要加密的字母是“O”,我们将其转换为数字,因为它是字母表中的第十五个数字。现在我们选择随机素数。为了简单起见,我们选择素数和。
?????????然后我们构建素数的 phi 函数
? ? ? ? 选择一个与互质的自然数g,我们选择29。
????????唯一需要计算的是g的逆k。。在欧几里得算法的帮助下,我们将其计算为53。
#求解二元一次不定方程
#29x + 192y = 1
def ext_euclid(a, b):
if b == 0:
return 1, 0, a
else:
x, y, q = ext_euclid(b, a % b)
x, y = y, (x - (a // b) * y)
return x, y, q
ext_euclid(29, 192)
# 解为x = 53 y=-8
????????这样我们就有了公钥。还有我们的私钥。
????????接下来我们加密我们的数字:
????????我们现在就拥有了加密的消息,并且可以安全地将其传输给收件人,而任何人都无法知道它代表字母“O”。
????????为了解密消息,我们需要逆数
?????????现在我们再次查看字母表,看到第十五个字母是“O”,这意味着我们已经成功加密和解密了我们的消息。
????????正如上面所描述的,我们可以利用无法将大数分解为素数来生成安全的非对称密码系统。