编辑代码


import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;

public class Main {
    public static char[] key = "18c05fdbef008d61f2e8fce4ef4457a6".toCharArray();
    // public static char[] key = "bd6e0c0f2ad33f53".toCharArray();

    public static void main(String[] args){
        String message =  "bd6e0c0f2ad33f53&Paidaojia&7.9.0&{\"channelId\":\"4051\",\"tagId\":\"51b71dcba4ba4ecb99ef9f7d7fdc9fce\",\"channelBusiness\":50,\"currentPage\":1,\"index\":1,\"ref\":\"home\",\"ctp\":\"channel\"}&HUAWEI&lechuang27&379&9bcda512b3f082f842f121ad72565171&TAS-AN00&9bcda512b3f082f842f121ad72565171&863064897682433&36.00185&36.00185&111.56576&111.56576&WIFI&lechuang27&android&7.1.2&贾墙村&900*1600&37d5df5b107f52c63cdb0295073753de&7.9.0.5&1611297054089&9bcda512b3f082f842f121ad7256517116112950555371611297054088";
        // String message = "Paidaojia&7.9.0&{\"channelId\":\"4051\",\"tagId\":\"f5689e2cba344579b7861d3ee2174837,397a17cff007405aba6392f578c762c5,41453daf4d384222bc597c36c928d584,f45b2a5117074c5080145f7d5cfa901d,1cf4b3a4ab6149ec83087c86605bd855,bd5bfd1ade0848088b12b22d770b4a81\",\"channelBusiness\":50,\"currentPage\":1,\"index\":3,\"ref\":\"home\",\"ctp\":\"channel\"}&HUAWEI&lechuang27&379&9bcda512b3f082f842f121ad72565171&TAS-AN00&9bcda512b3f082f842f121ad72565171&863064897682433&36.00185&36.00185&111.56576&111.56576&WIFI&lechuang27&android&7.1.2&贾墙村&900*1600&11aeb02675b3ad82ea3f9e37e14c3f64&7.9.0.5&1611286147094&9bcda512b3f082f842f121ad7256517116112859191161611286147093";
        for(int i = 0; i < 33; i++){
            message += ' ';
        }
        System.out.println("Message content:" + message+", len:" + message.length());
        String result = gk2(message.getBytes());
        System.out.println("result:"+result);
    }

