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

对称加密算法

常用的对称加密算法有:

算法密钥长度工作模式工作模式
DES56/64ECB/CBC/PCBC/CTR/…NoPadding/PKCS5Padding/…
AES128/192/256ECB/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"}
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