安卓逆向中常见的加密算法

1、接口中的方法

根据调用关系,找到接口中的方法。

interface IRequest{
    public void send(String url);
}

class Context{
    public IRequest req;

    public Context(IRequest req){
        this.req = req;
    }

    public void doRequest(){
        String url = "/click/android2/"
        this.req.send(url);
    }
}

public class Hello{
    public static void main(String[] args){

    }
}

当我们通过关键字"/click/android2/"定位到了13行doRequest方法中,可以发现调用了接口中的send方法,我们可以从两个方面去思考:

  • 思路1:寻找实现了IRequest接口的类
  • 思路2:谁传入的req?

2、隐藏的字节

注意:一个汉字表示3个字节

String v4 = new String(new byte[]{-26, -83, -90, -26, -78, -101, -23, -67, -112});

3、UUID

import java.util.UUID;

public class Hello{
    public static void main(String[] args){
        String uid = UUID.randomUUID().toString();
        System.out.println(uid);
    }
}

4、随机值

import java.math.BigInteger;
import java.security.SecureRandom;

public class Hello{
    public static void main(String[] args){
        // 随机生成80位,10个字节
        BigInteger v4 = new BigInteger(80, new SecureRandom());
        // 让字节以16进制展示
        String res = v4.toString(16);
        System.out.println(res);

    }
}

在python中表示:

import random
# python中的16进制会有0x前缀,所以使用切片[2:]
open_udid = "".join([hex(i)[2:] for i in random.randbytes(10)])
print(open_udid)

5、时间戳

public class Hello{
    public static void main(String[] args){
        // 生成秒级别
        String t1 = String valueOf(System.currentTimeMillis() / 1000);
        // 生成毫秒级别
        String t2 = String valueOf(System.currentTimeMillis());

        System.out.println(t1);
        System.out.println(t2);
    }
}

6、十六进制字符串

import java.util.Arrays;

public class Hello {
    public static void main(String[] args) {
        String name = "小猪佩奇";
        byte[] nameBytes = name.getBytes();
        
        // [-27, -80, -113, -25, -116, -86, -28, -67, -87, -27, -91, -121]
        System.out.println(Arrays.toString(nameBytes));
        StringBuilder sb = new StringBuilder();
        for(int i = 0;i < nameBytes.length; i++){
            int val = nameBytes[i] & 255;           // 负数转化为正数
            if(val < 16){
                sb.append("0");
            }
            sb.append(Integer.toHexString(val));
        }
        String res = sb.toString();     // e5b08fe78caae4bda9e5a587
        System.out.println(res);
    }
}

使用python实现:

name = "小猪佩奇"

data_list = []
for item in name.encode('utf-8'):
    val = hex(item)		# 将字节转化为16进制
    data = val[2:].zfill(2)	# 去掉前缀0x, 不足两位的补上
    data_list.append(data)

result = ''.join(data_list)
print(result)

七、base64

import java.util.Base64;

public class base64 {
    public static void main(String[] args) {
        String name = "小猪佩奇";
        // 加密
        Base64.Encoder encoder = Base64.getEncoder();
        String res = encoder.encodeToString(name.getBytes());
        System.out.println(res);    // 5bCP54yq5L2p5aWH

        // 解密
        Base64.Decoder decoder = Base64.getDecoder();
        byte[] origin = decoder.decode(res);
        String data = new String(origin);
        System.out.println(data);
    }
}

用python实现:

import base64

name = "小猪佩奇"
# 加密
res = base64.b64encode(name.encode('utf-8')).decode('utf-8')
# 解密
print(base64.b64decode(res.encode('utf-8')).decode('utf-8'))

八、md5加密

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;

public class base64 {
    public static void main(String[] args) throws NoSuchAlgorithmException {
        String name = "小猪佩奇";

        MessageDigest instance = MessageDigest.getInstance("MD5");
        instance.update("xxxxxx".getBytes());               // 加盐
        byte[] nameBytes = instance.digest(name.getBytes());    // 返回字节数组

        System.out.println(Arrays.toString(nameBytes));

        String res = new String(nameBytes);
        System.out.println(res);

        // 十六进制展示
        StringBuilder sb = new StringBuilder();
        for(int i = 0;i < nameBytes.length; i++){
            int val = nameBytes[i] & 255;
            if(val < 16){
                sb.append("0");
            }
            sb.append(Integer.toHexString(val));
        }
        String hexData = sb.toString();
        System.out.println(hexData);
    }
}

用python表示为:

from hashlib import md5

name = "小猪佩奇"
obj = md5()
obj.update(name.encode('utf-8'))

res = obj.digest()      # 返回字节字符串
print(res)
res = obj.hexdigest()   # 返回的是16进制字节字符串
print(res)

九、sha-256加密

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;