    public static  String gk2(byte[] input){
        System.out.println("key.Len = " + key.length);
        boolean keyFlag = false;
        if(key[0] == 49){
            keyFlag = true;
        }
        int inputLen = input.length;
        if(inputLen < 33){
            System.out.println("{+}------ error -------{+}");
        }else {
            char t1, t2, t3, t4, t5, t6;
            int signStart = inputLen - 33;
            if(keyFlag){
                t1 = 48;
                t2 = 1;
                t3 = (char) (key[25] - 3);
                t4 = (char) -43;
                t5 = (char) (key[26] + 2);
                t6 = (char) -1;
                input[signStart] = (byte) (key[0] +5);
                input[signStart + 1] = (byte) (key[1] - 7);
                input[signStart + 2] = (byte) key[2];
                input[signStart + 3] = (byte) (key[3] + 52);
                input[signStart + 4] = (byte) key[4];
                input[signStart + 5] = (byte) (key[5] - 54);
                input[signStart + 6] = (byte) (key[6] - 3);
                input[signStart + 7] = (byte) (key[7] - 50);
                input[signStart + 8] = (byte) (key[8] - 2);
                input[signStart + 9] = (byte) key[9];
                input[signStart + 10] = (byte) (key[10] + 3);
                input[signStart + 11] = (byte) (key[11] + 8);
                input[signStart + 12] = (byte) (key[12] - 4);
                input[signStart + 13] = (byte) (key[13] - 47);
                input[signStart + 14] = (byte) (key[14] - 1);
                input[signStart + 15] = (byte) (key[15] + 7);
                input[signStart + 16] = (byte) (key[16] - 5);
                input[signStart + 17] = (byte) (key[17] + 52);
                input[signStart + 18] = (byte) (key[18] - 1);
                input[signStart + 19] = (byte) (key[19] + 42);
                input[signStart + 20] = (byte) (key[20] - 47);
                input[signStart + 21] = (byte) (key[21] - 50);
                input[signStart + 22] = (byte) (key[22] - 49);
                input[signStart + 23] = (byte) (key[23] - 3);
                input[signStart + 24] = (byte) (key[24] - 53);

            }else{
                t1 = 1;
                t2 = (char) -46;
                t5 = key[26];
                t6 = 4;
                t3 = (char) (key[25] + 46);
                t4 = (char) -2;
                input[signStart] = (byte) (key[0] + 3);
                input[signStart + 1] = (byte) (key[1] - 51);
                input[signStart + 2] = (byte) (key[2] + 43);
                input[signStart + 3] = (byte) key[3];
                input[signStart + 4] = (byte) key[4];
                input[signStart + 5] = (byte) (key[5] - 8);
                input[signStart + 6] = (byte) (key[6] - 5);
                input[signStart + 7] = (byte) (key[7] - 49);
                input[signStart + 8] = (byte) (key[8] + 1);
                input[signStart + 9] = (byte) key[9];
                input[signStart + 10] = (byte) (key[10] - 48);
                input[signStart + 11] = (byte) (key[11] + 3);
                input[signStart + 12] = (byte) (key[12] - 50);
                input[signStart + 13] = (byte) key[13];
                input[signStart + 14] = (byte) (key[14] - 45);
                input[signStart + 15] = (byte) (key[15] - 41);
                input[signStart + 16] = (byte) (key[16] + 46);
                input[signStart + 17] = (byte) (key[17] + 54);
                input[signStart + 18] = (byte) (key[18] - 2);
                input[signStart + 19] = (byte) (key[19] + 44);
                input[signStart + 20] = (byte) (key[20] - 44);
                input[signStart + 21] = (byte) (key[21] - 49);
                input[signStart + 22] = (byte) (key[22] - 5);
                input[signStart + 23] = (byte) (key[23] - 49);
                input[signStart + 24] = (byte) (key[24] - 5);
            }
            input[signStart+26] = (byte) t5;
            input[signStart + 25] = (byte) t3;
            input[signStart + 27] = (byte) (key[27] + t2);
            input[signStart + 28] = (byte) (key[28] + t1);
            input[signStart + 29] = (byte) (key[29] - 7);
            input[signStart + 30] = (byte) (t4 + key[30]);
            input[signStart + 32] = 0;
            input[signStart + 31] = (byte) (t6 + key[31]);
        }
        byte[] messgeBytes = new byte[inputLen - 33];
        byte[] keyBytes = new byte[32];

        System.arraycopy(input,0,messgeBytes,0,inputLen - 33);
        System.arraycopy(input,inputLen-33,keyBytes,0,32);
        String message = new String(messgeBytes);
        String newKey = new String(keyBytes);
        System.out.println("Message content:" + message+", len:" + message.length());
        System.out.println("hashKey content:" + newKey+", len:" + newKey.length());
        return sha256_HMAC(message,newKey);
    }

    private static String byteArrayToHexString(byte[] b) {
        StringBuilder hs = new StringBuilder();
        String stmp;
        for (int n = 0; b!=null && n < b.length; n++) {
            stmp = Integer.toHexString(b[n] & 0XFF);
            if (stmp.length() == 1)
                hs.append('0');
            hs.append(stmp);
        }
        return hs.toString().toLowerCase();
    }

    private static String sha256_HMAC(String message, String secret) {
        String hash = "";
        try {
            Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
            SecretKeySpec secret_key = new SecretKeySpec(secret.getBytes(), "HmacSHA256");
            sha256_HMAC.init(secret_key);
            byte[] bytes = sha256_HMAC.doFinal(message.getBytes());
            hash = byteArrayToHexString(bytes);
        } catch (Exception e) {
            System.out.println("{+}------ error -------{+}");
        }
        return hash;
    }
}