版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
JS破解常见加密解密方法
我们所说的加密方式,都是对二进制编码的格式进行加密的,对应到Python中,则是我们的Bytes
。
所以当我们在Python中进行加密操作的时候,要确保我们操作的是Bytes
,否则就会报错。
将字符串和Bytes
互相转换可以使用encode()
和decode()
方法。
1. URL编码
一般中文是不允许出现在url中的, 这就需要用到url编码和解码了
from urllib import parse
url = "https://www.baidu.com/s?ie=UTF-8&wd=风景"
# url编码
parse_encrypt = parse.quote(url)
# url解码
parse_decrypt = parse.unquote(parse_encrypt)
print(parse_encrypt)
print(parse_decrypt)
>>>
https%3A//www.baidu.com/s%3Fie%3DUTF-8%26wd%3D%E9%A3%8E%E6%99%AF
https://www.baidu.com/s?ie=UTF-8&wd=风景
2. Base64编码
在js加密解密的时候经常会用到base64编码解码的情况
import base64
url = 'http://mvvideoshare2.meitudata.com/5d6b32824ae722zczc1zid7892_H264_MP5d6b39.mp4?k=cf8ccd3e12648d8bb869bff2f97344a6&t=5d9a67b4'
# base64编码
base64_encode = base64.b64encode(url.encode())
# base64解码
base64_decode = base64.b64decode(base64_encode)
print(base64_encode)
print(base64_decode)
>>>
b'aHR0cDovL212dmlkZW9zaGFyZTIubWVpdHVkYXRhLmNvbS81ZDZiMzI4MjRhZTcyMnpjemMxemlkNzg5Ml9IMjY0X01QNWQ2YjM5Lm1wND9rPWNmOGNjZDNlMTI2NDhkOGJiODY5YmZmMmY5NzM0NGE2JnQ9NWQ5YTY3YjQ='
b'http://mvvideoshare2.meitudata.com/5d6b32824ae722zczc1zid7892_H264_MP5d6b39.mp4?k=cf8ccd3e12648d8bb869bff2f97344a6&t=5d9a67b4'
3. MD5加密
特点
- 压缩性:任意长度的数据,算出的MD5值长度都是固定的。
- 容易计算:从原数据计算出MD5值很容易。
- 抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
- 强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。
# MD5加密原则上是不可逆的
import hashlib
md5_encrypt = hashlib.md5("测试".encode()).hexdigest()
print(md5_encrypt)
>>>
db06c78d1e24cf708a14ce81c9b617ec
4. Python加密库PyCryptodome
安装与导入
Windows安装之前需要先安装***Microsoft Visual c++ 2015***。
在Linux上安装
pip install pycryptodome
导入:
import Crypto
在Windows 上安装
pip install pycryptodomex
导入:
import Cryptodome
AES(对称加密)(msg, key)
import binascii
from Cryptodome.Cipher import AES
# msg长度和mode有关
def aes_encrypt(msg, key):
if len(msg)%16 != 0:
padding = 16 - len(msg)%16
msg += padding*chr(padding)
iv = "0102030405060708"
cipyter = AES.new(key.encode(), AES.MODE_CBC, iv=iv.encode())
encrypt = cipyter.encrypt(msg.encode())
encrypt = binascii.b2a_hex(encrypt)
print(encrypt.decode())
aes_encrypt("sdsdsd", "0CoJUm6Qyw8W8jud")
RSA
非对称加密
# 密文 = 明文**E % N
import codecs
def rsa_encrypt(msg, n, e):
msg = msg.encode()
enctext = int(codecs.encode(msg, encoding='hex'), 16)**int(e, 16)%int(n,16)
return format(enctext, 'x').zfill(256)
msg = "ffffffffffffffff"
e = '010001'
n = "00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7"
rsat = rsa_encrypt(msg, n, e)
print(rsat)
rsa_encrypt(msg, n, e)