js逆向常见加密算法——python
js逆向常见加密算法——python整理(copy)一下js逆向过程中常见的加解密方法,方便查阅。从熟悉的python开始吧。有些做一点点简单的封装。原理什么的搜索解决。base64# -*- coding: utf-8 -*-import base64def encode_base64(data, encode_method="utf-8"):"""base64加密:param data: 待加
·
js逆向常见加密算法——python
整理(copy)一下js逆向过程中常见的加解密方法,方便查阅。
base64、md5、sha1、hmac、des、aes
从熟悉的python开始吧。有些做一点点简单的封装。
原理什么的搜索解决。
base64
# -*- coding: utf-8 -*-
import base64
def encode_base64(data, encode_method="utf-8"):
"""
base64加密
:param data: 待加密字符串
:param encode_method: 编码方法,默认utf-8
:return:
"""
bytes_data = data.encode(encode_method)
result = base64.b64encode(bytes_data).decode()
return result
def decode_base64(data):
"""
base64解密
:param data: 待解密字符串
:return:
"""
result = base64.b64decode(data).decode()
return result
if __name__ == '__main__':
data_str = "hello world"
en_data = encode_base64(data_str)
print(en_data) # aGVsbG8gd29ybGQ=
print(decode_base64(en_data)) # hello world
md5
没有解密,听说可以破解。
# -*- coding: utf-8 -*-
import hashlib
def encode_md5(data, encode_method="utf-8"):
"""
md5加密
:param data: 待加密字符串
:param encode_method: 编码方法,默认utf-8
:return: 128位,32长度字符串
"""
bytes_data = data.encode(encode_method)
m = hashlib.md5()
m.update(bytes_data)
return m.hexdigest()
if __name__ == '__main__':
data_str = "hello world"
en_data = encode_md5(data_str)
print(en_data) # 5eb63bbbe01eeed093cb22bb8f5acdc3
sha1
和md5类似
# -*- coding: utf-8 -*-
import hashlib
def encode_sha1(data, encode_method="utf-8"):
"""
sha1加密
:param data: 待加密字符串
:param encode_method: 编码方法,默认utf-8
:return: 40长度字符串
"""
bytes_data = data.encode(encode_method)
m = hashlib.sha1()
m.update(bytes_data)
return m.hexdigest()
if __name__ == '__main__':
data_str = "hello world"
en_data = encode_sha1(data_str)
print(en_data) # 2aae6c35c94fcfb415dbe95f408b9ce91ee846ed
hmac
# -*- coding: utf-8 -*-
import hmac
import hashlib
def encode_hmac(data, key, encode_method="utf-8"):
"""
hmac加密
:param key: 密钥key
:param data: 待加密字符串
:param encode_method: 编码方法,默认utf-8
:return: 32长度字符串
"""
key = key.encode(encode_method)
bytes_data = data.encode(encode_method)
# 第一个参数是密钥key,第二个参数是待加密的字符串,第三个参数是hash函数
m = hmac.new(key, bytes_data, hashlib.md5)
return m.hexdigest()
if __name__ == '__main__':
data_str = "hello world"
key_str = 'key'
en_data = encode_hmac(data_str, key_str)
print(en_data) # ae92cf51adf91130130aefc2b39a7595
对称加密算法
常用的对称加密算法有:
算法 | 密钥长度 | 工作模式 | 工作模式 |
---|---|---|---|
DES | 56/64 | ECB/CBC/PCBC/CTR/… | NoPadding/PKCS5Padding/… |
AES | 128/192/256 | ECB/CBC/PCBC/CTR/… | NoPadding/PKCS5Padding/PKCS7Padding/… |
密钥长度直接决定加密强度,而工作模式和填充模式可以看成是对称加密算法的参数和格式选择
des
需要安装 pip install pyDes
全称:数据加密标准( Data Encryption Standard ),属于对称加密算法。
DES是一个分组加密算法,典型的DES以64位为分组对数据加密,加密和解密用的是同一个算法。
# -*- coding: utf-8 -*-
import binascii
from pyDes import des, CBC, PAD_PKCS5
def des_encrypt(secret_key, data):
"""
des加密
:param secret_key: 秘钥,密钥长度必须恰好为8字节。
:param data: 待加密字符串
:return: 密文
"""
iv = secret_key # 初始值(偏移量)
k = des(secret_key, CBC, iv, pad=None, padmode=PAD_PKCS5) # 默认CBC工作模式
en = k.encrypt(data, padmode=PAD_PKCS5)
return binascii.b2a_hex(en)
def des_decrypt(secret_key, data):
"""
des解密
:param secret_key: 秘钥,密钥长度必须恰好为8字节。
:param data: 待解密字符串
:return: 明文
"""
iv = secret_key
k = des(secret_key, CBC, iv, pad=None, padmode=PAD_PKCS5)
de = k.decrypt(binascii.a2b_hex(data), padmode=PAD_PKCS5)
return de
if __name__ == '__main__':
data_str = "hello world"
key_str = '12345678' # 密钥长度必须恰好为8字节。
secret_str = des_encrypt(key_str, data_str)
print(secret_str) # b'0b2a92e81fb49ce1a43266aacaea7b81'
clear_str = des_decrypt(key_str, secret_str)
print(clear_str) # b'hello world'
aes
需要安装 pip install pycrypto
安装报错,执行pip install -i https://pypi.douban.com/simple/ pycryptodome
全称:高级加密标准(英语:Advanced Encryption Standard),属于对称加密算法。
# -*- coding: utf-8 -*-
import base64
from Crypto.Cipher import AES
class AesCrypto(object):
"""
AES加解密简单封装
暂时支持mode为'ecb'和'cbc'
默认ecb不需要指定iv,如果是cbc需要指定iv
"""
def __init__(self, mode=None, iv=None):
self.pad_size = 16
self._mode = mode
self.mode = self.get_mode()
self.iv = iv
def get_mode(self):
if self._mode is None or self._mode == "ecb":
return AES.MODE_ECB
elif self._mode == "cbc":
return AES.MODE_CBC
else:
raise Exception("暂时只支持'ecb'和'cbc'选项")
def pad(self, s):
"""补位"""
s = s + (self.pad_size - len(s) % self.pad_size) * chr(self.pad_size - len(s) % self.pad_size)
return s
@staticmethod
def un_pad(s):
"""反补位"""
s = s[:-ord(s[len(s) - 1:])]
return s
def aes_encrypt(self, key, data):
"""
AES加密
:param key: 密钥
:param data:被加密字符串(明文)
:return:密文
"""
key = key.encode('utf8')
data = self.pad(data) # 字符串补位
iv = self.iv.encode('utf8') if self.iv else None
cipher = AES.new(key, self.mode, iv) if iv else AES.new(key, self.mode)
# 加密后得到的是bytes类型的数据,使用Base64进行编码,返回byte字符串
result = cipher.encrypt(data.encode())
encodestrs = base64.b64encode(result)
enctext = encodestrs.decode('utf8')
return enctext
def aes_decrypt(self, key, data):
"""
AES解密
:param key: 密钥
:param data: 加密后的数据(密文)
:return:明文
"""
key = key.encode('utf8')
data = base64.b64decode(data)
iv = self.iv.encode('utf8') if self.iv else None
cipher = AES.new(key, self.mode, iv) if iv else AES.new(key, self.mode)
# 去补位
text_decrypted = self.un_pad(cipher.decrypt(data))
text_decrypted = text_decrypted.decode('utf8')
return text_decrypted
if __name__ == '__main__':
key_str = '37fd7f3f77d7ceae'
data_str = '{"o00o0o00o0o0o0":"eval0514undefined"}'
iv_str = '37fd7f3f77d7ceae'
# 默认ecb模式
aes = AesCrypto()
print('ecb模式')
ecdata = aes.aes_encrypt(key_str, data_str)
print(ecdata)
dedata = aes.aes_decrypt(key_str, ecdata)
print(dedata)
# 指定cbc模式
aes = AesCrypto(mode='cbc', iv=iv_str)
print('cbc模式')
ecdata = aes.aes_encrypt(key_str, data_str)
print(ecdata)
dedata = aes.aes_decrypt(key_str, ecdata)
print(dedata)
输出结果:
ecb模式
5TJ55UCcR4KL4fSUXtWAf6VB/8lHNDm4+23sWcaIchbmrRCrUcO9jWD1qtX1a9pm
{"o00o0o00o0o0o0":"eval0514undefined"}
cbc模式
8dSmgDo0FBkKYrKRwd0O9dUGhx34w0TP8xYYVTIIp9ewxT7C8jfhbq2mbE7Ns+OU
{"o00o0o00o0o0o0":"eval0514undefined"}
更多推荐
已为社区贡献2条内容
所有评论(0)