原文链接: python pycrypto 加密解密

上一篇: 面试链表问题 汇总

下一篇: sympy 解决常见高数问题

参考

http://www.cnblogs.com/huxianglin/p/6387045.html

如果引入模块报错,需要使用conda重新安装

RSA 密码算法与签名
RSA是一种公钥密码算法,RSA的密文是对代码明文的数字的 E 次方求mod N 的结果。也就是将明文和自己做E次乘法,然后再将其结果除以 N 求余数,余数就是密文。RSA是一个简洁的加密算法。E 和 N 的组合就是公钥(public key)。

对于RSA的解密,即密文的数字的 D 次方求mod N 即可,即密文和自己做 D 次乘法,再对结果除以 N 求余数即可得到明文。D 和 N 的组合就是私钥(private key)。

算法的加密和解密还是很简单的,可是公钥和私钥的生成算法却不是随意的。本文在于使用,对生成秘钥对的算法就暂时忽略。使用 Pycrypto生成秘钥对很简单,我们分别为 Master和Ghost各生成一对属于自己的秘钥对。

from Crypto import Random
from Crypto.PublicKey import RSA# 伪随机数生成器
random_generator = Random.new().read
# rsa算法生成实例
rsa = RSA.generate(1024, random_generator)# master的秘钥对的生成
private_pem = rsa.exportKey()# --------------------------------------------生成公私钥对文件-----------------------------------------------------------
with open('master-private.pem', 'wb') as f:f.write(private_pem)public_pem = rsa.publickey().exportKey()
with open('master-public.pem', 'wb') as f:f.write(public_pem)# ---------------------------------------------------
# ghost的秘钥对的生成
private_pem = rsa.exportKey()
with open('ghost-private.pem', 'wb') as f:f.write(private_pem)public_pem = rsa.publickey().exportKey()
with open('ghost-public.pem', 'wb') as f:f.write(public_pem)#-----------------------------------生成的公私钥文件类似于如下形式-------------------------------------------------------
# 私钥
-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQC6mwuOxuqYi6mugLGr3OuiHwm/hF4kQX1zd5VhGwxYf4H5+pkO
CES2UjOyLP9Xh6w+DJtRwTGE2xwDd3wMfW2wkHijM/uHkM9Jt+oRGIjy4IiXo+7t
ue/NWBkDiQm1qte0YDKlmkFREwvZ5X2KaCsSx+dyKH4QsovxQ3/RxftdmQIDAQAB
AoGAPA5SNe1G6zlnrsW0aL99Bnw+wuhy8/Av082Uwd/WpVTEHBPO1nlKw/LIuHtK
4nzDrmSYSEOJEF0EMwltXwevGSm1wq2FBhX4T+kz3XUpWfv9O0dlHeNtgxeD1QXL
kOxqU4F2WpdALgvi/rlPDd0aIagoXLi8MXkUH7hQlrJpQUECQQC6rygx3jDQA9Iw
kPUXlokEuLod+Kgoa700S5qpJi7vft675+tMG5SZtr+HQeqGHty0fqc8MIcy1fJm
ZYUrogN9AkEA/+RrrOoTYQbR3ENslTsNsiqQa2aZW5XAv9pEyGJBWu/4HUEEa6G3
FY0Y3ACZR0Xaraya8XAgOo61pWm83GBlTQJBAKH2812Ikzr2BbdDHJExdoEVL8xu
/p3LE6U6bt2QFiqNHPtT9C3cw+k0xyi3RJzGS9+A/uDWjYXKXvr92zMG5hUCQFXR
alccTZF9swX2ysSlgGtfIP4T85ymdXUiI208noR79C8DbhMWsgsVPeASh1VC1Rrn
xzLvkq9wyvSFqKQT5AUCQAxMO7KI1rwIm+ISuDEcwxRJXkdFypD74kOSYRxTqMun
Zdu4ku4t6mVeq5kBv1/S2dtF3TiqMRlxmLmV/fx7KHM=
-----END RSA PRIVATE KEY-----#公钥
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC6mwuOxuqYi6mugLGr3OuiHwm/
hF4kQX1zd5VhGwxYf4H5+pkOCES2UjOyLP9Xh6w+DJtRwTGE2xwDd3wMfW2wkHij
M/uHkM9Jt+oRGIjy4IiXo+7tue/NWBkDiQm1qte0YDKlmkFREwvZ5X2KaCsSx+dy
KH4QsovxQ3/RxftdmQIDAQAB
-----END PUBLIC KEY-----

RSA使用公私钥加解密数据

加密与解密
通常通信的时候,发送者使用接受者的公钥加密,接受者使用接受者私钥解密。

