rsa加解密及加签验签
加密要用到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加解密及加签验签相关推荐
- iOS 使用 SM2 SM4 加解密,SM2 签名验签及 SM3 签名
前言 对于开发人员,开发中加解密是经常用到的,常见的密码算法 MD5.SHA.AES.DES,RSA 等等,这些无一例外都是国外的加密算法.基于安全和宏观战略考虑,我国从 2010 年先后推出了 SM ...
- RSA公私钥生成、加解密、签名及验签的原理及工具类
目录 一.RSA简介 二.加密.签名区别 三.公私钥生成 四.RSA工具类 一.RSA简介 非对称加密算法,由一对密钥(公钥-私钥)来进行加密-解密.签名-验签的过程.公钥-私钥的生成与数学相关,算法 ...
- 国密算法SM2加解密,签名和验签java语言
SM2加解密java语言 maven项目 引入bcprov-jdk15on <dependency><groupId>org.bouncycastle</groupId& ...
- STM32F103驱动RJMU401实现SM2加解密、签名与验签
目录 前言 一.什么是加密.硬件加密以及加密芯片品牌? 二.开发记录 1.开发环境 2.开发流程 3.常见问题汇总 总结 前言 项目需要加密并且需要采用硬件加密,加密方式为非对称–SM2,之前只接触过 ...
- Java实现RSA加密解密、数字签名及验签
RSA公钥加密算法是1977年由罗纳德-李维斯特(Ron Rivest).阿迪-萨莫尔(Adi Shamir)和伦纳德-阿德曼(Leonard Adleman)一起提出的.当时他们三人都在麻省理工学院 ...
- 数据加解密和数据签名验签
一.公钥加密 假设两个数字1和2.数字2作为私钥,同时公布1是公钥. 我有一个文件,不能让别人看,我用1加密.即使别人找到了这个文件,但是他不知道解密的私钥2 ,所以他解不开,只有我可以用 数字2, ...
- RSA密钥生成、加密解密、数据签名验签
公钥.私钥生成 准备工作,基础的帮助类 使用java代码生成公钥私钥 使用openssl生成公钥私钥 加解密 数据签名及验签 数据加解密及签名验签测试 注意项 公钥.私钥生成 准备工作,基础的帮助类 ...
- java rsa加密 加签_RSA加密解密与加签验签
RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的.1987年7月首次在美国公布 ...
- 前后端RSA互相加解密、加签验签、密钥对生成(Java)
目录 一.序言 二.关于PKCS#1和PKCS#8格式密钥 1.简介 2.区别 二.关于JSEncrypt 三.关于jsrsasign 四.前端RSA加解密.加验签示例 1.相关依赖 2.crypto ...
- RSA体系 c++/java相互进行加签验签--转
在web开发中,采用RSA公钥密钥体系自制ukey,文件证书登陆时,普遍的做法为:在浏览器端采用c++ activex控件,使用 c++的第三库openssl进行RAS加签操作,在服务器端采用java ...
最新文章
- vba 窗体单选框怎么传回sub_VBA之EXCEL应用
- 成就你一生的100个哲理——修身养性篇
- keras保存模型_onnx+tensorrt部署keras模型
- flask使用tablib导出excel数据表
- mac php5.6.30与php7共存,认识Homebrew以及在Mac上同时安装PHP5及PHP7
- Xor Sum(AtCoder-2272)
- 彻底凉凉!两头部网红女主播账号被封,逃税被罚近亿元 还被曝不给员工交社保...
- 逻辑盘下的所有目录完全共享_Python File I/O之读取路径下所有目录和文件
- poj 1164城堡问题(DFS)
- Centos6.5安装FastDFS
- Conditional Generative Adversarial Nets论文翻译
- 基于javaweb+SpringBoot+MyBatis网上书店管理系统在线购书系统(前台、后台)
- 第一章 Crystal Reports简介
- VS技巧 使用Visual Studio Icon Patcher将2010的图片注入到2012中
- 接口做的好怎么形容_游戏耳机怎么选?入耳式游戏耳机测评+游戏音频指南
- 计算机组成原理 — PCI-E 外设接口标准
- 特征频率、最y大振荡频率、截止频率有什么关系和异同
- SpringBoot无法引入@RunWith注解解决方法
- Spark的宽窄依赖
- 权限管理系统设计——入门(一)
热门文章
- 802.1D生成树STP协议
- HCIE-Security Day39:理论学习:隐私保护
- 网络工程师HCIE-RS-qos(原理+实验)
- datatable 操作列根据权限动态展现_不会Excel透视表?教你一招轻松做出动态报表...
- ELK详解(十)——Logstash收集Tomcat日志实战
- Linux之重置密码的两种方法
- 凑算式——第七届蓝桥杯C语言B组(省赛)第三题
- openstack 之 kolla安装镜像
- Windows azure中公用云服务的两个虚机FTP的设置
- MapXtreme 2005 学习心得 关于地图投影坐标问题的解决方式(十四)