杂项之python利用pycrypto实现RSA

杂项之python利用pycrypto实现RSA

本节内容

  1. pycrypto模块简介
  2. RSA的公私钥生成
  3. RSA使用公钥加密数据
  4. RSA使用私钥解密密文
  5. 破解博客园登陆

pycrypto模块简介

pycrypto模块是python中用来处理加密解密等信息安全相关的一个很重要模块。

该模块支持的加密方式:

  1. 对称加密方式:

    1. AES
    2. DES
    3. ARC4
  2. 散列值计算:
    1. MD5
    2. SHA
    3. HMAC
  3. 公钥加密和签名:
    1. RSA
    2. DSA

基本上常见的关于信息安全类的算法都可以支持,所以,这是一个很强大的模块。

安装方式:pip install pycrypto
如果在windows上的python3.5中安装完成之后导入from Crypto import Random模块失败,需要找到python35安装目录下的Lib\site-packages\Crypto\Random\OSRNG\nt.py文件,将import winrandom修改成from . import winrandom

关于加密方式的了解可以看我这边博客:加密方式介绍
关于非对称加密算法(RSA)的使用可以看我这篇博客:数字签名和数字证书

RSA的公私钥生成

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使用公私钥加解密数据

from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5 as Cipher_pkcs1_v1_5
import base64

message = ‘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类型数据,需要自己转换成str
    print(text)
# 结果:
b‘meBtYXP35VNjtWXsONDluweXdG98tMHjb5GxBLFJ0GJzo+96wSrHe8SDhNJweDJP6/OdeIQ8jP1HKCK+aC9HA12YMSUUqcixsY5s8QUyTs+fkMjGrlC6I7hPLO4DGQbFXEY0jiqP9ycgmAi5FCsDMcm0oEm8/fVzv7vl9QarSN4=‘  # 加密后的密文
b‘hello ghost, this is a plian text‘  # 解密后的明文

破解博客园登陆

经过分析博客园登陆方式为在用户填入用户名和密码之后,点击登录时js将会使用JSEncrypt这个开源组件对用户输入的用户名和密码进行加密,加密的公钥在js源码中查找到了,为”MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCp0wHYbg/NOPO3nzMD3dndwS0MccuMeXCHgVlGOoYyFwLdS24Im2e7YyhB0wrUsyYf0/nhzCzBK8ZC9eCWqd0aHbdgOQT6CuFQBMjbyGYvlVYU2ZP7kG9Ft6YV6oc9ambuO7nPZh+bvXH0zDKfi02prknrScAKC0XhadTHT3Al0QIDAQAB”

后经查询资料得知该js组件使用的加密方式为RSA加密,又获取到了加密的公钥,所以,我们可以自己模拟JS加密方式将我们自己的用户名密码使用RSA加密之后提交到博客园服务器来实现登录。

import re
import json
from Crypto.Cipher import PKCS1_v1_5 as Cipher_pkcs1_v1_5
from Crypto.PublicKey import RSA
import base64
import requests

def js_encrypt(text):
    # 通过拿到js中的RSA公钥,构造完整的公钥部分
    key = """-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCp0wHYbg/NOPO3nzMD3dndwS0MccuMeXCHgVlGOoYyFwLdS24Im2e7YyhB0wrUsyYf0/nhzCzBK8ZC9eCWqd0aHbdgOQT6CuFQBMjbyGYvlVYU2ZP7kG9Ft6YV6oc9ambuO7nPZh+bvXH0zDKfi02prknrScAKC0XhadTHT3Al0QIDAQAB
-----END PUBLIC KEY-----"""

    rsakey = RSA.importKey(key)
    cipher = Cipher_pkcs1_v1_5.new(rsakey)  # 生成对象
    cipher_text = base64.b64encode(cipher.encrypt(text.encode(encoding="utf-8")))  # 对传递进来的用户名或密码字符串加密
    print(cipher_text)
    value = cipher_text.decode(‘utf8‘)  # 将加密获取到的bytes类型密文解码成str类型

    return value

session = requests.Session()

