python实现RSA 非对称加密解密

在爬取网站信息的时候,经常会发现前端会对数据进行加密,其中就有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加密了.这种方式在爬虫里很常见.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值