本篇写一下python实现RSA的加密解密功能、私钥签名 公钥验签功能。

主要分三部分来介绍

  1. 生成私钥和公钥
    脚本如下,运行后会生成public.pem(公钥) 和 private.pem(私钥)
def generateKeys():print("generate priv key start.")random_generator = Random.new().readrsa = RSA.generate(2048, random_generator)private_pem = rsa.exportKey()with open('private.pem', 'w') as f:f.write(private_pem)public_pem = rsa.publickey().exportKey()with open('public.pem', 'w') as f:f.write(public_pem)print("generate priv key done.")

生成的私钥内容如下:

$ cat private.pem
-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEAm1dN6Ue55QXl+SaBZTDPN3CkQMx+tWMyWP41sk+5jHqSTZrb
4zLH7Tvw2YLlMVGJM83jWtpEl1VJTGuHl3J0N7ts3bg7rq3ffU9my7rIC2Lz812A
B1n39hp7FcDb/oEGbZnhQJasRVuJwglDrdgePY5hI/PI/mpBj3+tKpmRTU7wl5W5
8si9xzJnx4aCHgu8jKEQzF9J4wAeSsPHc7ajjDD0c7me1tqFXSXzRlUVUw0i2fT6
JmGyw9iNTeyRZ/xQIXq6OOyf+dxsETr1Lwe6ozsdmLU+2bx6ku2BzPc5jpxmTP2j
e+y1zb+NsEPQUfbeHRH6bFKKi8OwP61J4qMTtwIDAQABAoIBAA1h8hZc1YkDfxJ9
3Lvo/pEaJSxn8aqSxy2fiOS5tZSCosQIyVTDdTHc7hzvB+u9yIIsBKA5GZun/06U
HPRRKe37OZ/IVWvxEsXq50I57y378mRO886uU4xiL6RqHwnH99PNY/h6gpDfF/kd
bzU03zYSZBAC2pgAc3F3YGXBISF1vyBTqQTAhohhbVayYBdmOI5xdoRnLCeKsc86
mpzL4RIcWTlWTc/ehX7dTL17thozOMRwHgOUaT+bqtPXa4U1VtbInBoi/UdfZqPy
8fMUP8C9JobAbM/5fZ0/+uODh6xkwJuPzakKawMBYS/1PL4wOmTyNdXb/mjMFnIN
8KXqvBECgYEAvUwATtYDqrONbhXq0gCcNNCDQvmt2ENIbpztB4LM1QTEWcfnmBym
hpfOqAQXHzFLaa7sGDc1t7VSrH82tBoORcKI9ccx+0o2vUb16wQ9KLiE8Q6EVDpe
6QP7m+zSblx20YYWz29+fO2bIMvFnH1QIagLQ2ItoUuZZAvViGxmZJ0CgYEA0hQ7
II08/aJh4daevEbdKzUWakIoTgsjoRUb26B0YJ7wCPTuz8PkIbZAXnK8wYoS12GW
DnlDhVk0bKn46JyDfCxeL1OSlm6v1rhsfeDgBjgdUIuwhzcQxzWj0CJqHOfEUqeB
qR3tz8ygpztwejosSWrAZlP363tb75uoekgbZ2MCgYEAlVVApPDWwbKWLzNhJTxP
/qZD9vErgQFLQd/Qae15E8+H6t/2RxzLDkDySb+4UeY8fOn+3PepC/0idGyDRj+L
5OKb03DKcFhSqK0zUaztZpNyZQyzvhKyTxbSRmbkdyXAongqxIhLe9iiWZQHl/WP
4o1EHWt1Xdpa7v8a/F2vxU0CgYEAtEpQhBsyYKnfPyYljId0gARLfF3SoUfGCBRJ
mC8YMWO1tLofyYbgXl4+18+4VpDcoqNJWJqRa/umlis5Rsgrv4GEQzGB+EB9/9S+
pzk6iZvW7K01jpWffJd4QsOGNdBiGF1RVYYt9cwzg9HrMbqDD27iN++QMTPpLrVz
3Z3MhukCgYEAi6QSysyuCsC/3P5+xHDyWw1Z9A1rdz41GFNZslculiXBYCv7z7bk
obQ8CdaxB1CzPSZR00970ZvNByeKBPjFv2o432wW15SGyI61z0FLglZ6SDC9ytWA
4fzF8xbY2ZT9JSm+QaI652wdx4lDXAxvn01ztm56J7TTfS7qTdqBbig=
-----END RSA PRIVATE KEY-----

