1、公开密钥加密

  又称非对称加密,需要一对密钥,一个是私人密钥,另一个则是公开密钥。公钥加密的只能私钥解密,用于加密客户上传数据。私钥加密的数据,公钥可以解密,主要用于数字签名。详细介绍可参见维基百科

  2、RSA加密算法

  RSA加密属于非对称加密。RSA算法基于一个十分简单的数论事实:将两个大质数相乘十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。维基百科中对RSA算法的安全性进行说明:RSA加密算法

  “对极大整数做因式分解的难度决定了RSA算法的可靠性。换言之,对一极大整数做因数分解愈困难,RSA算法愈可靠。假如有人找到一种快速因数分解的算法的话,那么用RSA加密的信息的可靠性就肯定会极度下降。但找到这样的算法的可能性是非常小的。今天只有短的RSA钥匙才可能被强力方式解破。到目前为止,世界上还没有任何可靠的攻击RSA算法的方式。只要其钥匙的长度足够长,用RSA加密的信息实际上是不能被解破的。”

  RSA的加密算法可以参考:RSA算法原理(一)RSA算法原理(二)

  3、python进行RSA加密解密

  

#生成rsa密钥
from Crypto.PublicKey import RSA
rsa_obj = RSA.generate(1024)
private_pem = rsa_obj.exportKey() #pem格式输出私钥
public_key = rsa_obj.publickey()
public_pem = public_key.exportKey() #将公钥输出成pem格式
print public_pem #结果类似下面这样
'''
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8jxUVKHjb0kSYRMObVDv20IyN
A1AQS2+oHGB5LNLV+cdMttldWOZwnbHYZrYa4L/MtQhQR4e5JOZhSQe14j2RAWy+
99uXEa88upt3rpAFOjpRcN9larUPXO4yF/5KXI5eo5H2Src+K6Gu+1D1PW411Rqq
d/Uzw8zfx8q5gaH6HwIDAQAB
-----END PUBLIC KEY-----
''' from Crypto.Cipher import PKCS1_v1_5 as Cipher_pkcs1_v1_5
#rsa加密,通常对加密结果进行base64编码
def encrypt(public_key, message):
cipher = Cipher_pkcs1_v1_5.new(public_key)
cipher_text = base64.b64encode(cipher.encrypt(message))
return cipher_text #rsa解密
def decrypt(rsakey, encrypt_text):
cipher = Cipher_pkcs1_v1_5.new(rsakey)
return cipher.decrypt(base64.b64decode(encrypt_text), '') msg = 'hello world'
encrypt_text = encrypt(public_key, msg)
print encrypt_text '''
goWbZ961d34RdEEgvJJtATAcAxXiY6QFTi7ToSmXQEyEKcHTNLqDdkzt3Iqwkhtfro4xCpLm4g+XqSQRNNN+3uQ9/Fahk6TZmi9eRcte5fU72jwyK6ybOAln8Chl8h14bjIsOAahmp9nuYdEFi7tV4ydNE75KMuAcHGlsJYTNjU=
''' text = decrypt(rsa_obj, encrypt_text)
print text
'hello world'

  4、模拟登录cnblog

  访问登录页面,https://passport.cnblogs.com/user/signin,输入用户名密码,查看登录信息,发现用户名密码被加密了

  看了下源代码,发现如下信息

  我们发现用户名密码被rsa加密了,没有私钥信息,是无法解密其中的内容。其次还有VerificationToken字段。我们可以对用户名密码进行rsa加密,然后模拟登录。代码如下:

