APP逆向 day5 python常见加密还原

一.前言

今天我来和大家讲一下app逆向中的常见加密,首先我们要知道,在逆向中我们会遇到各种加密,更别说app逆向了,当我们在app中遇到jjava中的各种标准算法的时候,我们要使用python进行还原,今天我就来介绍这些常见算法以及还原

tips:本期我不和大家讲原理,只讲使用(因为原理我也有很多不晓得,哈哈哈)

二.base64

base64其实并不属于算法,算法是有加密作用的,而base64只起到编码作用,而不能起到加密,目的是为了起到传输过程中避免造成不同编码造成的歧义。

import base64
# base64编码
def base64_encrypt(data):
    ret = base64.b64encode(data.encode()).decode()
    return ret  # 返回base64加密后的字符串


# 将base64字符串 进行解密成原来字符串
def base64_decrypt(data):
    data += '=' * (4 - len(data) % 4)
    ret = base64.b64decode(data)  # 返回base64解码的字符串
    return ret

三.md5和sha1

把这两个算法放一起讲,是因为他们都是摘要算法,而摘要算法的特点就是,只能加密,不能解密

# md5摘要算法
def md5_(data, yan='', fun='hex'):  # 第一个参数进行摘要算法的数据 第二个参数盐
    md5_obj = md5(yan.encode())  # 构建一个md5对象
    md5_obj.update(data.encode())
    if fun == 'hex':
        ret = md5_obj.hexdigest()  # 返回十六进制字符串
    elif fun == 'encode':
        ret = md5_obj.digest()  # 返回字节
    elif fun == 'list':
        ret = [i for i in md5_obj.digest()]  # 返回十进制列表
        # ''.join([hex(i)[2:].rjust(2,'0') for i in md5_obj.digest()]) 处理得到16进制字符串
    return ret


# sha1摘要算法
def sha1_(data, yan=''):  # 第一个参数进行摘要算法的数据 第二个参数盐
    sha1_obj = sha1(yan.encode())  # 构建一个md5对象
    sha1_obj.update(data.encode())
    ret = sha1_obj.hexdigest()
    return ret

运行结果可以看到,我这个是集成在一起了,yan指的就是他们两可以加盐,正常使用就好

四:DES

DES是一个分组加密算法,典型的DES以64位为分组对数据加密,加密和解密用的是同一个算法。它的密钥长度是56位(因为每个第8 位都用作奇偶校验),密钥可以是任意的56位的数,而且可以任意时候改变。

from Cryptodome.Cipher import DES
# des加密 一般结果都会进行base64编码处理一下,key8位
def des_encrypt(data,key):
    plaintext = pad(data.encode(),8)
    des = DES.new(key.encode(), DES.MODE_ECB)
    ciphertext = des.encrypt(plaintext)
    return ciphertext

# des解密
def des_decrypt(ciphertext,key):
    des = DES.new(key.encode(), DES.MODE_ECB)
    plaintext = des.decrypt(ciphertext)
    plaintext = unpad(plaintext,8)
    return plaintext.decode()

五.DES3

des3加密:DES3的密钥长度为168位,由于计算机运算能力的增强,原版的DES密码的密钥长度变得容易被暴力破解;而DES3通过增加DES的密钥长度来避免类似的攻击。需要注意的是,由于DES3的加密过程较为复杂,因此会占用相对较多的处理时间和计算资源。

from Crypto.Cipher import DES3
# des3加密 key是24位数的
def des3_encrypt(plaintext,key):
    key = key.encode('utf-8')
    plaintext = plaintext.encode('utf-8')
    # 填充明文
    length = 8 - (len(plaintext) % 8)
    plaintext += bytes([length]) * length
    # 初始化加密器
    cipher = DES3.new(key, DES3.MODE_CBC, b'\0' * 8)
    # 加密
    ciphertext = cipher.encrypt(plaintext)
    return ciphertext

# des3解密
def des3_decrypt(ciphertext,key):
    key = key.encode('utf-8')
    # 初始化解密器
    cipher = DES3.new(key, DES3.MODE_CBC, b'\0' * 8)
    # 解密
    plaintext = cipher.decrypt(ciphertext)
    # 去除填充
    plaintext = plaintext[:-plaintext[-1]]
    return plaintext.decode('utf-8')

 

六.AES

aes加密分为很多种,其中ecb和cbc是常见的,区别就是一个带iv一个不带这个我就不放运行截图了,密钥长度可以是128比特、192比特或256比特,对应的十六进制密钥长度分别为16字节、24字节和32字节,这里直接给代码

from Crypto.Cipher import AES
# AES-ECB 加密
def AES_ECB_encrypt(data, key, mode='pkcs7'):
    data = data.encode()
    aes = AES.new(key.encode(), AES.MODE_ECB)
    if mode == 'pkcs7':
        data = pad(data, 16)
    elif mode == 'zero':
        while len(data) % 16 != 0:
            data += b'\0'
    encrypt_data = aes.encrypt(data)
    fina_data = base64.b64encode(encrypt_data).decode()
    return fina_data


# AES-ECB 解密
def AES_ECB_decrypt(data, key):
    # 先对base64解密
    encrypt_data = base64.b64decode(data.encode())
    aes = AES.new(key.encode(), AES.MODE_ECB)
    plain_data = aes.decrypt(encrypt_data)
    return plain_data


# AES-CBC 加密
def AES_CBC_encrypt(data, key, iv, mode='pkcs7'):
    data = data.encode()
    aes = AES.new(key.encode(), AES.MODE_CBC, iv.encode())
    if mode == 'pkcs7':
        data = pad(data, 16)
    elif mode == 'zero':
        while len(data) % 16 != 0:
            data += b'\0'
    encrypt_data = aes.encrypt(data)
    fina_data = base64.b64encode(encrypt_data).decode()
    return fina_data


# AES-CBC 解密
def AES_CBC_decrypt(data, key, iv):
    encrypt_data = base64.b64decode(data)
    aes = AES.new(key.encode(), AES.MODE_CBC, iv.encode())
    plain_data = aes.decrypt(encrypt_data)
    fina_data = unpad(plain_data, 16)
    return fina_data

七.rsa加密

# RSA加密
# 返回 公钥加密、私钥解密
def createRSAkey():
    public_key, private_key = rsa.newkeys(1024)
    return public_key,private_key

# rsa公钥加密
def RSA_encrypt(data,public_key):
    ciphertext = rsa.encrypt(data.encode(), public_key)
    return ciphertext

# rsa私钥解密
def RSA_decrypt(data,private_key):
    plaintext = rsa.decrypt(data, private_key)
    return plaintext.decode()

 

八.总结 

今天我们介绍了常见加密加密,大家只要会用就行了,遇到啥用啥,就可以啦!!!

九.下期预告 

下期我就要和你们说几个简单的案例,通过这个来教你们hook和反编译工具的使用

 补充

如有需要学习资料和交流加我绿泡泡

这里插入一条广告(希望理解一下,养家糊口)!!!

有需要逆向需求或者是项目,课设等等,都能找我接单,麻烦大家了

公众号(后续会更新相关文章) 

 期待你的关注!

 

 

 

 

  • 30
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值