加密要用到Crypto安装包 pip install Crypto

新建两个模块rsautils.py, rsatest.py直接上代码,
rsautils.py
#!/usr/bin/env python3# coding=utf-8# Author: Luosu201803"""create_rsa_key() - 创建RSA密钥my_encrypt_and_decrypt() - 测试加密解密功能rsa_sign() & rsa_signverify() - 测试签名与验签功能"""

import base64import jsonfrom Crypto.Hash import SHA1from Crypto.PublicKey import RSAfrom Crypto.Signature import pkcs1_15from Crypto.Cipher import PKCS1_v1_5 as Cipher_pkcs1_v1_5# 需要安装pycrypto rsafrom rsa_test import to_para, to_decrypt

pubkey = '''-----BEGIN RSA PUBLIC KEY-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCCaqlxNJpDUjMLGlzLglAub6SLZDP8HxfpHzqgkecuVRpQ4OOlIOHSFGGHSRUyQ5F18vMzMcTWWzGaxV+bVHC8E0q9w1hUeUu954gn01wt6vK3N82oD/N0R9ZbireOGZB/weaW8cw8jUHjc/j9N4o1pV+vcOYUsU2xt5vXRwFEGQIDAQAB-----END RSA PUBLIC KEY-----'''

privatekey = '''-----BEGIN RSA PRIVATE KEY-----MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAIJqqXE0mkNSMwsaXMuCUC5vpItkM/wfF+kfOqCR5y5VGlDg46Ug4dIUYYdJFTJDkXXy8zMxxNZbMZrFX5tUcLwTSr3DWFR5S73niCfTXC3q8rc3zagP83RH1luKt44ZkH/B5pbxzDyNQeNz+P03ijWlX69w5hSxTbG3m9dHAUQZAgMBAAECgYBFUhKcpLw2enO9PBcE6VBbTmZk3S8wnQpllH7iKIt8OioRwWffNtoxgznP4g3NONMRocCZfqPE2JZGUREfjEObP/jnPQFRd7r/XOwsWT80pbpBdo4csGnenbq5FVR1Ren0i1lyHeIdm+mZR3BuPoMNQbAha+3ggYBaSvEgfLGRrQJBANWrKQ7YHQRTf1JKDEeIQYT6Xuc1WVPZ9oNQg+G1yYK3vSxHAqEj7pj7OYXETb7fPBsOYb3Z3OyRAJBnQhwbV+sCQQCcQSGBALdwLL6aGKfMJiEc2VTCY4//K04L8dB1NSlzWYZSLMkfP7X+KKgdcmWQRx6Dwm6hKIIOWjQBi+CikzcLAkEAtszhqp6AbMQWyMsrKEPNcjxV109QJiny+jN3MTK6vQf/Y5M5D63TIrTEaMoijaslHCy4uJlcplQD/IcrCyrlkwJABXA640uMFupnw+NBy9gz5NYnnhBrDZ2LPN0wvTOZertN8oQ+h8jm4660kznNESV4iWt2AEPxquA22SruKZpoGwJBALrT5IiJs5RJs3/uxjlDyg1A9NABkU9EM4xzvSxWHVSS0orF/sH/218OphjH/D8GTFMfmySqpJVsZHd+IzzVa54=-----END RSA PRIVATE KEY-----'''

def create_rsa_key(password="123456"):    """    创建RSA密钥,步骤说明:    1、从 Crypto.PublicKey 包中导入 RSA,创建一个密码(此密码不是RSA秘钥对)    2、生成 1024/2048 位的 RSA 密钥对(存储在私钥文件和公钥文件)    3、调用 RSA 密钥实例的 exportKey 方法(传入"密码"、"使用的 PKCS 标准"、"加密方案"这三个参数)得到私钥。    4、将私钥写入磁盘的文件。    5、使用方法链调用 publickey 和 exportKey 方法生成公钥,写入磁盘上的文件。    """    key = RSA.generate(1024)    encrypted_key = key.exportKey(passphrase=password, pkcs=8, protection="scryptAndAES128-CBC")    # encrypted_key = key.exportKey(pkcs=1)    # print('encrypted_key:', encrypted_key)    with open("my_private_rsa_key.pem", "wb") as f:        f.write(encrypted_key)    with open("my_rsa_public.pem", "wb") as f:        f.write(key.publickey().exportKey())