简而言之,Master给Ghost通信,需要加密内容,那么Ghost会生成一个秘钥对,Ghost的公钥ghost-public.pem和私钥ghost-private.pem 。Ghost 把公钥公开给发送者,任何人都可以用来加密,然后Master使用ghost-public.pem进行加密,然后把内容发给Ghost,Ghost再使用ghost-private.pem进行解密。

from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5 as Cipher_pkcs1_v1_5
import base64message = 'hello ghost, this is a plian text'
with open('ghost-public.pem', "r") as f:key = f.read()rsakey = RSA.importKey(key)  # 导入读取到的公钥cipher = Cipher_pkcs1_v1_5.new(rsakey)  # 生成对象cipher_text = base64.b64encode(cipher.encrypt(message.encode(encoding="utf-8")))  # 通过生成的对象加密message明文,注意,在python3中加密的数据必须是bytes类型的数据,不能是str类型的数据print(cipher_text)with open('ghost-private.pem') as f:key = f.read()rsakey = RSA.importKey(key)  # 导入读取到的私钥cipher = Cipher_pkcs1_v1_5.new(rsakey)  # 生成对象text = cipher.decrypt(base64.b64decode(cipher_text), "ERROR")  # 将密文解密成明文,返回的是一个bytes类型数据,需要自己转换成strprint(text)b'fpczMFuc9vhsOlQ9pGnIKkblwCaNtTdp2vrUEVA9pu1UgKStcxmJ8+qqZ05lvJoTGeSaNN1meC4uHjnbvOCv7vsV36pT9OGl0ygCvV94hZiPNQEUk4slFUBrY8dOKmRfzP5pvruN6+T6BEyzaPWLnAKzIZ0ZiVDBPFHkEClelV4='
b'hello ghost, this is a plian text'
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 RSA
import base64message = b'hello ghost, this is a plian text'
with open('ghost-public.pem') as f:key = f.read()rsakey = RSA.importKey(key)cipher = Cipher_pkcs1_v1_5.new(rsakey)cipher_text = base64.b64encode(cipher.encrypt(message))print(cipher_text)with open('ghost-private.pem') as f:key = f.read()rsakey = RSA.importKey(key)cipher = Cipher_pkcs1_v1_5.new(rsakey)text = cipher.decrypt(base64.b64decode(cipher_text), "ERROR")print(text)
b'Gs8InVgp+TNQcsvu70svZBCzTFY0Bs8k49Son6XYQBYPudw8S7VHBZW4y7aAgvQuEHv4ZoNrbc4fn6EbTs8TGQ42eAAhF2TVJkvAk6J0rCh3AbmdlXZ1vRS2IFpRFO33XbnGRDUzt7oOJf4QuQzXFznVVPcXBxKNMQogDpyG5L8='
b'hello ghost, this is a plian text'

这样Ghost就能看到Master所发的内容了,当然,如果Ghost想要给Master发消息,就需要Master先把其的公钥给Ghost,后者再使用公钥加密,然后发送给Master,最后Master使用自己的私钥解密。

签名与验签
当然,对于窃听者,有时候也可以对伪造Master给Ghost发送内容。为此出现了数字签名。也就是Master给Ghost发送消息的时候,先对消息进行签名,表明自己的身份,并且这个签名无法伪造。具体过程即Master使用自己的私钥对内容签名,然后Ghost使用Master的公钥进行验签。

签名

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 RSA
import base64message = 'hello ghost, this is a plian text'
with open('master-private.pem') as f:key = f.read()rsakey = RSA.importKey(key)signer = Signature_pkcs1_v1_5.new(rsakey)digest = SHA.new()digest.update(message.encode('utf8'))sign = signer.sign(digest)signature = base64.b64encode(sign)
print(signature)b'K9D0VTIMYP9kzxg7LEt7BVGSgWAXUPrwtnIROFdn4qgYZrTLshBMzApajA22ErmXlVOWI4mkmlEvgN40OoAoJgJxXQj3yyII6sXw8usp11RlLYx1XoB2tfFx4gp/Rr/CsNC6NNommLKnJhqSJeP/v7veaayZwGAwEuEPF8qzocw='

检签

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 RSA
import base64
signature = b'K9D0VTIMYP9kzxg7LEt7BVGSgWAXUPrwtnIROFdn4qgYZrTLshBMzApajA22ErmXlVOWI4mkmlEvgN40OoAoJgJxXQj3yyII6sXw8usp11RlLYx1XoB2tfFx4gp/Rr/CsNC6NNommLKnJhqSJeP/v7veaayZwGAwEuEPF8qzocw='
message = b'hello ghost, this is a plian text'
with open('master-public.pem') as f:key = f.read()rsakey = RSA.importKey(key)verifier = Signature_pkcs1_v1_5.new(rsakey)digest = SHA.new()# Assumes the data is base64 encoded to begin withdigest.update(message)is_verify = verifier.verify(digest, base64.b64decode(signature))print(is_verify)True