生成的公钥内容如下:

$ cat public.pem
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm1dN6Ue55QXl+SaBZTDP
N3CkQMx+tWMyWP41sk+5jHqSTZrb4zLH7Tvw2YLlMVGJM83jWtpEl1VJTGuHl3J0
N7ts3bg7rq3ffU9my7rIC2Lz812AB1n39hp7FcDb/oEGbZnhQJasRVuJwglDrdge
PY5hI/PI/mpBj3+tKpmRTU7wl5W58si9xzJnx4aCHgu8jKEQzF9J4wAeSsPHc7aj
jDD0c7me1tqFXSXzRlUVUw0i2fT6JmGyw9iNTeyRZ/xQIXq6OOyf+dxsETr1Lwe6
ozsdmLU+2bx6ku2BzPc5jpxmTP2je+y1zb+NsEPQUfbeHRH6bFKKi8OwP61J4qMT
twIDAQAB
-----END PUBLIC KEY-----
  1. 公钥加密 私钥解密
    下面是通过公钥加密,然后用公钥解密的实现:
def pubEncryAndprivDecry():content_size = '10000'#encryptwith open("public.pem") as f:key = f.read()rsakey = RSA.importKey(key)cipher = Cipher_pkcs1_v1_5.new(rsakey)cipher_text = base64.b64encode(cipher.encrypt(content_size))print(cipher_text)with open("encrypted_data", "wb") as f:  ##save encrypted data to filef.write(cipher_text)#decryptwith open("private.pem") as f:key = f.read()prikey = RSA.importKey(key)cipher2 = Cipher_pkcs1_v1_5.new(prikey)with open("encrypted_data") as f: ### read data from encrypted filedata = f.read()text = cipher2.decrypt(base64.b64decode(data), random_generator)print(text)

运行效果如下,解密后的text为1000,符合预期。

$ ./test.py
generate priv key start.
generate priv key done.
E25FkcAYB7XFil2sI3OvA4S6KnQppTPh7zIO3LgQKnBmLpQaQfdICwEuUEae1nNFntGdn5ahLou5VvyN/2s9TZgvkj5DcJzAlDRX2OZrllM4mbCeTLyWYVyGqTVZx0SIFtQG/F1053j5OTtv2xnlBaveiZasqFzrFtSuDwzgZxL0xKtBbI8GPUKAp/lq9UIHAqL0uewfdsOG6axus3zEnkfHJwIndBQ4Wu8ewDFXmGsD+XDUT/CgIBTMQILE9dxJG/CeoWWUBxJwepZ855zmvEkNSUDFhTEypatkW3DlKOfFEVERWztH0t/J7aRUVv2AaiE5t0iI3Y671MQPz7ytSg==
10000
  1. 私钥签名 公钥验签
    下面是利用私钥进行签名,然后用公钥去验证签名的实现
def privSignAndPubAttesation():print("privSignAndPubAttesation entry.")#private key signwith open("private.pem") as f:key = f.read()rsakey = RSA.importKey(key)signer = Signature_pkcs1_v1_5.new(rsakey)content_size = '3000'digest = SHA.new()digest.update(content_size)sign_data = signer.sign(digest)signature = base64.b64encode(sign_data)print(signature)#public key attesationwith open("public.pem") as f:key = f.read()rsakey = RSA.importKey(key)verifier = Signature_pkcs1_v1_5.new(rsakey)digest = SHA.new()digest.update('3000')is_matched = verifier.verify(digest, base64.b64decode(signature))print(is_matched)

运行效果如下,返回True,验签正常。

