Python 实现 RAS 加解密(ras模块,pycrypto模块)

一,pycrypto / pycryptodome模块

 1. 模块安装说明

crypto这个模块的安装有点小坑,需要注意。

crypto,pycrypto,pycryptodome的功能是一样的。crypto与pycrypto已经没有维护了

所以,直接都用 pycryptodome 就行了,安装命令如下
 

pip install pycryptodome

2. 公钥私钥的生成

from Crypto import Random
from Crypto.PublicKey import RSA

"""
generate(bits, randfunc=None, e=65537) 有三个参数,

bits 是一个字节大小的值,通常是1024,2048, 3072这三个。

randfunc 是一个随机函数,默认是 Crypto.Random.get_random_bytes ,可以自己设置,也可以保持默认。

e=65537 是公共 RSA 指数


"""
random_generator = Random.new().read         #实例化一个随机生成值的对象
rsa = RSA.generate(1024, random_generator)   #实例化一个对象 rsa

private_key = rsa.exportKey()                # 生成私钥
print(private_key.decode('utf-8'))

public_key = rsa.publickey().exportKey()     # 生成公钥
print(public_key.decode('utf-8'))

公钥指数是可以随意选取的,但是为了提高RSA的加密速度,实际使用中公钥指数最长用的三个值是3、17、65537(爬虫逆向时经常遇到,作为偏移量在JS代码中经常以二进制方(”10001“)式出现 , 如 setPublic(me.rsaPubkey, "10001"))。

PEM建议用3。PKCS#1建议用3或65537。X.509建议用65537。这样选取主要是为了提高加密或签名验证的性能,因为3、17或65537分别只需要2或17次模乘运算,而一个随机选择的e(假设n是1024-bit)则大约需要1000次模乘运算。这种方法刻意把公钥指数选的小一点,其对应私钥指数就会很大,这么做的目的是节约公钥运算的时间。因为正常使用中都是用公钥加密,所以需要节约大部分人的时间。而极少部分人也会选用私钥解密,那么就只能少数服从多数了。

3. 使用 公钥加密 和 使用私钥解密

import Crypto.PublicKey.RSA
import Crypto.Cipher.PKCS1_v1_5
import Crypto.Random


def encrypt(msg):
    
    public_key = " "                            # 逆向时找到的公钥
    cipher = PKCS1_cipher.new(public_key)       # 生成一个加密的类
    encrypt_text = base64.b64encode(cipher.encrypt(msg.encode()))  # 对数据进行加密
    return encrypt_text.decode()                # 对文本进行解码码


def decrypt_data(encrypt_msg):

    private_key = get_key('rsa_private_key.pem')  # 读取私钥信息
    cipher = PKCS1_cipher.new(private_key)        # 生成一个解密的类
    back_text = cipher.decrypt(base64.b64decode(encrypt_msg), 0)  # 进行解密
    return back_text.decode()                     # 对文本内容进行解码

二,rsa 模块使用

 1,  安装命令如下

pip install rsa

2 , 公钥私钥的生成

import rsa
 
public, private = rsa.newkeys(1024)     # 生成公钥、私钥

with open("./private.pem", "wb") as x:  # 保存私钥
    x.write(private.save_pkcs1())

with open("./public.pem", "wb") as x:   # 保存公钥
    x.write(public.save_pkcs1())

3. 使用 公钥加密 和 使用私钥解密

import rsa
 
str = b"yaogepachong"
with open("public.pem", 'rb') as x:
    public_key = rsa.PublicKey.load_pkcs1(x.read())
    cipher_text = rsa.encrypt(str, public_key)     # 使用公钥加密
with open("private.pem", 'rb') as x:
    private_key = rsa.PrivateKey.load_pkcs1(x.read())
    text = rsa.decrypt(cipher_text, private_key)   # 使用私钥解密

三,微博 和 某宝 登录 加密 可以用如下代码 实现

import rsa
import binascii
import base64

def get_password(message, e='10001'):
    """
    RSA加密用户密码
    e 是偏移量 ,RSA默认的指数(65537的二进制就是10001)
    binascii.b2a_hex(crypto).decode() 把加密得到的二进制结果转为16进制字符串
    """
    n = ' '                                           # 逆向找到的公钥
    pub_key = rsa.PublicKey(int(n, 16), int(e, 16))
    crypto = rsa.encrypt(message.encode('utf8'), pub_key)
    return binascii.b2a_hex(crypto).decode(),         # base64.b64encode(crypto)


print(get_password('1675154786\t3497B2\n嘟嘟嘟231dyu'))

 

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
欧拉公式可以表示为: $$e^{ix} = \cos(x) + i\sin(x)$$ 其中,$i$ 是虚数单位,满足 $i^2=-1$。 RAS算法是一种非对称加密算法,其中,加密和解密使用不同的密钥。 加密过程: 1. 选择两个不同的质数 $p$ 和 $q$,计算 $n=pq$。 2. 选择一个整数 $e$,满足 $1<e<\phi(n)$,且 $e$ 与 $\phi(n)$ 互质,其中 $\phi(n)=(p-1)(q-1)$。 3. 将要加密的明文 $M$ 转换为整数 $m$,使得 $0\leq m<n$。 4. 计算密文 $C\equiv m^e\pmod{n}$。 解密过程: 1. 找到一个整数 $d$,满足 $ed\equiv1\pmod{\phi(n)}$。 2. 计算明文 $M\equiv C^d\pmod{n}$。 下面是用欧拉公式在C++里实现RAS加密解密算法的代码: ```c++ #include <iostream> #include <cmath> using namespace std; // 快速幂算法 long long pow_mod(long long a, long long b, long long mod) { long long res = 1; while (b) { if (b & 1) res = res * a % mod; a = a * a % mod; b >>= 1; } return res; } // 求最大公约数 long long gcd(long long a, long long b) { if (b == 0) return a; return gcd(b, a % b); } // 求扩展欧几里得算法 long long exgcd(long long a, long long b, long long &x, long long &y) { if (b == 0) { x = 1; y = 0; return a; } long long d = exgcd(b, a % b, x, y); long long z = x; x = y; y = z - a / b * y; return d; } // RAS加密算法 long long ras_encrypt(long long m, long long e, long long n) { return pow_mod(m, e, n); } // RAS解密算法 long long ras_decrypt(long long c, long long d, long long n) { return pow_mod(c, d, n); } // 生成密钥 void generate_key(long long p, long long q, long long &n, long long &e, long long &d) { n = p * q; long long phi = (p - 1) * (q - 1); do { e = rand() % (phi - 2) + 2; } while (gcd(e, phi) != 1); exgcd(e, phi, d, n); if (d < 0) d += phi; } int main() { long long p = 61, q = 53; // 选择两个质数 long long n, e, d; generate_key(p, q, n, e, d); // 生成公钥和私钥 cout << "公钥: (" << e << ", " << n << ")" << endl; cout << "私钥: (" << d << ", " << n << ")" << endl; long long m = 123; // 明文 long long c = ras_encrypt(m, e, n); // 加密 long long m2 = ras_decrypt(c, d, n); // 解密 cout << "明文: " << m << endl; cout << "密文: " << c << endl; cout << "解密: " << m2 << endl; return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老妖哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值