在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(即信息发送方)的公钥验证信息的签名。
然而,在本教程中,情况并非如此,因为我们没有信息的发送者或接收者,因此我们得到了关于使用签名、签署信息和验证签名的知识。