#从登录页获取public key,需要手动进行格式化处理
pub = '\n'.join([
'-----BEGIN PUBLIC KEY-----',
'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCp0wHYbg/NOPO3nzMD3dndwS0M',
'ccuMeXCHgVlGOoYyFwLdS24Im2e7YyhB0wrUsyYf0/nhzCzBK8ZC9eCWqd0aHbdg',
'OQT6CuFQBMjbyGYvlVYU2ZP7kG9Ft6YV6oc9ambuO7nPZh+bvXH0zDKfi02prknr',
'ScAKC0XhadTHT3Al0QIDAQAB',
'-----END PUBLIC KEY-----'
]) #导入公钥
public_key = RSA.importKey(pub) input1 = encrypt(public_key,'****') #用户名
input2 = encrypt(public_key,"****") #密码 #登录的信息是保存在cookies中,需要cookeis验证
#使用requests的session,可以自动帮我们处理cookies
s = requests.Session()
headers = {
# 'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
# 'Accept-Encoding':'gzip, deflate, sdch, br',
# 'Accept-Language':'zh-CN,zh;q=0.8',
# 'Connection':'keep-alive',
'Host':'passport.cnblogs.com',
'Upgrade-Insecure-Requests':1,
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36',
} #打开登录页
r = s.get('https://passport.cnblogs.com/user/signin', headers=headers)
import re
#获取VerificationToken
token = re.search(r"'VerificationToken': '(.*?)'", r.text)
token = token.group(1)
headers = {
# 'Accept':'application/json, text/javascript, */*; q=0.01',
# 'Accept-Encoding':'gzip, deflate, br',
# 'Accept-Language':'zh-CN,zh;q=0.8',
# 'Connection':'keep-alive',
'Content-Type':'application/json; charset=UTF-8',
'Host':'passport.cnblogs.com',
'Origin':'https://passport.cnblogs.com',
'Referer':'https://passport.cnblogs.com/user/signin',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36',
'VerificationToken': token,
'X-Requested-With':'XMLHttpRequest' #这是必须的
} data = {'input1':input1, 'input2':input2, "remember": True}
r = s.post('https://passport.cnblogs.com/user/signin', data = json.dumps(data), headers=headers) headers = {
# 'Accept':'text/plain, */*; q=0.01',
# 'Accept-Encoding':'gzip, deflate, br',
# 'Accept-Language':'zh-CN,zh;q=0.8',
# 'Connection':'keep-alive',
'Host':'home.cnblogs.com',
'Referer':'https://home.cnblogs.com/',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36',
'X-Requested-With':'XMLHttpRequest'
} #获取当前用户信息,验证是否登录成功
print s.get('https://home.cnblogs.com/user/CurrentUserInfo', headers=headers).text '''
<h1 id="header_user_left">
欢迎你,lwli
</h1>
<div id="header_user_right">
<a href="/u/lilinwei340/"><img class="pfs" src="//pic.cnblogs.com/face/sample_face.gif" alt=""/></a>
<a href="/u/lilinwei340/">lwli</a>
· <a href="http://www.cnblogs.com/lilinwei340/">我的博客</a>
· <a href="//home.cnblogs.com/set/account/">设置</a>
· <a href="javascript:void;" onclick="return logout();">退出</a>
</div>
'''

  可以看到模拟登录成功了。如果仅仅为了模拟登录,不用这么麻烦,可以考虑:

  1、不需要自己去进行RSA加密,直接抓取登录时加密后的用户名和密码。

  2、分析登录成功页面的cookies,将其保存下来,请求时只需把cookies带上。

