如何在Python中实现RSA加密和解密

560 阅读6分钟

在Python中实现RSA加密和解密

数据加密是一种用于保护互联网上数据传输的重要做法。这有助于防止在互联网上发送的数据被非法访问。

用于互联网上数据保护的主要算法之一是Rivest、Shamir和Adleman(RSA算法),以这种加密和解密算法的发明者命名。

RSA是一种广泛用于安全数据传输的公钥算法。这是数据保护的主要网络安全方法之一。

在本教程中,我们将讨论RSA算法的工作以及如何在Python中实现这种算法。

前提条件

要继续学习本教程,你需要具备以下条件。

  • 有关[RSA 算法]的基本知识
  • [Python]编程语言的基本知识。
  • 安装了一个代码编辑器,并且设置好了。你可以下载[Pycharm]或[Visual Studio Code]。

我将在本教程中使用Visual Studio Code。

RSA加密和解密的工作原理

每对RSA算法都有两个密钥,即一个公钥和一个私钥。一把钥匙用于加密信息,只能由另一把钥匙解密。

例如,假设我们有两个对等人在一个由RSA算法保障的信道中相互通信。发送方将用接收方的公钥对纯文本进行加密。这是为了使接收者是唯一能用他们的私钥解密信息的人。

公钥将在一个公钥库中提供。然而,对于私钥,顾名思义,它在收件人那边是保密的。

在 Python 中实现 RSA 算法

在本教程中,我们将使用rsa python package 。打开你的终端,使用下面的命令来安装它。

pip install rsa

一旦下载了该软件包,我们需要做的第一件事就是将rsa 导入我们的程序中。

import rsa

我们将首先实现两个辅助方法来生成私钥和公钥。钥匙将是一个公钥和私钥的元组,然后将钥匙写进文件。

为了把钥匙写入文件,我们将在我们的项目文件夹中创建一个名为Keys 的文件夹。Keys 文件夹将有两个文件用于存放私人和公共密钥;每个文件中都有一个密钥。

我们将使用下面的代码来实现这一点。

def generateKeys():
    (publicKey, privateKey) = rsa.newkeys(1024)
    with open('keys/publcKey.pem', 'wb') as p:
        p.write(publicKey.save_pkcs1('PEM'))
     with open('keys/privateKey.pem', 'wb') as p:
        p.write(privateKey.save_pkcs1('PEM'))

现在我们已经将钥匙保存在我们的文件中,接下来我们需要做的是加载这些钥匙。

为了加载钥匙,我们将使用下面的代码片段,打开我们上面创建的文件,并返回私人和公共钥匙。

def loadKeys():
    with open('keys/publicKey.pem', 'rb') as p:
        publicKey = rsa.PublicKey.load_pkcs1(p.read())
    with open('keys/privateKey.pem', 'rb') as p:
        privateKey = rsa.PrivateKey.load_pkcs1(p.read())
    return privateKey, publicKey

接下来,创建另外两个方法来加密和解密我们的信息。

首先使用下面的代码创建加密方法。加密方法将接受消息和加密密钥。

在定义了加密方法后,我们需要返回加密后的消息。我们将在ASCII 中对消息进行编码,并给它密钥。

def encrypt(message, key):
    return rsa.encrypt(message.encode('ascii'), key)

现在让我们创建解密方法。这个方法将接受密码文本和密钥来解密。我们要做的是尝试解密信息,并返回解密的信息。

由于我们使用了ASCII 编码,我们也将使用ASCII 解码。

如果失败了,这意味着密钥无法解密信息,所以我们要做的是返回false。我们将使用下面的代码来实现解密方法。

def decrypt(ciphertext, key):
    try:
        return rsa.decrypt(ciphertext, key).decode('ascii')
    except:
        return False

最后,我们将创建两个方法来签署和验证我们的消息,并使用sha1 hash function 。这个方法将接受消息和钥匙,这样我们就可以用钥匙签署我们的消息。

我们要编码的消息将被赋予密钥和我们的散列算法。在这种情况下,SHA-1

签名方法是用下面的代码实现的。

def sign(message, key):
    return rsa.sign(message.encode('ascii'), key, 'SHA-1')

对于消息的验证,我们将创建验证方法并传入消息、要验证的签名和密钥。所以,我们需要做的是尝试验证我们的消息。

这个验证方法返回签名中使用的哈希算法。因此,我们要做的是检查这个方法是否等于哈希算法,即;SHA-1

如果签名是真实的,那么它就返回true。如果有异常,它将返回false,这意味着验证失败了。这意味着信息或签名被篡改,不是真实的。

def verify(message, signature, key):
    try:
        return rsa.verify(message.encode('ascii'), signature, key,) == 'SHA-1'
    except:
        return False

现在我们有了RSA算法,我们将创建我们的程序。我们将从生成我们的密钥开始。

我们将调用生成密钥的方法,加载公钥和私钥,如下面的代码所实现。

generateKeys()
publicKey, privateKey =load_keys()

然后,我们将从用户那里获得信息输入,并使用公钥对信息进行加密。这代表消息的发送者。

message = input('Write your message here:')
ciphertext = encrypt(message, publicKey)

现在我们有了密码文本,我们将使用下面的代码生成签名,用我们的私钥签署信息。这使得发送者能够用公钥验证信息,并确定信息是否真实。

signature = sign(message, privateKey)

接下来,我们将解密我们的加密信息,以获得纯文本。为了实现这一点,我们将创建一个解密方法,并将密码文本和私钥传给它,如下所示。

text = decrypt(ciphertext, privateKey)

在得到我们的明文后,接下来要做的事情是打印出密码文本和签名。

print(f'Cipher text: {ciphertext}')
print(f'Signature: {signature}')

我们将在下一个步骤中检查明文。如果是纯文本,那么我们就表示message was successfully decrypted ,否则,unable to decrypt the message

if text:
    print(f'Message text: {text}')
else:
    print(f'Unable to decrypt the message.')

我们使用下面的代码验证我们的签名。

if verify(text, signature, publicKey):
    print(Successfully verified signature)
else:
    print('The message signature could not be verified')

有了这些,你就可以输入你的信息,进行加密,然后解密。

总结

在本教程中,我们使用公钥对信息进行了加密,并使用我们的私钥对其进行了签名。

如果你有两个对等体;即对等体A与对等体B交谈。当对等体A向对等体B发送消息时,应该使用对等体B的公钥对消息进行加密。然而,这种方法是使用对等体A的私钥签署的,对等体A是发送消息的对等体。

在接收方,也就是对等体B,它将使用私钥对信息进行解密,然后使用对等体A(即信息发送方)的公钥验证信息的签名。

然而,在本教程中,情况并非如此,因为我们没有信息的发送者或接收者,因此我们得到了关于使用签名、签署信息和验证签名的知识。