【愚公系列】2022年04月 现代密码学-RSA
【摘要】 一、RSA概念RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。RSA加密是一种非对称加密。可以在不直接传递密钥的情况下,完成解密。这能够确保信息的安全性,避免了直接传递密钥所造成的被破解的风险。是由一...
一、RSA概念
RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。
RSA加密是一种非对称加密。可以在不直接传递密钥的情况下,完成解密。这能够确保信息的安全性,避免了直接传递密钥所造成的被破解的风险。是由一对密钥来进行加解密的过程,分别称为公钥和私钥。公钥加密–私钥解密,私钥加密–公钥解密
RSA算法是最著名和可靠的非对称密钥加密算法。介绍RSA算法之前,先要简单介绍素数的概念,这是RSA算法的基础。
素数就是只能被1和本身整除的数。RSA算法基于这样的数学事实:两个大素数相乘很容易,而对得到的积求因子则很难。RSA中的私钥和公钥基于大素数(100位以上),算法本身很简单,但实际难度在于RSA选择和生成的私钥与公钥。生成私钥和公钥以及使用私钥和公钥进行加解密的方法如下:
(1)选择两个大素数P、Q。
(2)计算N = P × Q N=P\times QN=P×Q。
(3)选择一个公钥(即加密密钥)E,使其不是(P-1)(Q-1)的因子。
(4)选择私钥(即解密密钥)D,满足下列条件:
(5)加密时,从明文PT计算密文CT如下:
(6)将密文CT发送给接收方。
(7)解密时,从密文CT计算明文PT如下:
二、python脚本
# coding=utf-8
import binascii
from Cryptodome.PublicKey import RSA
from Cryptodome.Cipher import PKCS1_v1_5
# 定义全局变量以便在函数中引用
public_key=''
private_key=''
hex_data=''
plaintext = input('输入要加密的文本:')
'''RSA 加解密'''
class RsaCrypto():
'''生成RSA秘钥对'''
def create_rsa_key(self):
global public_key,private_key
try:
key = RSA.generate(2048)
encrypted_key = key.exportKey(pkcs=8)
public_key = key.publickey().exportKey().decode('utf-8')
private_key = encrypted_key.decode('utf-8')
return {'state': 1, 'message': {'public_key': public_key, 'private_key': private_key}}
except Exception as err:
return {'state': 0, 'message': str(err)}
'''加密方法'''
def encrypt(self, public_key, plaintext):
global hex_data
try:
recipient_key = RSA.import_key(public_key)
cipher_rsa = PKCS1_v1_5.new(recipient_key)
en_data = cipher_rsa.encrypt(plaintext.encode('utf-8'))
hex_data = binascii.hexlify(en_data).decode('utf-8')
return {'state': 1, '加密后的密文是:': hex_data}
except Exception as err:
return {'state': 0, '加密报错': str(err)}
'''解密方法'''
def decrypt(self, private_key, hex_data):
try:
private_key = RSA.import_key(private_key)
cipher_rsa = PKCS1_v1_5.new(private_key)
en_data = binascii.unhexlify(hex_data.encode('utf-8'))
data = cipher_rsa.decrypt(en_data, None).decode('utf-8')
return {'state': 1, '解密后的明文是': data}
except Exception as err:
return {'state': 0, '解密出错': str(err)}
if __name__ == '__main__':
RsaCrypto().create_rsa_key()
print(RsaCrypto().encrypt(public_key,plaintext))
print(hex_data)
print(RsaCrypto().decrypt(private_key,hex_data))
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)