python RSA加密解密及模拟登录cnblog的更多相关文章

  1. python rsa 加密解密 (编解码,base64编解码)

    最近有需求,需要研究一下RSA加密解密安全:在网上百度了一下例子文章,很少有文章介绍怎么保存.传输.打印加密后的文本信息,都是千篇一律的.直接在一个脚本,加密后的文本信息赋于变量,然后立马调用解密.仔 ...

  2. python RSA加密、解密、签名

    python RSA加密.解密.签名 python中用于RSA加解密的库有好久个,本文主要讲解rsa.M2Crypto.Crypto这三个库对于RSA加密.解密.签名.验签的知识点. 知识基础 加密是 ...

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

    Reference:  http://www.cnblogs.com/luchanghong/archive/2012/07/18/2596886.html 项目合作需要,和其他网站通信,消息内容采用 ...

  4. 兼容javascript和C#的RSA加密解密算法,对web提交的数据进行加密传输

    Web应用中往往涉及到敏感的数据,由于HTTP协议以明文的形式与服务器进行交互,因此可以通过截获请求的数据包进行分析来盗取有用的信息.虽然https可以对传输的数据进行加密,但是必须要申请证书(一般都 ...

  5. Python爬虫实战五之模拟登录淘宝并获取所有订单

    经过多次尝试,模拟登录淘宝终于成功了,实在是不容易,淘宝的登录加密和验证太复杂了,煞费苦心,在此写出来和大家一起分享,希望大家支持. 温馨提示 更新时间,2016-02-01,现在淘宝换成了滑块验证了 ...

  6. iOS使用Security.framework进行RSA 加密解密签名和验证签名

    iOS 上 Security.framework为我们提供了安全方面相关的api: Security框架提供的RSA在iOS上使用的一些小结 支持的RSA keySize 大小有:512,768,10 ...

  7. openssl evp RSA 加密解密

    openssl evp RSA 加密解密 可以直接使用RSA.h 提供的接口 如下测试使用EVP提供的RSA接口 1. EVP提供的RSA 加密解密 主要接口: int EVP_PKEY_encryp ...

  8. C# 与JAVA 的RSA 加密解密交互,互通,C#使用BouncyCastle来实现私钥加密,公钥解密的方法

    因为C#的RSA加密解密只有公钥加密,私钥解密,没有私钥加密,公钥解密.在网上查了很久也没有很好的实现.BouncyCastle的文档少之又少.很多人可能会说,C#也是可以的,通过Biginteger ...

  9. Cryptopp iOS 使用 RSA加密解密和签名验证签名

    Cryptopp 是一个c++写的功能完善的密码学工具,类似于openssl 官网:https://www.cryptopp.com 以下主要演示Cryptopp 在iOS上的RSA加密解密签名与验证 ...

随机推荐

  1. BZOJ3566 SHOI2014概率充电器(动态规划+概率期望)

    设f[i]为i在子树内不与充电点连通的概率.则f[i]=(1-pi)·∏(1-qk+qk·f[k]). 然后从父亲更新答案.则f[i]=f[i]·(1-qfa+qfa*f[fa]/(1-qfa+qfa ...

  2. vue项目 axios封装第二弹

    import axios from "axios"; import qs from "qs"; import { Message, MessageBox } f ...

  3. 《转》理解Object.defineProperty的作用

    对象是由多个名/值对组成的无序的集合.对象中每个属性对应任意类型的值.定义对象可以使用构造函数或字面量的形式: var obj = new Object; //obj = {} obj.name = ...

  4. windows 网络共享无法用

    可以远程电脑,但是无法网卡共享 原因是  远程电脑的Server服务停掉了,再开启下就行了

  5. sql语句查询各门课程平均分的最大值

    解法一: select courseno,stuno,avg(score) '平均分最高值'--这里是求平均,后面的条件是过滤最大值的 from tablename group by courseno ...

  6. 解决:warning LNK4098: 默认库“MSVCRT”与其他库的使用冲突;找到 MSIL .netmodule 或使用 /GL 编译的模块;正在。。;LINK : warning LNK4075: 忽略“/INCREMENTAL”(由于“/LTCG”规范)

    原文链接地址:https://www.cnblogs.com/qrlozte/p/4844411.html 参考资料: http://blog.csdn.net/laogaoav/article/de ...

  7. 【线段树】【CF19D】 Points

    传送门 Description 在一个笛卡尔坐标系中,定义三种操作: \(add(x,y)\),将点\((x,y)\)标记在坐标系上 \(find(x,y)\),查询点\((x,y)\)严格右上方中, ...

  8. joomla! 3.X 开发系列教程

    http://www.mengyunzhi.com/members-resource/joomla/87-joomla-menu-study.html 学习地址 http://blog.csdn.ne ...

  9. Bash to check SSL cert expired

    Code like this, You can send out a email to notice $ cat urls.txt www.baidu.com $ cat cert_chk.sh #! ...

  10. Python入门记录

    最近看到Python3.7版本已经发布了,安装了Aconda最新的版本.安装完成后测试: 在Python程序里有两种办法查看Python版本信息: import sys # 查看版本 print(sy ...