在爬取网站信息的时候,经常会发现前端会对数据进行加密,其中就有RSA 这中加密.

概念
rsa是一种非常常见的非对称加密算法,rsa算法用到了一个公式:
谜
文
=
明
文
E
m
o
d
N
谜文=明文^E modN
谜文=明文EmodN
对明文进行E次方运算,再对N取模操作得到谜文.相信到这里读者的疑问都是E和N到底是什么?其实这里的E(encryption)和N(number)的组合就是公钥(字符串形式),也就是通过解析公钥可以得到E和N.
底层的原理可以参考一篇博文:RSA算法原理
python实现RSA加密
下面是用python实现的rsa加密和解密代码
# -*- coding: utf-8 -*-
import rsa
import base64
# 随机成一对密钥,然后保存.pem格式文件,也可以直接使用
(pubkey, privkey) = rsa.newkeys(1024)
pub = pubkey.save_pkcs1()
pubfile = open('public.pem', 'w+')
pubfile.write(pub)
pubfile.close()
pri = privkey.save_pkcs1()
prifile = open('private.pem', 'w+')
prifile.write(pri)
prifile.close()
# load公钥和密钥
message = 'abcdef'
print "原始字符串:", message
with open('public.pem') as publickfile:
p = publickfile.read()
pubkey = rsa.PublicKey.load_pkcs1(p)
with open('private.pem') as privatefile:
p = privatefile.read()
privkey = rsa.PrivateKey.load_pkcs1(p)
# 公钥加密(为了展示可以用base64编码)
crypto = base64.b64encode(rsa.encrypt(message, pubkey))
print "rsa加密结果:", crypto
# 私钥解密
message = rsa.decrypt(base64.b64decode(crypto), privkey)
print "rsa解密结果:", message
# sign 用私钥签名
signature = base64.b64encode(rsa.sign(message, privkey, 'SHA-1'))
print "加签结果:", signature
# 再用公钥验证签名
res = rsa.verify(message, base64.b64decode(signature), pubkey)
print "验签结果:",res
爬虫通过publickey来实现RSA加密
通过上面介绍了我们可以知道,通过解析公钥字符串得到加密使用的E和N,那在python里如何做呢,下面是找到的一个案例:
def str2key(s):
# 对字符串解码
b_str = base64.b64decode(s)
if len(b_str) < 162:
return False
hex_str = ''
# 按位转换成16进制
for x in b_str:
h = hex(ord(x))[2:]
h = h.rjust(2, '0')
hex_str += h
# 找到模数和指数的开头结束位置
m_start = 29 * 2
e_start = 159 * 2
m_len = 128 * 2
e_len = 3 * 2
modulus = hex_str[m_start:m_start + m_len]
exponent = hex_str[e_start:e_start + e_len]
return modulus,exponent
def rsa_encrypt():
pubkey_str = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCJ50kaClQ5XTQfzkHAW9Ehi+iXQKUwVWg1R0SC3uYIlVmneu6AfVPEj6ovMmHa2ucq0qCUlMK+ACUPejzMZbcRAMtDAM+o0XYujcGxJpcc6jHhZGO0QSRK37+i47RbCxcdsUZUB5AS0BAIQOTfRW8XUrrGzmZWtiypu/97lKVpeQIDAQAB"
key = str2key(pubkey_str)
modulus = int(key[0], 16)
# print modulus
exponent = int(key[1], 16)
# print exponent
pubkey = rsa.PublicKey(modulus, exponent)
# der = base64.standard_b64decode(b64der)
# pk = rsa.PublicKey.load_pkcs1_openssl_der(der)
s = "xxxxxxxxxxxxxxxx"
value = base64.b64encode(rsa.encrypt(s.encode(), pubkey)).decode()
print value
通过上面的代码,已知publickey来就可以实现对明文数据进行RSA加密了.这种方式在爬虫里很常见.
5444

被折叠的 条评论
为什么被折叠?