def encrypt_and_decrypt_test(message, password="123456"):    # 加载公钥用于加密    key = pubkey    rsakey = RSA.importKey(key)    cipher = Cipher_pkcs1_v1_5.new(rsakey)    cipher_text = base64.b64encode(cipher.encrypt(message))    print('%s 对应的密文是:' % message.decode("utf8"), cipher_text)    # 加载私钥用于解密    key = privatekey    rsakey = RSA.importKey(key)    cipher = Cipher_pkcs1_v1_5.new(rsakey)    text = cipher.decrypt((base64.b64decode(cipher_text)), password)    print('解密后原文是:', text.decode("utf8"))

def rsa_sign(message, password="123456"):    # 读取私钥信息用于加签    private_key = RSA.importKey(open("my_private_rsa_key.pem").read(), passphrase=password)    hash_obj = SHA1.new(message)    # print(pkcs1_15.new(private_key).can_sign())  #check wheather object of pkcs1_15 can be signed    # base64编码打印可视化    signature = base64.b64encode(pkcs1_15.new(private_key).sign(hash_obj))    return signature

def rsa_signverify(message, signature):    # 读取公钥信息用于验签    public_key = RSA.importKey(open("my_rsa_public.pem").read())    # message做“哈希”处理,RSA签名这么要求的    hash_obj = SHA1.new(message)    try:        # 因为签名被base64编码,所以这里先解码,再验签        pkcs1_15.new(public_key).verify(hash_obj, base64.b64decode(signature))        print('The signature is valid.')        return True    except (ValueError, TypeError):        print('The signature is invalid.')

if __name__ == '__main__':    message = "英文".encode("utf8")    create_rsa_key()    encrypt_and_decrypt_test(message)    dict_body = {'certificate_no': '2019042955452554', 'auth_code': '456789'}    encrypt_message = to_para(str(dict_body))    print("dict_body字典进行解密:%s" % to_decrypt(to_para(str(dict_body))))    biz_content = {'partner': 'diannei', 'request_id': '201904232025123456', '': '', 'request_type': 'Q01'}    signature = rsa_sign(message)    biz_content['sign'] = str(signature)    print('signature:', signature)    body_map = {'encrypt_message': encrypt_message}    dict_map = {'head': json.dumps(biz_content), 'body': json.dumps(body_map)}    print(dict_map)    print(rsa_signverify(message, signature))


rsatest.py
import rsaimport base64from Crypto.PublicKey import RSAfrom Crypto.Cipher import PKCS1_v1_5  as Cipher_pkcs1_v1_5

# 需要安装pycrypto rsapubkey = '''-----BEGIN RSA PUBLIC KEY-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCCaqlxNJpDUjMLGlzLglAub6SLZDP8HxfpHzqgkecuVRpQ4OOlIOHSFGGHSRUyQ5F18vMzMcTWWzGaxV+bVHC8E0q9w1hUeUu954gn01wt6vK3N82oD/N0R9ZbireOGZB/weaW8cw8jUHjc/j9N4o1pV+vcOYUsU2xt5vXRwFEGQIDAQAB-----END RSA PUBLIC KEY-----'''

