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;
}
}