$ ./test.py
generate priv key start.
generate priv key done.
privSignAndPubAttesation entry.
FBx2QUCHYZy1UU+AB30A7d/kJ3mUeOSSUNDfDQ2ecGK/ATVh8EWW1rQ6gTAOKkuAAd2ejNizC6DR/GvCflh3PnfcH0kGAkWW5M7rZJ0/VMmlx45AHYvstWZmC5fSEfAHLHa0PcR3Y7C7+EH+Bv90YlShghD3ONLAFXo+5hOtANkgJndAsmfYLsIbB2Ap4ikGRPazBU8Xwz4iZN2duyVwjuS1PZ0uXCNenjm+zYn8/Ot0kEsVpXzO8aZ0GDtu2rJbyOZSGLU2YMZ2ynzOwGcIO9Ng+wm/2FMfsEvRiLIQOQhWMMEYem+68d7B3/o4A8Hj4n0T1KJzlzraY4qpbrjT2A==
True

完整的python脚本内容如下,供参考:

#!/usr/bin/env python
import argparse
import sys
import base64
import hashlib
from Crypto import Random
from Crypto.Hash import SHA
from Crypto.Cipher import PKCS1_v1_5 as Cipher_pkcs1_v1_5
from Crypto.Signature import PKCS1_v1_5 as Signature_pkcs1_v1_5
from Crypto.PublicKey import RSArandom_generator = ""
cipher_text = ""
content_size = ""
signature_data = ""def generateKeys():print("generate priv key start.")random_generator = Random.new().readrsa = RSA.generate(2048, random_generator)private_pem = rsa.exportKey()with open('private.pem', 'w') as f:f.write(private_pem)public_pem = rsa.publickey().exportKey()with open('public.pem', 'w') as f:f.write(public_pem)print("generate priv key done.")def pubEncryAndprivDecry():content_size = '10000'#encryptwith open("public.pem") as f:key = f.read()rsakey = RSA.importKey(key)cipher = Cipher_pkcs1_v1_5.new(rsakey)cipher_text = base64.b64encode(cipher.encrypt(content_size))print(cipher_text)with open("encrypted_data", "wb") as f:  ##save encrypted data to filef.write(cipher_text)#decryptwith open("private.pem") as f:key = f.read()prikey = RSA.importKey(key)cipher2 = Cipher_pkcs1_v1_5.new(prikey)with open("encrypted_data") as f: ### read data from encrypted filedata = f.read()text = cipher2.decrypt(base64.b64decode(data), random_generator)print(text)def privSignAndPubAttesation():print("privSignAndPubAttesation entry.")#private key signwith open("private.pem") as f:key = f.read()rsakey = RSA.importKey(key)signer = Signature_pkcs1_v1_5.new(rsakey)content_size = '3000'digest = SHA.new()digest.update(content_size)sign_data = signer.sign(digest)signature = base64.b64encode(sign_data)print(signature)#public key attesationwith open("public.pem") as f:key = f.read()rsakey = RSA.importKey(key)verifier = Signature_pkcs1_v1_5.new(rsakey)digest = SHA.new()digest.update('3000')is_matched = verifier.verify(digest, base64.b64decode(signature))print(is_matched)def main():#generate priv and public keygenerateKeys()#1. public key encrypt,then priv key decrypt#pubEncryAndprivDecry()#2. privkey sign and publickey attestationprivSignAndPubAttesation()return 0if __name__ == '__main__':sys.exit(main())

