app逆向java转python代码

djy.java

public class djy {
    public static void main(String[] args) {
        C0445 c0445 = new C0445();
        String str1 = "9C0E7BB121F0";
        String str2 = "kele";
        String result = c0445.m2291RC4(str1, str2);
        System.out.println(result);
    }
}

C0445.java

public class C0445 {

    public static String m2291RC4(String str, String str2) {
        String str3 = "";
        if (!(str == null || str2 == null)) {
            try {
                byte[] hexString2Bytes = HexString2Bytes(str);
                byte[] rc4base=RC4Base(hexString2Bytes, str2);
                return new String(rc4base, "GBK");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return str3;
    }

    public static byte[] HexString2Bytes(String str) {
        try {
            int length = str.length();
            byte[] bArr = new byte[(length / 2)];
            byte[] bytes = str.getBytes("GBK");
            for (int i = 0; i < length / 2; i++) {
                int i2 = i * 2;
                bArr[i] = uniteBytes(bytes[i2], bytes[i2 + 1]);
            }
            return bArr;
        } catch (Exception e) {
            e.printStackTrace();
            return new byte[0];
        }
    }

    private static byte uniteBytes(byte b, byte b2) {
        StringBuilder sb = new StringBuilder();
        String str = "0x";
        sb.append(str);
        sb.append(new String(new byte[]{b}));
        char byteValue = (char) ((Byte.decode(sb.toString()).byteValue()) << 4);
        StringBuilder sb2 = new StringBuilder();
        sb2.append(str);
        sb2.append(new String(new byte[]{b2}));
        return (byte) (byteValue ^ (Byte.decode(sb2.toString()).byteValue()));
    }

    private static byte[] initKey(String str) {
        try {
            byte[] bytes = str.getBytes("GBK");
            byte[] bArr = new byte[256];
            for (int i = 0; i < 256; i++) {
                bArr[i] = (byte) i;
            }
            if (bytes != null) {
                if (bytes.length != 0) {
                    int i2 = 0;
                    int i3 = 0;
                    for (int i4 = 0; i4 < 256; i4++) {
                        i3 = ((bytes[i2] & 255) + (bArr[i4] & 255) + i3) & 255;
                        byte b = bArr[i4];
                        bArr[i4] = bArr[i3];
                        bArr[i3] = b;
                        i2 = (i2 + 1) % bytes.length;
                    }
                    return bArr;
                }
            }
            return null;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    private static byte[] RC4Base(byte[] bArr, String str) {
        byte[] initKey = initKey(str);
        byte[] bArr2 = new byte[bArr.length];
        int i = 0;
        int b = 0;
        for (int i2 = 0; i2 < bArr.length; i2++) {
            i = (i + 1) & 255;
            b = (((initKey[i] & 255) + b) & 255);
            byte b2 = initKey[i];
            initKey[i] = initKey[b];
            initKey[b] = b2;
            int i3 = ((initKey[i] & 255) + (initKey[b] & 255)) & 255;
            byte i3i2=  (byte) (initKey[i3] ^ bArr[i2]);
            bArr2[i2] =i3i2;
        }
        return bArr2;
    }
}

转为python之后的代码

# -*- coding: utf-8 -*-
def pb2jb(byte_arr):
    """
    python字节码转java字节码
    :param byte_arr:
    :return:
    """
    return [int(i) - 256 if int(i) > 127 else int(i) for i in byte_arr]


def uniteBytes(b, b2):
    sb = int(chr(b), 16)
    byteValue = sb << 4
    sb2 = int(chr(b2), 16)
    return byteValue ^ sb2


def strToBytes(s):
    _bytes = bytearray()
    _bytes.extend(s)
    _bytes = pb2jb(_bytes)
    return _bytes


def InitKey(str1):
    _bytes = strToBytes(str1)
    bArr = bytearray(256)
    for i in range(0, 256):
        bArr[i] = i
    i2 = 0
    i3 = 0
    for i4 in range(0, 256):
        i3 = ((_bytes[i2] & 255) + (bArr[i4] & 255) + i3) & 255
        b = bArr[i4]
        bArr[i4] = bArr[i3]
        bArr[i3] = b
        i2 = (i2 + 1) % len(_bytes)
    return pb2jb(bArr)


def jb2pd(byte_arr):
    """java 字节码转python 字节码"""
    return [int(i) + 256 if int(i) < 0 else int(i) for i in byte_arr]


def jb2str(byte_arr, encoding="gbk"):
    """
    java字节数组转string
    """
    s = ""
    for i in jb2pd(byte_arr):
        s += chr(i)
    return s.decode(encoding)


def RC4Base(bArr, str2):
    initKey = InitKey(str2)
    bArr2 = [0 for _ in range(len(bArr))]
    i = 0
    b = 0
    for i2, value in enumerate(bArr):
        i = (i + 1) & 255
        b = (((initKey[i] & 255) + b) & 255)
        b2 = initKey[i]
        initKey[i] = initKey[b]
        initKey[b] = b2
        i3 = ((initKey[i] & 255) + (initKey[b] & 255)) & 255
        ib = initKey[i3] ^ value
        bArr2[i2] = ib
    return pb2jb(bArr2)


def HexString2Bytes(_str):
    length = len(_str)
    bArr = bytearray(int(length / 2))
    _bytes = strToBytes(_str)
    for i in range(0, length / 2):
        i2 = i * 2
        bArr[i] = uniteBytes(_bytes[i2], _bytes[i2 + 1])
    return pb2jb(bArr)


class RC4helper(object):
    def decode(self, unicode_str1, str2="kele"):
        str1 = str(unicode_str1)
        hexString2Bytes = HexString2Bytes(str1)
        rc4base = RC4Base(hexString2Bytes, str2)
        return jb2str(rc4base)