【愚公系列】2022年04月 现代密码学-RSA

举报
愚公搬代码 发表于 2022/04/30 23:31:11 2022/04/30
【摘要】 一、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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。