privatekey = '''-----BEGIN RSA PRIVATE KEY-----MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAIJqqXE0mkNSMwsaXMuCUC5vpItkM/wfF+kfOqCR5y5VGlDg46Ug4dIUYYdJFTJDkXXy8zMxxNZbMZrFX5tUcLwTSr3DWFR5S73niCfTXC3q8rc3zagP83RH1luKt44ZkH/B5pbxzDyNQeNz+P03ijWlX69w5hSxTbG3m9dHAUQZAgMBAAECgYBFUhKcpLw2enO9PBcE6VBbTmZk3S8wnQpllH7iKIt8OioRwWffNtoxgznP4g3NONMRocCZfqPE2JZGUREfjEObP/jnPQFRd7r/XOwsWT80pbpBdo4csGnenbq5FVR1Ren0i1lyHeIdm+mZR3BuPoMNQbAha+3ggYBaSvEgfLGRrQJBANWrKQ7YHQRTf1JKDEeIQYT6Xuc1WVPZ9oNQg+G1yYK3vSxHAqEj7pj7OYXETb7fPBsOYb3Z3OyRAJBnQhwbV+sCQQCcQSGBALdwLL6aGKfMJiEc2VTCY4//K04L8dB1NSlzWYZSLMkfP7X+KKgdcmWQRx6Dwm6hKIIOWjQBi+CikzcLAkEAtszhqp6AbMQWyMsrKEPNcjxV109QJiny+jN3MTK6vQf/Y5M5D63TIrTEaMoijaslHCy4uJlcplQD/IcrCyrlkwJABXA640uMFupnw+NBy9gz5NYnnhBrDZ2LPN0wvTOZertN8oQ+h8jm4660kznNESV4iWt2AEPxquA22SruKZpoGwJBALrT5IiJs5RJs3/uxjlDyg1A9NABkU9EM4xzvSxWHVSS0orF/sH/218OphjH/D8GTFMfmySqpJVsZHd+IzzVa54=-----END RSA PRIVATE KEY-----'''

# 加密def to_para(plain):    rsa_key = RSA.importKey(pubkey)    x = rsa.encrypt(plain.encode(), rsa_key)    cipher_text = base64.b64encode(x).decode()    return cipher_text

# 解密def to_decrypt(plain):    rsa_privkey = RSA.importKey(privatekey)    cipher = Cipher_pkcs1_v1_5.new(rsa_privkey)    x = cipher.decrypt(base64.b64decode(plain), "ERROR")    print(x.decode())    return x.decode()

def ByteToHex(bins):    """    Convert a byte string to it's hex string representation e.g. for output.    """    return ''.join(["%02X" % x for x in bins]).strip()

def HexToByte(hexStr):    """    Convert a string hex byte values into a byte string. The Hex Byte values may    or may not be space separated.    """    return bytes.fromhex(hexStr)

def hex_to_str(s):    return ''.join([chr(int(b, 16)) for b in [s[i:i + 2] for i in range(0, len(s), 2)]])

if __name__ == '__main__':    v = '182895d57f87530e854d9842ff02edaefc66fa1cca66c8f352111b6c5fbf22a9f057e5b74523cdd03f76424064df2c38ce45a68dd5492246e6b832c1b4edaacd8fb4e6050bed5a1a27ae7894d38b62e8453cd77fdbce3529d831e0278ac9e8ad3b8d6002ca82380b5ac61e7a19f773003136d64902c58f2ad563d04ce701c565'    b = bytes.fromhex(v)    k = base64.b64encode(b)    print(to_decrypt(k))
 

转载于:https://www.cnblogs.com/yichuncom/p/10973036.html