i1 = session.get(‘https://passport.cnblogs.com/user/signin‘)  # 访问博客园登陆页面
rep = re.compile("‘VerificationToken‘: ‘(.*)‘")  # 构造正则获取博客园的CSRF键值对
v = re.search(rep, i1.text)
verification_token = v.group(1)  # 拿到CSRF值

form_data = {  # 构造post的请求体
    ‘input1‘: js_encrypt(‘你博客园账号‘),  # 将用户名填在提示位置,将返回加密后的用户名
    ‘input2‘: js_encrypt(‘你博客园密码‘),  # 将密码填在提示位置,将返回加密后的密码
    ‘remember‘: False
}

i2 = session.post(url=‘https://passport.cnblogs.com/user/signin‘,  # post访问登陆页面,发送登陆请求
                  data=json.dumps(form_data),
                  headers={
                      ‘Content-Type‘: ‘application/json; charset=UTF-8‘,  # 设置Content-Type类型为JSON类型
                      ‘X-Requested-With‘: ‘XMLHttpRequest‘,  # 设置头部的X-Requested-With字段,标示该请求为AJAX请求
                      ‘VerificationToken‘: verification_token}  # 将之前获取到的CSRF键值对设置在头部信息中
                  )

i3 = session.get(url=‘https://i.cnblogs.com‘)  # 访问登陆后的页面

print(i3.text)  # 如果打印出登陆后的页面,说明登陆操作成功
时间: 2024-08-09 19:53:39

杂项之python利用pycrypto实现RSA的相关文章

python利用企业微信api来进行发送自定义报警的类实现

python利用企业微信api来进行发送自定义报警的类实现 企业微信注册 打开http://work.weixin.qq.com/企业微信主页: 点击企业注册: 填写相关信息,营业执照和注册号可以不用填,直接下一步,按照提示操作即可: 注册完成后,登陆,就显示如下界面: 点击我的企业标签: 看到如上界面,复制CorpID对应的值: 点击企业应用: 点击 创建应用: 填写对应内容,点击创建应用即可: 然后再点击企业应用,就可以在自建应用里看到自己创建的应用: 点击应用图标,看到如下图 复制Agen

杂项之python描述符协议

杂项之python描述符协议 本节内容 由来 描述符协议概念 类的静态方法及类方法实现原理 类作为装饰器使用 1. 由来 闲来无事去看了看django中的内置分页方法,发现里面用到了类作为装饰器来使用,由于之前就看到过这一类的用法,但是一直没有明白具体是如何实现的,今天本着打破砂锅问到底的精神去网上搜资料,在这里不得不吐槽下百度搜索的垃圾了.....竞价排名做的那么6,搜一些技术文档.....各种坑爹...就是找不到想要的资源...于是FQ上google搜了搜,找到了python官网的文档...

转:python安装pycrypto

from: http://ljhzzyx.blog.163.com/blog/static/3838031220136592824697/   在windows下用一下开源工具就是悲催,如题python安装pycrypto在windows也是很麻烦.一般在官方网站下载: https://www.dlitz.net/software/pycrypto/ 然后使用命令就可以安装成功了: python setup.py build python setup.py install 但是在windows下

python利用pymssql链接sqlserver数据库

1.引入pymssql包 import pymssql 2.建立连接: conn = pymssql.connect(server=conf['db_address'], port="1433",user=conf['db_username'], password=conf['db_password'], database=conf['db_name'], charset="UTF-8") cursor = conn.cursor() 3.执行SQL语句: curs

hbase之python利用thrift操作hbase数据和shell操作

前沿: 以前都是用mongodb的,但是量大了,mongodb显得不那么靠谱,改成hbase撑起一个量级. HBase是Apache Hadoop的数据库,能够对大型数据提供随机.实时的读写访问.HBase的目标是存储并处理大型的数据.HBase是一个开源的,分布式的,多版本的,面向列的存储模型.它存储的是松散型数据. HBase提供了丰富的访问接口. HBase Shell Java clietn API Jython.Groovy DSL.Scala REST Thrift(Ruby.Pyt

C++和python利用struct结构传输二进制数据实现

网络编程中经常会涉及到二进制数据传输的问题,在C++中常用的传输方式有文本字符串和结构体封包.如果能将要发送的数据事先放进连续的内存区,然后让send函数获取这片连续内存区的首地址就可以完成数据的发送了,文本字符串如char型数组,以字节为单位,在内存中是顺序存储的,所以可以直接用send函数发送.但是如果要同时发送多个不同类型的数据时,它们在内存中存储的地址是随机的,不是顺序存储的,而且它们之间的相对位置也无法确定,这样就需要一种数据组织方式来明确各数据之间的相对位置.结构体显然就是一种的数据

【Python】Python利用有道翻译开发API应用示例

Python源码是关于Python利用有道翻译开发API应用示例.这是一个很有意思又简单的API应用练习题,方法中用到了有道词典开放API应用,合成的类似于命令行词典应用Python小程序.功能简单,但效果却很好. 这里要注意的是:有道API的请求频率限制,限制频率为每小时1000次,如果超过限制会被封禁. 提示:如果想一直用这个可以自己申请一个KEY,申请的过程非常简单的,只要替换原有的KEY_FROM和KEY就可以了. Python利用有道翻译开发API应用示例,源码如下: #!/usr/b

【Python模拟登录】RSA加密与重放方式登录 -以模拟登录博客园为例

Python模拟登录第一弹见:[Python数据分析]Python模拟登录(一) requests.Session应用上次的登录是最基本的,全部是明文,而且在浏览器中就可以看到POST的数据.接下来我们来个稍微难一点的–模拟登录博客园(http://www.cnblogs.com) 登录特点:用户名密码都进行了RSA加密,且在浏览器中无法看到POST数据 图1如上图,在post数据中不能显式看到POST内容. 模拟登录步骤 既然浏览器调试功能无法探测到POST数据,那么采用Fiddler试试看,

微信企业号:python 利用itchatmp开启回调模式/判断信息--回复指定内容

安装 yum install httpd  mod_wsgi vim /etc/httpd/conf.d/wsgi.conf <VirtualHost *:80> DocumentRoot /var/www/wsgi WSGIScriptAlias / /var/www/wsgi/webapp.wsgi </VirtualHost> systemctl restart httpd mkdir -p  /var/www/wsgi/ cd /var/www/wsgi 设置 vim  i