有趣的数学 为什么素数在密码学中很重要?

本文详细阐述了素数在密码学中的关键作用,特别是RSA算法中,利用素数的难以分解特性实现非对称加密。通过介绍对称和非对称加密的区别,以及如何通过选择随机素数生成公钥和私钥,确保了信息的安全传输。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        这里我们将探讨为什么素数在密码学中很重要。我们将根据特定的密码系统( RSA 算法)来进行深入了解。

一、素数的特殊性

        每个数字都可以分解为它的素数。一般来说,找到一个数的因数是非常困难的。要找到一个自然数的所有素因数,必须尝试将其除以它的可能因数。

        找到一个大数的质因数是非常困难的。但计算具有给定素数的数字非常容易:

        理想情况下,我们使用两个大的素数。然后我们计算这两者的乘积来加密消息。为了解密它,我们需要素数之一,因为没有简单的方法可以单独计算素数 1 和素数 2。但在我们详细讨论如何准确使用这些数字之前,让我们先看一下不同的加密系统。

二、密码系统

        在密码学中,我们有两种重要的方法来加密消息:对称加密和非对称加密。

        在对称情况下,双方共享相同的密钥。我们使用相同的密钥来加密和解密消息。只要只有两个人拥有钥匙,并且他们有办法安全地彼此分享,那就非常安全。

        现在我们可以想象,这种方法实现起来是非常困难的。如果我们想给某人写一封加密的电子邮件,我们不必首先与他亲自会面来交换密钥。

        这就是为什么在非对称加密中,我们有两种不同的密钥,一种用于加密,一种用于解密。一把钥匙是给消息作者的。写完消息后,他可以使用收件人的公钥对其进行加密。顾名思义,该密钥是公开的,并且可以在密钥数据库中进行查找。由于它仅用于加密,因此公开不会造成任何损害。另一方面,还有私钥。该密钥仅对一个人(即消息的接收者)可见。他可以用它来解密他收到的消息:

三、使用质数进行加密

        现在我们已经了解了两种不同的加密系统,让我们看看在非对称加密的情况下如何创建公钥和私钥。首先,应该知道,我们不能直接加密文本,而必须先将其转换为数字。这个过程称为填充,发生在一个为每个符号分配一个数字的列表中。然后我们将每个数字连接起来创建另一个数字,这里我们称之为m,然后对其进行加密。一个非常简单的填充列表只是将每个字母分配到其在字母表中的位置,例如,“A”分配给 1,“B”分配给 2 等。虽然此列表只允许非常简单的单词,但足以理解 RSA 背后的理论。 

1、创建密钥

        我们在以下过程中使用这种机制来创建两个密钥,一个私钥和一个公钥:

        1、选择两个随机的、随机独立的素数,p和q。

        2、计算两者的乘积N = pq。

        3、计算两者的 Phi 函数:\phi (N) = (p-1) (q-1)

        4、选择一个与N互质且小于N的自然数g

        5、计算g模\phi (N)的乘法逆k,即g \phi (N)g \cdot k + d \cdot \phi(N) = 1

        N和g现在构建我们的公钥,我们将使用它们来加密消息。k是我们的私钥,用来解密。为了更清楚地看到这一点,我们来看看加密和解密过程。

2、加密和解密

        现在,我们使用公钥对消息m进行加密:

s \cong m^{g} \textrm{ mod } N

        我们用以下方法解密它:

m \cong s^{k} \textrm{ mod } N

        正如我们所看到的,只有当我们有g \phi (N)的乘法逆k时,我们才能解密。

        由于在可预见的未来不可能计算出较大的素数(N),因此没有私钥就无法解密消息。这使得系统非常安全。

3、一个示例

(1)创建密钥

        我们要加密的字母是“O”,我们将其转换为数字m=15,因为它是字母表中的第十五个数字。现在我们选择随机素数。为了简单起见,我们选择素数p=13q=17

​        然后我们构建素数的 phi 函数\phi (N) = (p-1) (q-1) = 192

        选择一个与\phi (N)互质的自然数g,我们选择29。

        唯一需要计算的是g的逆k。29 \cdot k + 192 \cdot d = 1。在欧几里得算法的帮助下,我们将其计算为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

        这样我们就有了公钥N = p\cdot q = 221。还有我们的私钥k=53

(2)加密和解密

        接下来我们加密我们的数字:

15 \cong s^{29} \textrm{ mod } 221

s = 19

        我们现在就拥有了加密的消息,并且可以安全地将其传输给收件人,而任何人都无法知道它代表字母“O”。

        为了解密消息,我们需要逆数k=53

15 \cong 19^{53} \textrm{ mod }221

         现在我们再次查看字母表,看到第十五个字母是“O”,这意味着我们已经成功加密和解密了我们的消息。

四、小结

        正如上面所描述的,我们可以利用无法将大数分解为素数来生成安全的非对称密码系统。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

坐望云起

如果觉得有用,请不吝打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值