rsa加解密及加签验签相关推荐

  1. iOS 使用 SM2 SM4 加解密,SM2 签名验签及 SM3 签名

    前言 对于开发人员,开发中加解密是经常用到的,常见的密码算法 MD5.SHA.AES.DES,RSA 等等,这些无一例外都是国外的加密算法.基于安全和宏观战略考虑,我国从 2010 年先后推出了 SM ...

  2. RSA公私钥生成、加解密、签名及验签的原理及工具类

    目录 一.RSA简介 二.加密.签名区别 三.公私钥生成 四.RSA工具类 一.RSA简介 非对称加密算法,由一对密钥(公钥-私钥)来进行加密-解密.签名-验签的过程.公钥-私钥的生成与数学相关,算法 ...

  3. 国密算法SM2加解密,签名和验签java语言

    SM2加解密java语言 maven项目 引入bcprov-jdk15on <dependency><groupId>org.bouncycastle</groupId& ...

  4. STM32F103驱动RJMU401实现SM2加解密、签名与验签

    目录 前言 一.什么是加密.硬件加密以及加密芯片品牌? 二.开发记录 1.开发环境 2.开发流程 3.常见问题汇总 总结 前言 项目需要加密并且需要采用硬件加密,加密方式为非对称–SM2,之前只接触过 ...

  5. Java实现RSA加密解密、数字签名及验签

    RSA公钥加密算法是1977年由罗纳德-李维斯特(Ron Rivest).阿迪-萨莫尔(Adi Shamir)和伦纳德-阿德曼(Leonard Adleman)一起提出的.当时他们三人都在麻省理工学院 ...

  6. 数据加解密和数据签名验签

    一.公钥加密  假设两个数字1和2.数字2作为私钥,同时公布1是公钥. 我有一个文件,不能让别人看,我用1加密.即使别人找到了这个文件,但是他不知道解密的私钥2 ,所以他解不开,只有我可以用 数字2, ...

  7. RSA密钥生成、加密解密、数据签名验签

    公钥.私钥生成 准备工作,基础的帮助类 使用java代码生成公钥私钥 使用openssl生成公钥私钥 加解密 数据签名及验签 数据加解密及签名验签测试 注意项 公钥.私钥生成 准备工作,基础的帮助类 ...

  8. java rsa加密 加签_RSA加密解密与加签验签

    RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的.1987年7月首次在美国公布 ...

  9. 前后端RSA互相加解密、加签验签、密钥对生成(Java)

    目录 一.序言 二.关于PKCS#1和PKCS#8格式密钥 1.简介 2.区别 二.关于JSEncrypt 三.关于jsrsasign 四.前端RSA加解密.加验签示例 1.相关依赖 2.crypto ...

  10. RSA体系 c++/java相互进行加签验签--转

    在web开发中,采用RSA公钥密钥体系自制ukey,文件证书登陆时,普遍的做法为:在浏览器端采用c++ activex控件,使用 c++的第三库openssl进行RAS加签操作,在服务器端采用java ...

最新文章

  1. vba 窗体单选框怎么传回sub_VBA之EXCEL应用
  2. 成就你一生的100个哲理——修身养性篇
  3. keras保存模型_onnx+tensorrt部署keras模型
  4. flask使用tablib导出excel数据表
  5. mac php5.6.30与php7共存,认识Homebrew以及在Mac上同时安装PHP5及PHP7
  6. Xor Sum(AtCoder-2272)
  7. 彻底凉凉!两头部网红女主播账号被封,逃税被罚近亿元 还被曝不给员工交社保...
  8. 逻辑盘下的所有目录完全共享_Python File I/O之读取路径下所有目录和文件
  9. poj 1164城堡问题(DFS)
  10. Centos6.5安装FastDFS
  11. Conditional Generative Adversarial Nets论文翻译
  12. 基于javaweb+SpringBoot+MyBatis网上书店管理系统在线购书系统(前台、后台)
  13. 第一章 Crystal Reports简介
  14. VS技巧 使用Visual Studio Icon Patcher将2010的图片注入到2012中
  15. 接口做的好怎么形容_游戏耳机怎么选?入耳式游戏耳机测评+游戏音频指南
  16. 计算机组成原理 — PCI-E 外设接口标准
  17. 特征频率、最y大振荡频率、截止频率有什么关系和异同
  18. SpringBoot无法引入@RunWith注解解决方法
  19. Spark的宽窄依赖
  20. 权限管理系统设计——入门(一)

热门文章

  1. 802.1D生成树STP协议
  2. HCIE-Security Day39:理论学习:隐私保护
  3. 网络工程师HCIE-RS-qos(原理+实验)
  4. datatable 操作列根据权限动态展现_不会Excel透视表?教你一招轻松做出动态报表...
  5. ELK详解(十)——Logstash收集Tomcat日志实战
  6. Linux之重置密码的两种方法
  7. 凑算式——第七届蓝桥杯C语言B组(省赛)第三题
  8. openstack 之 kolla安装镜像
  9. Windows azure中公用云服务的两个虚机FTP的设置
  10. MapXtreme 2005 学习心得 关于地图投影坐标问题的解决方式(十四)