python实现RSA加密解密 及 签名验签功能相关推荐

  1. 如何使用RSA 对数据加解密和签名验签?一篇文章带你搞定

    点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 三分割据纡筹策,万古云霄一羽毛. ...

  2. python加密解密 sha256_Python下实现的RSA加密/解密及签名/验证功能示例

    本文实例讲述了Python下实现的RSA加密/解密及签名/验证功能.分享给大家供大家参考,具体如下: 原文是py2环境,而我的环境是py3,所以对原代码做了修改:decode(), encode() ...

  3. python下RSA加密解密以及跨平台问题

    项目合作需要,和其他网站通信,消息内容采用RSA加密方式传递.之前没有接触过RSA,于是两个问题出现了: 声明: 环境WIN 7 + python 2.6.6 RSA格式:PEM 一.Python下R ...

  4. 国密SM4加解密SM2签名验签COM组件DLL

    提供给第三方软件,调用COM组件DLL方式进行实现,如delphi.PB等. 基于C#编写的COM组件DLL,可实现SM2签名验签,SM4加解密,100%适用于黑龙江省国家医保接口中进行应用. 功能包 ...

  5. Python如何接入开放平台?签名验签、加密解密、授权认证测试!

    当前大型top企业都有非常成熟的开放平台业务,比如微信开放平台.新浪微博开放平台.支付宝开放平台等.开放平台的发展为第三方个人或企业提供了巨大的机遇.开发者想要接入各大开放平台,必须要遵从开放平台的安 ...

  6. Java 实现 RSA 非对称加密算法-加解密和签名验签

    1. 非对称加密算法简介 非对称加密算法又称现代加密算法,是计算机通信安全的基石,保证了加密数据不会被破解.与对称加密算法不同,非对称加密算法需要两个密钥:公开密钥(publickey)和私有密(pr ...

  7. RSA加密解密和签名的应用场景

    由 RSA 可以生成一对密钥(私钥和公钥) 明文消息用公钥进行加密后,可以得到密文消息. 密文消息必须用私钥进行解密后,才能得到明文消息. 公钥是公布出去的,任何人都可以知道. 密钥自己藏着,只有自己 ...

  8. SM2加解密、签名验签

    导论 SM2是国家密码管理局于2010年12月17日发布的椭圆曲线公钥密码算法,在我们国家商用密码体系中被用来替换RSA算法. 国产SM2算法,是基于ECC的,但二者在签名验签.加密解密过程中或许有些 ...

  9. C#实现RSA公钥加密私钥解密、私钥加密公钥解密以及Pcks12、X509证书加解密、签名验签

    RSA的私钥签名公钥验签可以见 http://blog.csdn.net/starfd/article/details/51917916,所以这里就没提供对应代码,具体代码如下: using Org. ...

最新文章

  1. 聊聊这道【快手】面试题
  2. mac mysql 可视化工具_推荐3款好用的Redis、MySQL和MongoDB可视化管理工具
  3. 26个LinkedList用法示例大全以及与ArrayList/数组的相互转换
  4. Linux基础学习七:mysql的安装和配置教程
  5. iOS核心动画Core Animation(一)
  6. 【JZOJ4790】【NOIP2016提高A组模拟9.21】选数问题
  7. Ubuntu18.04编译pulseaudio14.x(八)
  8. java 分组求和函数_java8 怎么精简分组求和
  9. python交通流预测算法_使用KNN方法进行的短时交通流预测和结果分析
  10. apache ab压测与参数传递
  11. Air202学习 一 (程序下载流程----GPIO简单控制)
  12. Vcenter7部署3par ssmc
  13. LTK5328内置自适应升压带PBTL模式_2X8W双声道音频功率放大器
  14. 【光通信】布线时,什么情况用单模光纤,什么情况用多模光纤
  15. 0.1uf 电容浅析
  16. Jekyll 教程——安装
  17. Regionals 2015 Asia - Daejeon acmliveoj7233 - Polynomial
  18. 华中科技大学2017年数学分析高等代数考研试题
  19. 修改我的世界服务器怪物爆率,精英生成概率以及部分能力参数设置_我的世界精英怪mod教程如何调控怪物属性和掉落物__单机攻略_跑跑车单机游戏网...
  20. windows无法连接到打印机

热门文章

  1. Python 基础,不看会后悔哦!
  2. 经典面试题(10):关于this指向,以下代码将输出什么?
  3. linux 运行.net 5,.NET 5 将于2020年问世
  4. 13凯越门锁继电器在哪里_凯越中控门锁不工作.更换中央门锁装置故障依旧.
  5. java金字塔等边三角形_java99乘法表的小练习 正三角 倒三角 正金字塔 倒金字塔...
  6. 机器学习 | 目录(持续更新)
  7. 推荐一款生信分析工具的集大成者
  8. vs2013配置python_VS2013中Python学习笔记[环境搭建]
  9. P5703 【深基2.例5】苹果采购(scratch实现)
  10. 1.5 编程基础之循环控制 44 第n小的质数