python pycrypto 加密解密相关推荐

  1. python rsa加密解密_RSA加密解密(python版)

    RSA的算法涉及三个参数,n.e.d. 其中,n是两个大质数p.q的积,n的二进制表示时所占用的位数,就是所谓的密钥长度. e1和d是一对相关的值,e可以任意取,但要求e与(p-1)*(q-1)互质: ...

  2. 前后端加密解密 【JS加密模块(md5 、 crypto 、 crypto-js、jsencrypt) python RSA加密解密(pycryptodome )模块安装与使用】

    JS加密模块[js-md5(AES) . crypto (AES). crypto-js().jsencrypt(非对称加密.RSA)] 一.安装 npm install js-md5 npm ins ...

  3. python AES加密解密

    AES,是美国联邦政府采用的一种加密技术,AES有几个模式,其中CBC模式是公认的安全性最好的模式,被TLS所采用. 加密与解密双方需确定好key,key的长度可以是16位,24位,32位中的一个,分 ...

  4. python 字符串加密解密_Python实现对字符串的加密解密方法示例

    本文实例讲述了Python实现对字符串的加密解密方法.,具体如下: 需求是是要将密码存在数据库里,所以要加密解密是可逆的,在数据库里不要有特殊字符,防止数据库备份和恢复中出错. 安装PyCrypto, ...

  5. python rsa加密解密 字符串_python_rsa加密解密

    代码: #!/usr/bin/env python #encoding=utf-8 ''' 测试rsa加密解密 ''' from M2Crypto import RSA msg = 'aaaa-aaa ...

  6. python md5加密解密_Python使用MD5加密算法对字符串进行加密操作示例

    本文实例讲述了Python使用MD5加密算法对字符串进行加密操作.分享给大家供大家参考,具体如下: # encoding: utf-8 from __future__ import division ...

  7. python实现加密解密功能(GUI)

    项目概述 项目使用python和tkinter实现,能够实现对明文/密文的加解密,或对文本进行base64.url编码/解码. 需求分析 实现多种常见的ctf加密/解密(编码/解码)方法,选择相应加密 ...

  8. python代码加密解密_Python加密解密代码

    ''' 作业:中英文加密+解密 做题思路:先练习单独用ascii和汉字加密和解密,见作业后的encode_game和decode_game 爬取中文用的是BeautifulSoup 作业encode_ ...

  9. Python 3DES 加密解密

    3DES 加密解密 import pyDes import base64from Crypto.Cipher import DES3 import codecs import base64class ...

最新文章

  1. 笔记 | 那些不得不掌握的卷积神经网络CNN的架构
  2. java double类型保留两位小数4种方法
  3. 贝叶斯推断及其互联网应用(一):定理简介
  4. PHP秒杀截流原理,流量新大陆:巧借PC、移动端评论截流,让精准流量“爆起来”...
  5. mysql 统计本月的_mysql 查询当天、本周,本月,上一个月的数据
  6. linux bjobs
  7. 初识Flink广播变量broadcast
  8. 36. BOM (2)
  9. python3 编程学习链接
  10. $.ajax(0,jQuery Ajax显示0而不是Array(jQuery Ajax showing 0 instead of Array)
  11. 梦笔记2021-03-05
  12. MATLAB数据拟合中的若干问题(待续)
  13. 《Netty权威指南》(五)ByteBuf源码分析
  14. 【AE】缺少Color属性或方法解决办法
  15. Nexus的权限管理
  16. 2013年多益网络校园招聘笔试题
  17. 【Markdown语法】字体颜色大小及文字底色设置
  18. LVGL8学习之row and a column layout with flexbox
  19. pdf文件如何生成目录 wps_wps制作pdf文档的详细方法
  20. Windows 11 家庭版、专业版、企业版、教育版、SE 版之间的区别

热门文章

  1. 物联网专业真的很坑吗?浅谈物联网的未来发展趋势和方向
  2. 从红孩子到贝备网 母婴网购市场的转变
  3. 《遥感图像处理笔记》第1章
  4. 学会网络远程控制,就可在办公室操作家中的电脑
  5. MySQL精品学习资源合集 | 含学习教程笔记、运维技巧、图书推荐
  6. c语言的运算符优先级文档下载,c语言运算符优先级
  7. 泛娱乐行业需求升级,即构推出“泛娱乐社交玩法2.0方案”
  8. 系统访问502状态排查思路
  9. 水桶服务器1.7.10服务器文件,我的世界1.7.10水桶开服包游戏
  10. 2021年安全生产模拟考试(全国特种作业操作证电工作业-电气试验模拟考试题库一)安考星