public class base64 {
    public static void main(String[] args) throws NoSuchAlgorithmException {
        String name = "小猪佩奇";

        MessageDigest instance = MessageDigest.getInstance("sha-256");
        instance.update("xxxxxx".getBytes());               // 加盐
        byte[] nameBytes = instance.digest(name.getBytes());    // 返回字节数组

        System.out.println(Arrays.toString(nameBytes));

        String res = new String(nameBytes);
        System.out.println(res);

        // 十六进制展示
        StringBuilder sb = new StringBuilder();
        for(int i = 0;i < nameBytes.length; i++){
            int val = nameBytes[i] & 255;
            if(val < 16){
                sb.append("0");
            }
            sb.append(Integer.toHexString(val));
        }
        String hexData = sb.toString();
        System.out.println(hexData);
    }
}

用python表示为:

from hashlib import md5

name = "小猪佩奇"
obj = md5()
obj.update(name.encode('utf-8'))

res = obj.digest()      # 返回字节字符串
print(res)
res = obj.hexdigest()   # 返回的是16进制字节字符串
print(res)

十、aes加密

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;

public class base64 {
    public static void main(String[] args) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidAlgorithmParameterException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
        String name = "小猪佩奇";
        String key = "fd6b639dbcff0c2a1b03b389ec763c4b";
        String iv = "77b07a672d57d64c";

        // 加密
        byte[] raw = key.getBytes();
        SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
        IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes());

        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, skeySpec, ivSpec);
        byte[] encrypted = cipher.doFinal(name.getBytes());

        System.out.println(Arrays.toString(encrypted));
    }
}

用python表示为:

from Crypto.Cipher import AES
from Crypto.Util.Padding import pad

name = "小猪佩奇"
key = "fd6b639dbcff0c2a1b03b389ec763c4b"
iv = "77b07a672d57d64c"

aes = AES.new(key=key.encode('utf-8'), iv=iv.encode('utf-8'), mode=AES.MODE_CBC)
name = pad(name.encode('utf-8'), 16)
res = aes.encrypt(name)
print(res)

十一、gzip压缩

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Arrays;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;

public class base64 {
    public static void main(String[] args) throws IOException {
        // 压缩
        String name = "小猪佩奇";

        ByteArrayOutputStream v0_1 = new ByteArrayOutputStream();
        GZIPOutputStream v1 = new GZIPOutputStream((v0_1));
        v1.write(name.getBytes());
        v1.close();

        byte[] arg6 = v0_1.toByteArray();   // gzip压缩后
        System.out.println(Arrays.toString(arg6));

        // 解压缩
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        ByteArrayInputStream in = new ByteArrayInputStream(arg6);
        GZIPInputStream ungzip = new GZIPInputStream(in);
        byte[] buffer = new byte[256];
        int n;
        while((n = ungzip.read(buffer)) >= 0){
            out.write(buffer, 0, n);
        }
        byte[] res = out.toByteArray();
        System.out.println(out.toString("utf-8"));
    }
}

用python表示为:

import gzip

# 压缩
name = "小猪佩奇"
s_in = name.encode("utf-8")
s_out = gzip.compress(s_in)
print([i for i in s_out])

# 解压缩
res = gzip.decompress(s_out)
print(res)
print(res.decode('utf-8'))
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
根据提供的引用内容,我无法直接回答您的问题。引用提到了DES加密算法,它是一种对称加密算法,需要使用相同的密钥进行加密和解密。引用提到了拼多多的API解密和JS逆向安全控制实现。然而,您的问题是关于加密算法JS逆向安全控制实现的,而不是关于DES加密算法或拼多多API解密的。 对于加密算法JS逆向安全控制实现的问题,我可以提供一些一般性的信息和建议: 1. JS逆向工程:JS逆向工程是指通过分析和破解JavaScript代码来获取其内部逻辑和实现细节。这可以帮助您理解加密算法的实现方式和安全控制措施。 2. 安全控制实现:在加密算法,安全控制是指保护密钥和加密数据的措施。这包括密钥管理、访问控制、防止信息泄露等方面的措施。在实现加密算法时,需要考虑这些安全控制措施以确保数据的安全性。 3. 加密算法选择:选择适合您需求的加密算法是非常重要的。不同的加密算法具有不同的安全性和性能特点。您可以根据您的具体需求选择合适的加密算法。 4. 密钥管理:密钥管理是加密算法的一个重要方面。确保密钥的安全性和合理的密钥分发、存储和更新策略是保护加密数据的关键。 5. 安全审计和漏洞修复:定期进行安全审计和漏洞修复是保持加密算法的安全性的重要步骤。及时发现和修复潜在的安全漏洞可以防止攻击者利用这些漏洞来破解加密算法。 请注意,以上是一般性的信息和建议,具体的加密算法JS逆向安全控制实现需要根据具体情况进行详细分析和设计。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值