diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java deleted file mode 100644 index 9f89e78..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java +++ /dev/null @@ -1,420 +0,0 @@ -package com.casic.missiles.parser.safe.impl; - - -import io.netty.buffer.ByteBufUtil; -import org.apache.shiro.codec.Hex; - -public class TEA { - - public static byte[] encrypt(byte[] data, byte[] key) { - - int data_len = data.length; //数据的长度 - - if (data_len == 0) { - - return new byte[]{}; - - } - - TEA t = new TEA(); - - if (!t.setKey(key)) { - - return new byte[]{}; - - } - - int group_len = 8; - - int residues = data_len % group_len; //余数 - - int dlen = data_len - residues; - -//用于储存加密的密文,第一字节为余数的大小 - - int result_len = data_len + 1; - - if (residues > 0) { - - result_len += group_len - residues; - - } - - byte[] result = new byte[result_len]; - - result[0] = (byte) residues; - - byte[] plain = new byte[group_len]; - - byte[] enc = new byte[group_len]; - - for (int i = 0; i < dlen; i += group_len) { - - for (int j = 0; j < group_len; j++) { - - plain[j] = data[i + j]; - - } - - enc = t.encrypt_group(plain); - - for (int k = 0; k < group_len; k++) { - - result[i + k + 1] = enc[k]; - - } - - } - - if (residues > 0) { - - for (int j = 0; j < residues; j++) { - - plain[j] = data[dlen + j]; - - } - - int padding = group_len - residues; - - for (int j = 0; j < padding; j++) { - - plain[residues + j] = (byte) 0x00; - - } - - enc = t.encrypt_group(plain); - - for (int k = 0; k < group_len; k++) { - - result[dlen + k + 1] = enc[k]; - - } - - } - - return result; - - } - - public static byte[] decrypt(byte[] data, byte[] key) { - - int group_len = 8; - - if (data.length % group_len != 1) { - - return new byte[]{}; - - } - - TEA t = new TEA(); - - if (!t.setKey(key)) { - - return new byte[]{}; - - } - - int data_len = data.length - 1, dlen; //数据的长度 - - int residues = (int) (data[0]); //余数 - - if (residues > 0) { - - dlen = data_len - group_len; - - } else { - - dlen = data_len; - - } - - byte[] result = new byte[dlen + residues]; - - byte[] dec = new byte[group_len]; - - byte[] enc = new byte[group_len]; - - for (int i = 0; i < dlen; i += group_len) { - - for (int j = 0; j < group_len; j++) { - - enc[j] = data[i + j + 1]; - - } - - dec = t.decrypt_group(enc); - - for (int k = 0; k < group_len; k++) { - - result[i + k] = dec[k]; - - } - - } - - if (residues > 0) { - - for (int j = 0; j < group_len; j++) { - - enc[j] = data[dlen + j + 1]; - - } - - dec = t.decrypt_group(enc); - - for (int k = 0; k < residues; k++) { - - result[dlen + k] = dec[k]; - - } - - } - - return result; - - } - - /*** 设置密钥 - *@paramk 密钥 - *@return密钥长度为16个byte时, 设置密钥并返回true,否则返回false*/ - - public boolean setKey(byte[] k) { - - if (k.length != 16) { - - return false; - - } - - k0 = bytes_to_uint32(new byte[]{k[0], k[1], k[2], k[3]}); - - k1 = bytes_to_uint32(new byte[]{k[4], k[5], k[6], k[7]}); - - k2 = bytes_to_uint32(new byte[]{k[8], k[9], k[10], k[11]}); - - k3 = bytes_to_uint32(new byte[]{k[12], k[13], k[14], k[15]}); - - return true; - - } - - /*** 设置加密的轮数,默认为32轮 - *@paramloops 加密轮数 - *@return轮数为16、32、64时,返回true,否则返回false*/ - - public boolean setLoops(int loops) { - - switch (loops) { - - case 16: - - case 32: - - case 64: - - this.loops = loops; - - return true; - - } - - return false; - - } - - private static long UINT32_MAX = 0xFFFFFFFFL; - - private static long BYTE_1 = 0xFFL; - - private static long BYTE_2 = 0xFF00L; - - private static long BYTE_3 = 0xFF0000L; - - private static long BYTE_4 = 0xFF000000L; - - private static long delta = 0x9E3779B9L; - - private long k0, k1, k2, k3; - - private int loops = 32; - - /*** 加密一组明文 - *@paramv 需要加密的明文 - *@return返回密文*/ - - private byte[] encrypt_group(byte[] v) { - - long v0 = bytes_to_uint32(new byte[]{v[0], v[1], v[2], v[3]}); - - long v1 = bytes_to_uint32(new byte[]{v[4], v[5], v[6], v[7]}); - - long sum = 0L; - - long v0_xor_1 = 0L, v0_xor_2 = 0L, v0_xor_3 = 0L; - - long v1_xor_1 = 0L, v1_xor_2 = 0L, v1_xor_3 = 0L; - - for (int i = 0; i < loops; i++) { - - sum = toUInt32(sum + delta); - - v0_xor_1 = toUInt32(toUInt32(v1 << 4) + k0); - - v0_xor_2 = toUInt32(v1 + sum); - - v0_xor_3 = toUInt32((v1 >> 5) + k1); - - v0 = toUInt32(v0 + toUInt32(v0_xor_1 ^ v0_xor_2 ^ v0_xor_3)); - - v1_xor_1 = toUInt32(toUInt32(v0 << 4) + k2); - - v1_xor_2 = toUInt32(v0 + sum); - - v1_xor_3 = toUInt32((v0 >> 5) + k3); - - System.out.printf("%08X\t%08X\t%08X\t%08X\n", i, v0, v0 >> 5, k3); - - v1 = toUInt32(v1 + toUInt32(v1_xor_1 ^ v1_xor_2 ^ v1_xor_3)); - - } - - byte[] b0 = long_to_bytes(v0, 4); - - byte[] b1 = long_to_bytes(v1, 4); - - return new byte[]{b0[0], b0[1], b0[2], b0[3], b1[0], b1[1], b1[2], b1[3]}; - - } - - /*** 解密一组密文 - *@paramv 要解密的密文 - *@return返回明文*/ - - private byte[] decrypt_group(byte[] v) { - - long v0 = bytes_to_uint32(new byte[]{v[0], v[1], v[2], v[3]}); - - long v1 = bytes_to_uint32(new byte[]{v[4], v[5], v[6], v[7]}); - - long sum = 0xC6EF3720L, tmp = 0L; - - for (int i = 0; i < loops; i++) { - - tmp = toUInt32(toUInt32(v0 << 4) + k2); - - v1 = toUInt32(v1 - toUInt32(tmp ^ toUInt32(v0 + sum) ^ toUInt32((v0 >> 5) + k3))); - - tmp = toUInt32(toUInt32(v1 << 4) + k0); - - v0 = toUInt32(v0 - toUInt32(tmp ^ toUInt32(v1 + sum) ^ toUInt32((v1 >> 5) + k1))); - - sum = toUInt32(sum - delta); - - } - - byte[] b0 = long_to_bytes(v0, 4); - - byte[] b1 = long_to_bytes(v1, 4); - - return new byte[]{b0[0], b0[1], b0[2], b0[3], b1[0], b1[1], b1[2], b1[3]}; - - } - - /*** 将 long 类型的 n 转为 byte 数组,如果 len 为 4,则只返回低32位的4个byte - *@paramn 需要转换的long - *@paramlen 若为4,则只返回低32位的4个byte,否则返回8个byte - *@return转换后byte数组*/ - - private static byte[] long_to_bytes(long n, int len) { - - byte a = (byte) ((n & BYTE_4) >> 24); - - byte b = (byte) ((n & BYTE_3) >> 16); - - byte c = (byte) ((n & BYTE_2) >> 8); - - byte d = (byte) (n & BYTE_1); - - if (len == 4) { - - return new byte[]{a, b, c, d}; - - } - - byte ha = (byte) (n >> 56); - - byte hb = (byte) ((n >> 48) & BYTE_1); - - byte hc = (byte) ((n >> 40) & BYTE_1); - - byte hd = (byte) ((n >> 32) & BYTE_1); - - return new byte[]{ha, hb, hc, hd, a, b, c, d}; - } - - /*** 将4个byte转为 Unsigned Integer 32,以 long 形式返回 - *@parambs 需要转换的字节 - *@return返回 long,高32位为0,低32位视为Unsigned Integer*/ - - private static long bytes_to_uint32(byte[] bs) { - - return ((bs[0] << 24) & BYTE_4) + - - ((bs[1] << 16) & BYTE_3) + - - ((bs[2] << 8) & BYTE_2) + - - (bs[3] & BYTE_1); - - } - - /*** 将long的高32位清除,只保留低32位,低32位视为Unsigned Integer - *@paramn 需要清除的long - *@return返回高32位全为0的long*/ - - private static long toUInt32(long n) { - - return n & UINT32_MAX; - - } - -//-------------------------------------------------------//以下 是用于Debug的函数//------------------------------------------------------- - - private static void println_array(byte[] b) { - - for (byte x : b) { - - System.out.printf("%02X ", x); - - } - - System.out.println(); - - } - - private static void test() { - - } - - public static void main(String[] args) { - - TEA t = new TEA(); - - byte[] TEA_key = {0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66}; - t.setKey(TEA_key); - String info = "6000002000013310000050000300010160000009000102c502d1e200040000000060000511000200ec600005130002ffa56000051600020002"; - - byte[] enc = t.encrypt_group(Hex.decode(info)); - - byte[] dec = t.decrypt_group(enc); - - System.out.println("Key:" + ByteBufUtil.hexDump(TEA_key)); - - System.out.println("Encrypt And Encrypt:" + ByteBufUtil.hexDump(enc)); - - System.out.println("Encrypt And Decrypt:" + ByteBufUtil.hexDump(dec)); - - } - -} - diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java deleted file mode 100644 index 9f89e78..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java +++ /dev/null @@ -1,420 +0,0 @@ -package com.casic.missiles.parser.safe.impl; - - -import io.netty.buffer.ByteBufUtil; -import org.apache.shiro.codec.Hex; - -public class TEA { - - public static byte[] encrypt(byte[] data, byte[] key) { - - int data_len = data.length; //数据的长度 - - if (data_len == 0) { - - return new byte[]{}; - - } - - TEA t = new TEA(); - - if (!t.setKey(key)) { - - return new byte[]{}; - - } - - int group_len = 8; - - int residues = data_len % group_len; //余数 - - int dlen = data_len - residues; - -//用于储存加密的密文,第一字节为余数的大小 - - int result_len = data_len + 1; - - if (residues > 0) { - - result_len += group_len - residues; - - } - - byte[] result = new byte[result_len]; - - result[0] = (byte) residues; - - byte[] plain = new byte[group_len]; - - byte[] enc = new byte[group_len]; - - for (int i = 0; i < dlen; i += group_len) { - - for (int j = 0; j < group_len; j++) { - - plain[j] = data[i + j]; - - } - - enc = t.encrypt_group(plain); - - for (int k = 0; k < group_len; k++) { - - result[i + k + 1] = enc[k]; - - } - - } - - if (residues > 0) { - - for (int j = 0; j < residues; j++) { - - plain[j] = data[dlen + j]; - - } - - int padding = group_len - residues; - - for (int j = 0; j < padding; j++) { - - plain[residues + j] = (byte) 0x00; - - } - - enc = t.encrypt_group(plain); - - for (int k = 0; k < group_len; k++) { - - result[dlen + k + 1] = enc[k]; - - } - - } - - return result; - - } - - public static byte[] decrypt(byte[] data, byte[] key) { - - int group_len = 8; - - if (data.length % group_len != 1) { - - return new byte[]{}; - - } - - TEA t = new TEA(); - - if (!t.setKey(key)) { - - return new byte[]{}; - - } - - int data_len = data.length - 1, dlen; //数据的长度 - - int residues = (int) (data[0]); //余数 - - if (residues > 0) { - - dlen = data_len - group_len; - - } else { - - dlen = data_len; - - } - - byte[] result = new byte[dlen + residues]; - - byte[] dec = new byte[group_len]; - - byte[] enc = new byte[group_len]; - - for (int i = 0; i < dlen; i += group_len) { - - for (int j = 0; j < group_len; j++) { - - enc[j] = data[i + j + 1]; - - } - - dec = t.decrypt_group(enc); - - for (int k = 0; k < group_len; k++) { - - result[i + k] = dec[k]; - - } - - } - - if (residues > 0) { - - for (int j = 0; j < group_len; j++) { - - enc[j] = data[dlen + j + 1]; - - } - - dec = t.decrypt_group(enc); - - for (int k = 0; k < residues; k++) { - - result[dlen + k] = dec[k]; - - } - - } - - return result; - - } - - /*** 设置密钥 - *@paramk 密钥 - *@return密钥长度为16个byte时, 设置密钥并返回true,否则返回false*/ - - public boolean setKey(byte[] k) { - - if (k.length != 16) { - - return false; - - } - - k0 = bytes_to_uint32(new byte[]{k[0], k[1], k[2], k[3]}); - - k1 = bytes_to_uint32(new byte[]{k[4], k[5], k[6], k[7]}); - - k2 = bytes_to_uint32(new byte[]{k[8], k[9], k[10], k[11]}); - - k3 = bytes_to_uint32(new byte[]{k[12], k[13], k[14], k[15]}); - - return true; - - } - - /*** 设置加密的轮数,默认为32轮 - *@paramloops 加密轮数 - *@return轮数为16、32、64时,返回true,否则返回false*/ - - public boolean setLoops(int loops) { - - switch (loops) { - - case 16: - - case 32: - - case 64: - - this.loops = loops; - - return true; - - } - - return false; - - } - - private static long UINT32_MAX = 0xFFFFFFFFL; - - private static long BYTE_1 = 0xFFL; - - private static long BYTE_2 = 0xFF00L; - - private static long BYTE_3 = 0xFF0000L; - - private static long BYTE_4 = 0xFF000000L; - - private static long delta = 0x9E3779B9L; - - private long k0, k1, k2, k3; - - private int loops = 32; - - /*** 加密一组明文 - *@paramv 需要加密的明文 - *@return返回密文*/ - - private byte[] encrypt_group(byte[] v) { - - long v0 = bytes_to_uint32(new byte[]{v[0], v[1], v[2], v[3]}); - - long v1 = bytes_to_uint32(new byte[]{v[4], v[5], v[6], v[7]}); - - long sum = 0L; - - long v0_xor_1 = 0L, v0_xor_2 = 0L, v0_xor_3 = 0L; - - long v1_xor_1 = 0L, v1_xor_2 = 0L, v1_xor_3 = 0L; - - for (int i = 0; i < loops; i++) { - - sum = toUInt32(sum + delta); - - v0_xor_1 = toUInt32(toUInt32(v1 << 4) + k0); - - v0_xor_2 = toUInt32(v1 + sum); - - v0_xor_3 = toUInt32((v1 >> 5) + k1); - - v0 = toUInt32(v0 + toUInt32(v0_xor_1 ^ v0_xor_2 ^ v0_xor_3)); - - v1_xor_1 = toUInt32(toUInt32(v0 << 4) + k2); - - v1_xor_2 = toUInt32(v0 + sum); - - v1_xor_3 = toUInt32((v0 >> 5) + k3); - - System.out.printf("%08X\t%08X\t%08X\t%08X\n", i, v0, v0 >> 5, k3); - - v1 = toUInt32(v1 + toUInt32(v1_xor_1 ^ v1_xor_2 ^ v1_xor_3)); - - } - - byte[] b0 = long_to_bytes(v0, 4); - - byte[] b1 = long_to_bytes(v1, 4); - - return new byte[]{b0[0], b0[1], b0[2], b0[3], b1[0], b1[1], b1[2], b1[3]}; - - } - - /*** 解密一组密文 - *@paramv 要解密的密文 - *@return返回明文*/ - - private byte[] decrypt_group(byte[] v) { - - long v0 = bytes_to_uint32(new byte[]{v[0], v[1], v[2], v[3]}); - - long v1 = bytes_to_uint32(new byte[]{v[4], v[5], v[6], v[7]}); - - long sum = 0xC6EF3720L, tmp = 0L; - - for (int i = 0; i < loops; i++) { - - tmp = toUInt32(toUInt32(v0 << 4) + k2); - - v1 = toUInt32(v1 - toUInt32(tmp ^ toUInt32(v0 + sum) ^ toUInt32((v0 >> 5) + k3))); - - tmp = toUInt32(toUInt32(v1 << 4) + k0); - - v0 = toUInt32(v0 - toUInt32(tmp ^ toUInt32(v1 + sum) ^ toUInt32((v1 >> 5) + k1))); - - sum = toUInt32(sum - delta); - - } - - byte[] b0 = long_to_bytes(v0, 4); - - byte[] b1 = long_to_bytes(v1, 4); - - return new byte[]{b0[0], b0[1], b0[2], b0[3], b1[0], b1[1], b1[2], b1[3]}; - - } - - /*** 将 long 类型的 n 转为 byte 数组,如果 len 为 4,则只返回低32位的4个byte - *@paramn 需要转换的long - *@paramlen 若为4,则只返回低32位的4个byte,否则返回8个byte - *@return转换后byte数组*/ - - private static byte[] long_to_bytes(long n, int len) { - - byte a = (byte) ((n & BYTE_4) >> 24); - - byte b = (byte) ((n & BYTE_3) >> 16); - - byte c = (byte) ((n & BYTE_2) >> 8); - - byte d = (byte) (n & BYTE_1); - - if (len == 4) { - - return new byte[]{a, b, c, d}; - - } - - byte ha = (byte) (n >> 56); - - byte hb = (byte) ((n >> 48) & BYTE_1); - - byte hc = (byte) ((n >> 40) & BYTE_1); - - byte hd = (byte) ((n >> 32) & BYTE_1); - - return new byte[]{ha, hb, hc, hd, a, b, c, d}; - } - - /*** 将4个byte转为 Unsigned Integer 32,以 long 形式返回 - *@parambs 需要转换的字节 - *@return返回 long,高32位为0,低32位视为Unsigned Integer*/ - - private static long bytes_to_uint32(byte[] bs) { - - return ((bs[0] << 24) & BYTE_4) + - - ((bs[1] << 16) & BYTE_3) + - - ((bs[2] << 8) & BYTE_2) + - - (bs[3] & BYTE_1); - - } - - /*** 将long的高32位清除,只保留低32位,低32位视为Unsigned Integer - *@paramn 需要清除的long - *@return返回高32位全为0的long*/ - - private static long toUInt32(long n) { - - return n & UINT32_MAX; - - } - -//-------------------------------------------------------//以下 是用于Debug的函数//------------------------------------------------------- - - private static void println_array(byte[] b) { - - for (byte x : b) { - - System.out.printf("%02X ", x); - - } - - System.out.println(); - - } - - private static void test() { - - } - - public static void main(String[] args) { - - TEA t = new TEA(); - - byte[] TEA_key = {0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66}; - t.setKey(TEA_key); - String info = "6000002000013310000050000300010160000009000102c502d1e200040000000060000511000200ec600005130002ffa56000051600020002"; - - byte[] enc = t.encrypt_group(Hex.decode(info)); - - byte[] dec = t.decrypt_group(enc); - - System.out.println("Key:" + ByteBufUtil.hexDump(TEA_key)); - - System.out.println("Encrypt And Encrypt:" + ByteBufUtil.hexDump(enc)); - - System.out.println("Encrypt And Decrypt:" + ByteBufUtil.hexDump(dec)); - - } - -} - diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtils.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtils.java deleted file mode 100644 index 5f248bb..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtils.java +++ /dev/null @@ -1,348 +0,0 @@ -package com.casic.missiles.parser.safe.impl; - -import org.bouncycastle.pqc.math.linearalgebra.ByteUtils; - -import java.util.Arrays; - -/** - * @author: wxy - */ -public class TeaUtils { - private static long UINT32_MAX = 0xFFFFFFFFL; - private static long BYTE_1 = 0xFFL; - private static long BYTE_2 = 0xFF00L; - private static long BYTE_3 = 0xFF0000L; - private static long BYTE_4 = 0xFF000000L; - - private static long delta = 0x9E3779B9L; - - private long k0, k1, k2, k3; - - private int loops = 32; - - - public byte[] encrypt(byte[] data) { - int data_len = data.length; // 数据的长度 - if (data_len == 0) {//输入数据长度为0 - return new byte[] {}; - } - int group_len = 8; - int residues = data_len % group_len; // 余数 - int dlen = data_len - residues; - - // 用于储存加密的密文,第一字节为余数的大小 - int result_len = data_len; - if (residues > 0) { - result_len += group_len - residues; - } - byte[] result = new byte[result_len]; - - byte[] plain = new byte[group_len]; - byte[] enc = new byte[group_len]; - - for (int i = 0; i < dlen; i += group_len) { - for (int j = 0; j < group_len; j++) { - plain[j] = data[i + j]; - } - enc = encrypt_group(plain); - for (int k = 0; k < group_len; k++) { - result[i + k ] = enc[k]; - } - } - if (residues > 0) { - for (int j = 0; j < residues; j++) { - plain[j] = data[dlen + j]; - } - int padding = group_len - residues; - for (int j = 0; j < padding; j++) { - plain[residues + j] = (byte)0x00; - } - enc = encrypt_group(plain); - for (int k = 0; k < group_len; k++) { - result[dlen + k ] = enc[k]; - } - } - return result; - } - - public byte[] decrypt(byte[] data) { - int group_len = 8; -// if (data.length % group_len != 1) { -// return new byte[] {}; -// } - int data_len = data.length, dlen; // 数据的长度 - int residues = data.length % group_len; // 余数 - if (residues > 0) { - dlen = data_len - group_len; - } else { - dlen = data_len; - } - - byte[] result = new byte[dlen + residues]; - - byte[] dec = new byte[group_len]; - byte[] enc = new byte[group_len]; - for (int i = 0; i < dlen; i += group_len) { - for (int j = 0; j < group_len; j++) { - enc[j] = data[i + j]; - } - dec = decrypt_group(enc); - for (int k = 0; k < group_len; k++) { - result[i + k] = dec[k]; - } - } - if (residues > 0) { - for (int j = 0; j < group_len; j++) { - enc[j] = data[dlen + j + 1]; - } - dec = decrypt_group(enc); - for (int k = 0; k < residues; k++) { - result[dlen + k] = dec[k]; - } - } - return result; - } - - /** - * 设置密钥 - * @param k 密钥 - * @return 密钥长度为16个byte时, 设置密钥并返回true,否则返回false - */ - public boolean setKey(byte[] k) { - if (k.length != 16) { - return false; - } - k0 = bytes_to_uint32(new byte[] {k[0], k[1], k[2], k[3]}); - k1 = bytes_to_uint32(new byte[] {k[4], k[5], k[6], k[7]}); - k2 = bytes_to_uint32(new byte[] {k[8], k[9], k[10], k[11]}); - k3 = bytes_to_uint32(new byte[] {k[12], k[13], k[14], k[15]}); - return true; - } - - /** - * 设置加密的轮数,默认为32轮 - * @param loops 加密轮数 - * @return 轮数为16、32、64时,返回true,否则返回false - */ - public boolean setLoops(int loops) { - switch (loops) { - case 16: - case 32: - case 64: - this.loops = loops; - return true; - } - return false; - } - - - /** - * 加密一组明文 - * @param v 需要加密的明文 - * @return 返回密文 - */ - private byte[] encrypt_group(byte[] v) { - long v0 = bytes_to_uint32(new byte[] {v[0], v[1], v[2], v[3]}); - long v1 = bytes_to_uint32(new byte[] {v[4], v[5], v[6], v[7]}); - long sum = 0L; - long v0_xor_1 = 0L, v0_xor_2 = 0L, v0_xor_3 = 0L; - long v1_xor_1 = 0L, v1_xor_2 = 0L, v1_xor_3 = 0L; - for (int i = 0; i < loops; i++) { - sum = toUInt32(sum + delta); - v0_xor_1 = toUInt32(toUInt32(v1 << 4) + k0); - v0_xor_2 = toUInt32(v1 + sum); - v0_xor_3 = toUInt32((v1 >> 5) + k1); - v0 = toUInt32( v0 + toUInt32(v0_xor_1 ^ v0_xor_2 ^ v0_xor_3) ); - v1_xor_1 = toUInt32(toUInt32(v0 << 4) + k2); - v1_xor_2 = toUInt32(v0 + sum); - v1_xor_3 = toUInt32((v0 >> 5) + k3); -// System.out.printf("%08X\t%08X\t%08X\t%08X\n", i, v0, v0 >> 5, k3); - v1 = toUInt32( v1 + toUInt32(v1_xor_1 ^ v1_xor_2 ^ v1_xor_3) ); - } - byte[] b0 = long_to_bytes(v0, 4); - byte[] b1 = long_to_bytes(v1, 4); - return new byte[] {b0[0], b0[1], b0[2], b0[3], b1[0], b1[1], b1[2], b1[3]}; - } - - /** - * 解密一组密文 - * @param v 要解密的密文 - * @return 返回明文 - */ - public byte[] decrypt_group(byte[] v) { - long v0 = bytes_to_uint32(new byte[] {v[0], v[1], v[2], v[3]}); - long v1 = bytes_to_uint32(new byte[] {v[4], v[5], v[6], v[7]}); - long sum = 0xC6EF3720L, tmp = 0L; - for (int i = 0; i < loops; i++) { - tmp = toUInt32(toUInt32(v0 << 4) + k2); - v1 = toUInt32( v1 - toUInt32(tmp ^ toUInt32(v0 + sum) ^ toUInt32((v0 >> 5) + k3)) ); - tmp = toUInt32(toUInt32(v1 << 4) + k0); - v0 = toUInt32( v0 - toUInt32(tmp ^ toUInt32(v1 + sum) ^ toUInt32((v1 >> 5) + k1)) ); - sum = toUInt32(sum - delta); - } - byte[] b0 = long_to_bytes(v0, 4); - byte[] b1 = long_to_bytes(v1, 4); - return new byte[] {b0[0], b0[1], b0[2], b0[3], b1[0], b1[1], b1[2], b1[3]}; - } - - - /** - * 将 long 类型的 n 转为 byte 数组,如果 len 为 4,则只返回低32位的4个byte - * @param n 需要转换的long - * @param len 若为4,则只返回低32位的4个byte,否则返回8个byte - * @return 转换后byte数组 - */ - private static byte[] long_to_bytes(long n, int len) { - byte a = (byte)((n & BYTE_4) >> 24); - byte b = (byte)((n & BYTE_3) >> 16); - byte c = (byte)((n & BYTE_2) >> 8); - byte d = (byte)(n & BYTE_1); - if (len == 4) { - return new byte[] {a, b, c, d}; - } - byte ha = (byte)(n >> 56); - byte hb = (byte)((n >> 48) & BYTE_1); - byte hc = (byte)((n >> 40) & BYTE_1); - byte hd = (byte)((n >> 32) & BYTE_1); - return new byte[] {ha, hb, hc, hd, a, b, c, d}; - } - - /** - * 将4个byte转为 Unsigned Integer 32,以 long 形式返回 - * @param bs 需要转换的字节 - * @return 返回 long,高32位为0,低32位视为Unsigned Integer - */ - private static long bytes_to_uint32(byte[] bs) { - return ((bs[0]<<24) & BYTE_4) + - ((bs[1]<<16) & BYTE_3) + - ((bs[2]<<8) & BYTE_2) + - (bs[3] & BYTE_1); - } - - /** - * 将long的高32位清除,只保留低32位,低32位视为Unsigned Integer - * @param n 需要清除的long - * @return 返回高32位全为0的long - */ - private static long toUInt32(long n) { - return n & UINT32_MAX; - } - - - // ------------------------------------------------------- - // 以下 是用于Debug的函数 - // ------------------------------------------------------- - private static void println_array(byte[] b) { - for (byte x : b) { - System.out.printf("%02X ", x); - } - System.out.println(); - } - /*private static void println_array(long[] b) { - for (long x : b) { - System.out.printf("%016X ", x); - } - System.out.println(); - }*/ - - /** - * 以8个字节为单位进行顺序调整 - * @param src - * @return - */ - public static byte[] reverseBytesBy8(byte[] src){ - int data_len = src.length; - int group_len = 8; - int residues = data_len % group_len; // 余数 - int dlen = data_len; - if(residues!=0){ - dlen = data_len + (8-residues); - } -// System.out.println("新数据长度:"+dlen); - byte[] result = new byte[dlen]; - for (int i = 0; i < src.length; i+=4) { - for(int j=0;j<4;j+=1){ - if((i + 3 - j)>=data_len){ - result[i + j] = 0x00; - }else { - result[i + j] = src[i + 3 - j]; - } - } - } - return result; - } - - public static void main(String[] args) { -// byte[] bs = new byte[] {(byte)0xFF, (byte)0xEE, (byte)0xDD, (byte)0xCC}; -// System.out.printf("%016X\n", bytes_to_uint32(bs)); -// System.out.println(bytes_to_uint32(bs)); -// -// - String info = "oyAAE0EgGAYAAgMAAgSGAV53zuugXOYSih4="; - info = "1806EEF00C28711D2B74E59ABEAB7808"; - info = "1806EEF00C28711D2B74E59ABEAB7808"; - //System.out.println("原数据:" + info); - byte[] temps = ByteUtils.fromHexString(info); - byte[] temp = temps; - byte[] reverse = TeaUtils.reverseBytesBy8(temp); - System.out.println("待解密:"+ ByteUtils.toBinaryString(temp)); - System.out.println("待解密:"+ ByteUtils.toBinaryString(reverse)); - System.out.print("待解密:"); - TeaUtils.println_array(reverse); - - TeaUtils t = new TeaUtils(); - byte[] pnt = new byte[] { - (byte)0xc7,0x00, 0x00, 0x00, - 0x00, 0x01, 0x00 - }; - byte[] k = new byte[] { - 0x33, 0x32, 0x31, 0x30 , - 0x37, 0x36, 0x35, 0x34, - 0x62, 0x61, 0x39, 0x38, - 0x66, 0x65, 0x64, 0x63 - }; -// k = new byte[] { -// 0x30, 0x30, 0x30, 0x30 , -// 0x30, 0x30, 0x30, 0x30, -// 0x30, 0x30, 0x30, 0x30, -// 0x30, 0x30, 0x30, 0x30 -// }; - t.setKey(k); -// byte[] enc = t.encrypt(v, k); -// byte[] dec = t.decrypt(enc, k); - pnt = TeaUtils.reverseBytesBy8(pnt); - byte[] enc = t.encrypt(pnt);//加密 - //byte[] enc = new byte[] {(byte) 0xC1, (byte) 0xC6, 0x48, 0x7A, (byte) 0x9E, 0x6F, (byte) 0xF2, 0x56}; - reverse = TeaUtils.reverseBytesBy8(enc); -// reverse = TeaUtils.reverseBytesBy8(enc); -// reverse = enc; -// reverse = enc; - byte[] dec = t.decrypt(reverse);//解密 - byte[] reverse_dec = TeaUtils.reverseBytesBy8(dec); - - //println_array(v_from_byte_to_long(new byte[]{ 0x7F, 0x1E, 0x55, 0x56, 0x32, 0x35, 0x65, 0x78 })); - //println_array(k_from_byte_to_long(new byte[]{ 0x7F, 0x1E, 0x55, 0x56, 0x32, 0x35, 0x65, 0x78, 0x6F, 0x1E, 0x55, 0x56, 0x32, 0x35, 0x65, 0x78 })); - //println_array(long_to_bytes((long)0x7E987654, 8)); - //byte b = (byte)0xEF; - //println_array(new long[] { (b << 24) & 0xFF000000L } ); - //println_array(new long[] {(byte)0xEF}); - -// String[] plain = new String[32]; -// for (i = 0; i < 32; i++) { -// plain[i] = String. -// } -// byte[] pnt = "123".getBytes(); -// byte[] enc = encrypt(pnt, k); -// byte[] dec = decrypt(enc, k); - - System.out.println("Key:"); - println_array(k); - - System.out.println("Encrypt And Decrypt:"); - println_array(pnt);//待加密数据 - println_array(reverse); - println_array(enc); - println_array(reverse_dec); - } - -} \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java deleted file mode 100644 index 9f89e78..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java +++ /dev/null @@ -1,420 +0,0 @@ -package com.casic.missiles.parser.safe.impl; - - -import io.netty.buffer.ByteBufUtil; -import org.apache.shiro.codec.Hex; - -public class TEA { - - public static byte[] encrypt(byte[] data, byte[] key) { - - int data_len = data.length; //数据的长度 - - if (data_len == 0) { - - return new byte[]{}; - - } - - TEA t = new TEA(); - - if (!t.setKey(key)) { - - return new byte[]{}; - - } - - int group_len = 8; - - int residues = data_len % group_len; //余数 - - int dlen = data_len - residues; - -//用于储存加密的密文,第一字节为余数的大小 - - int result_len = data_len + 1; - - if (residues > 0) { - - result_len += group_len - residues; - - } - - byte[] result = new byte[result_len]; - - result[0] = (byte) residues; - - byte[] plain = new byte[group_len]; - - byte[] enc = new byte[group_len]; - - for (int i = 0; i < dlen; i += group_len) { - - for (int j = 0; j < group_len; j++) { - - plain[j] = data[i + j]; - - } - - enc = t.encrypt_group(plain); - - for (int k = 0; k < group_len; k++) { - - result[i + k + 1] = enc[k]; - - } - - } - - if (residues > 0) { - - for (int j = 0; j < residues; j++) { - - plain[j] = data[dlen + j]; - - } - - int padding = group_len - residues; - - for (int j = 0; j < padding; j++) { - - plain[residues + j] = (byte) 0x00; - - } - - enc = t.encrypt_group(plain); - - for (int k = 0; k < group_len; k++) { - - result[dlen + k + 1] = enc[k]; - - } - - } - - return result; - - } - - public static byte[] decrypt(byte[] data, byte[] key) { - - int group_len = 8; - - if (data.length % group_len != 1) { - - return new byte[]{}; - - } - - TEA t = new TEA(); - - if (!t.setKey(key)) { - - return new byte[]{}; - - } - - int data_len = data.length - 1, dlen; //数据的长度 - - int residues = (int) (data[0]); //余数 - - if (residues > 0) { - - dlen = data_len - group_len; - - } else { - - dlen = data_len; - - } - - byte[] result = new byte[dlen + residues]; - - byte[] dec = new byte[group_len]; - - byte[] enc = new byte[group_len]; - - for (int i = 0; i < dlen; i += group_len) { - - for (int j = 0; j < group_len; j++) { - - enc[j] = data[i + j + 1]; - - } - - dec = t.decrypt_group(enc); - - for (int k = 0; k < group_len; k++) { - - result[i + k] = dec[k]; - - } - - } - - if (residues > 0) { - - for (int j = 0; j < group_len; j++) { - - enc[j] = data[dlen + j + 1]; - - } - - dec = t.decrypt_group(enc); - - for (int k = 0; k < residues; k++) { - - result[dlen + k] = dec[k]; - - } - - } - - return result; - - } - - /*** 设置密钥 - *@paramk 密钥 - *@return密钥长度为16个byte时, 设置密钥并返回true,否则返回false*/ - - public boolean setKey(byte[] k) { - - if (k.length != 16) { - - return false; - - } - - k0 = bytes_to_uint32(new byte[]{k[0], k[1], k[2], k[3]}); - - k1 = bytes_to_uint32(new byte[]{k[4], k[5], k[6], k[7]}); - - k2 = bytes_to_uint32(new byte[]{k[8], k[9], k[10], k[11]}); - - k3 = bytes_to_uint32(new byte[]{k[12], k[13], k[14], k[15]}); - - return true; - - } - - /*** 设置加密的轮数,默认为32轮 - *@paramloops 加密轮数 - *@return轮数为16、32、64时,返回true,否则返回false*/ - - public boolean setLoops(int loops) { - - switch (loops) { - - case 16: - - case 32: - - case 64: - - this.loops = loops; - - return true; - - } - - return false; - - } - - private static long UINT32_MAX = 0xFFFFFFFFL; - - private static long BYTE_1 = 0xFFL; - - private static long BYTE_2 = 0xFF00L; - - private static long BYTE_3 = 0xFF0000L; - - private static long BYTE_4 = 0xFF000000L; - - private static long delta = 0x9E3779B9L; - - private long k0, k1, k2, k3; - - private int loops = 32; - - /*** 加密一组明文 - *@paramv 需要加密的明文 - *@return返回密文*/ - - private byte[] encrypt_group(byte[] v) { - - long v0 = bytes_to_uint32(new byte[]{v[0], v[1], v[2], v[3]}); - - long v1 = bytes_to_uint32(new byte[]{v[4], v[5], v[6], v[7]}); - - long sum = 0L; - - long v0_xor_1 = 0L, v0_xor_2 = 0L, v0_xor_3 = 0L; - - long v1_xor_1 = 0L, v1_xor_2 = 0L, v1_xor_3 = 0L; - - for (int i = 0; i < loops; i++) { - - sum = toUInt32(sum + delta); - - v0_xor_1 = toUInt32(toUInt32(v1 << 4) + k0); - - v0_xor_2 = toUInt32(v1 + sum); - - v0_xor_3 = toUInt32((v1 >> 5) + k1); - - v0 = toUInt32(v0 + toUInt32(v0_xor_1 ^ v0_xor_2 ^ v0_xor_3)); - - v1_xor_1 = toUInt32(toUInt32(v0 << 4) + k2); - - v1_xor_2 = toUInt32(v0 + sum); - - v1_xor_3 = toUInt32((v0 >> 5) + k3); - - System.out.printf("%08X\t%08X\t%08X\t%08X\n", i, v0, v0 >> 5, k3); - - v1 = toUInt32(v1 + toUInt32(v1_xor_1 ^ v1_xor_2 ^ v1_xor_3)); - - } - - byte[] b0 = long_to_bytes(v0, 4); - - byte[] b1 = long_to_bytes(v1, 4); - - return new byte[]{b0[0], b0[1], b0[2], b0[3], b1[0], b1[1], b1[2], b1[3]}; - - } - - /*** 解密一组密文 - *@paramv 要解密的密文 - *@return返回明文*/ - - private byte[] decrypt_group(byte[] v) { - - long v0 = bytes_to_uint32(new byte[]{v[0], v[1], v[2], v[3]}); - - long v1 = bytes_to_uint32(new byte[]{v[4], v[5], v[6], v[7]}); - - long sum = 0xC6EF3720L, tmp = 0L; - - for (int i = 0; i < loops; i++) { - - tmp = toUInt32(toUInt32(v0 << 4) + k2); - - v1 = toUInt32(v1 - toUInt32(tmp ^ toUInt32(v0 + sum) ^ toUInt32((v0 >> 5) + k3))); - - tmp = toUInt32(toUInt32(v1 << 4) + k0); - - v0 = toUInt32(v0 - toUInt32(tmp ^ toUInt32(v1 + sum) ^ toUInt32((v1 >> 5) + k1))); - - sum = toUInt32(sum - delta); - - } - - byte[] b0 = long_to_bytes(v0, 4); - - byte[] b1 = long_to_bytes(v1, 4); - - return new byte[]{b0[0], b0[1], b0[2], b0[3], b1[0], b1[1], b1[2], b1[3]}; - - } - - /*** 将 long 类型的 n 转为 byte 数组,如果 len 为 4,则只返回低32位的4个byte - *@paramn 需要转换的long - *@paramlen 若为4,则只返回低32位的4个byte,否则返回8个byte - *@return转换后byte数组*/ - - private static byte[] long_to_bytes(long n, int len) { - - byte a = (byte) ((n & BYTE_4) >> 24); - - byte b = (byte) ((n & BYTE_3) >> 16); - - byte c = (byte) ((n & BYTE_2) >> 8); - - byte d = (byte) (n & BYTE_1); - - if (len == 4) { - - return new byte[]{a, b, c, d}; - - } - - byte ha = (byte) (n >> 56); - - byte hb = (byte) ((n >> 48) & BYTE_1); - - byte hc = (byte) ((n >> 40) & BYTE_1); - - byte hd = (byte) ((n >> 32) & BYTE_1); - - return new byte[]{ha, hb, hc, hd, a, b, c, d}; - } - - /*** 将4个byte转为 Unsigned Integer 32,以 long 形式返回 - *@parambs 需要转换的字节 - *@return返回 long,高32位为0,低32位视为Unsigned Integer*/ - - private static long bytes_to_uint32(byte[] bs) { - - return ((bs[0] << 24) & BYTE_4) + - - ((bs[1] << 16) & BYTE_3) + - - ((bs[2] << 8) & BYTE_2) + - - (bs[3] & BYTE_1); - - } - - /*** 将long的高32位清除,只保留低32位,低32位视为Unsigned Integer - *@paramn 需要清除的long - *@return返回高32位全为0的long*/ - - private static long toUInt32(long n) { - - return n & UINT32_MAX; - - } - -//-------------------------------------------------------//以下 是用于Debug的函数//------------------------------------------------------- - - private static void println_array(byte[] b) { - - for (byte x : b) { - - System.out.printf("%02X ", x); - - } - - System.out.println(); - - } - - private static void test() { - - } - - public static void main(String[] args) { - - TEA t = new TEA(); - - byte[] TEA_key = {0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66}; - t.setKey(TEA_key); - String info = "6000002000013310000050000300010160000009000102c502d1e200040000000060000511000200ec600005130002ffa56000051600020002"; - - byte[] enc = t.encrypt_group(Hex.decode(info)); - - byte[] dec = t.decrypt_group(enc); - - System.out.println("Key:" + ByteBufUtil.hexDump(TEA_key)); - - System.out.println("Encrypt And Encrypt:" + ByteBufUtil.hexDump(enc)); - - System.out.println("Encrypt And Decrypt:" + ByteBufUtil.hexDump(dec)); - - } - -} - diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtils.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtils.java deleted file mode 100644 index 5f248bb..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtils.java +++ /dev/null @@ -1,348 +0,0 @@ -package com.casic.missiles.parser.safe.impl; - -import org.bouncycastle.pqc.math.linearalgebra.ByteUtils; - -import java.util.Arrays; - -/** - * @author: wxy - */ -public class TeaUtils { - private static long UINT32_MAX = 0xFFFFFFFFL; - private static long BYTE_1 = 0xFFL; - private static long BYTE_2 = 0xFF00L; - private static long BYTE_3 = 0xFF0000L; - private static long BYTE_4 = 0xFF000000L; - - private static long delta = 0x9E3779B9L; - - private long k0, k1, k2, k3; - - private int loops = 32; - - - public byte[] encrypt(byte[] data) { - int data_len = data.length; // 数据的长度 - if (data_len == 0) {//输入数据长度为0 - return new byte[] {}; - } - int group_len = 8; - int residues = data_len % group_len; // 余数 - int dlen = data_len - residues; - - // 用于储存加密的密文,第一字节为余数的大小 - int result_len = data_len; - if (residues > 0) { - result_len += group_len - residues; - } - byte[] result = new byte[result_len]; - - byte[] plain = new byte[group_len]; - byte[] enc = new byte[group_len]; - - for (int i = 0; i < dlen; i += group_len) { - for (int j = 0; j < group_len; j++) { - plain[j] = data[i + j]; - } - enc = encrypt_group(plain); - for (int k = 0; k < group_len; k++) { - result[i + k ] = enc[k]; - } - } - if (residues > 0) { - for (int j = 0; j < residues; j++) { - plain[j] = data[dlen + j]; - } - int padding = group_len - residues; - for (int j = 0; j < padding; j++) { - plain[residues + j] = (byte)0x00; - } - enc = encrypt_group(plain); - for (int k = 0; k < group_len; k++) { - result[dlen + k ] = enc[k]; - } - } - return result; - } - - public byte[] decrypt(byte[] data) { - int group_len = 8; -// if (data.length % group_len != 1) { -// return new byte[] {}; -// } - int data_len = data.length, dlen; // 数据的长度 - int residues = data.length % group_len; // 余数 - if (residues > 0) { - dlen = data_len - group_len; - } else { - dlen = data_len; - } - - byte[] result = new byte[dlen + residues]; - - byte[] dec = new byte[group_len]; - byte[] enc = new byte[group_len]; - for (int i = 0; i < dlen; i += group_len) { - for (int j = 0; j < group_len; j++) { - enc[j] = data[i + j]; - } - dec = decrypt_group(enc); - for (int k = 0; k < group_len; k++) { - result[i + k] = dec[k]; - } - } - if (residues > 0) { - for (int j = 0; j < group_len; j++) { - enc[j] = data[dlen + j + 1]; - } - dec = decrypt_group(enc); - for (int k = 0; k < residues; k++) { - result[dlen + k] = dec[k]; - } - } - return result; - } - - /** - * 设置密钥 - * @param k 密钥 - * @return 密钥长度为16个byte时, 设置密钥并返回true,否则返回false - */ - public boolean setKey(byte[] k) { - if (k.length != 16) { - return false; - } - k0 = bytes_to_uint32(new byte[] {k[0], k[1], k[2], k[3]}); - k1 = bytes_to_uint32(new byte[] {k[4], k[5], k[6], k[7]}); - k2 = bytes_to_uint32(new byte[] {k[8], k[9], k[10], k[11]}); - k3 = bytes_to_uint32(new byte[] {k[12], k[13], k[14], k[15]}); - return true; - } - - /** - * 设置加密的轮数,默认为32轮 - * @param loops 加密轮数 - * @return 轮数为16、32、64时,返回true,否则返回false - */ - public boolean setLoops(int loops) { - switch (loops) { - case 16: - case 32: - case 64: - this.loops = loops; - return true; - } - return false; - } - - - /** - * 加密一组明文 - * @param v 需要加密的明文 - * @return 返回密文 - */ - private byte[] encrypt_group(byte[] v) { - long v0 = bytes_to_uint32(new byte[] {v[0], v[1], v[2], v[3]}); - long v1 = bytes_to_uint32(new byte[] {v[4], v[5], v[6], v[7]}); - long sum = 0L; - long v0_xor_1 = 0L, v0_xor_2 = 0L, v0_xor_3 = 0L; - long v1_xor_1 = 0L, v1_xor_2 = 0L, v1_xor_3 = 0L; - for (int i = 0; i < loops; i++) { - sum = toUInt32(sum + delta); - v0_xor_1 = toUInt32(toUInt32(v1 << 4) + k0); - v0_xor_2 = toUInt32(v1 + sum); - v0_xor_3 = toUInt32((v1 >> 5) + k1); - v0 = toUInt32( v0 + toUInt32(v0_xor_1 ^ v0_xor_2 ^ v0_xor_3) ); - v1_xor_1 = toUInt32(toUInt32(v0 << 4) + k2); - v1_xor_2 = toUInt32(v0 + sum); - v1_xor_3 = toUInt32((v0 >> 5) + k3); -// System.out.printf("%08X\t%08X\t%08X\t%08X\n", i, v0, v0 >> 5, k3); - v1 = toUInt32( v1 + toUInt32(v1_xor_1 ^ v1_xor_2 ^ v1_xor_3) ); - } - byte[] b0 = long_to_bytes(v0, 4); - byte[] b1 = long_to_bytes(v1, 4); - return new byte[] {b0[0], b0[1], b0[2], b0[3], b1[0], b1[1], b1[2], b1[3]}; - } - - /** - * 解密一组密文 - * @param v 要解密的密文 - * @return 返回明文 - */ - public byte[] decrypt_group(byte[] v) { - long v0 = bytes_to_uint32(new byte[] {v[0], v[1], v[2], v[3]}); - long v1 = bytes_to_uint32(new byte[] {v[4], v[5], v[6], v[7]}); - long sum = 0xC6EF3720L, tmp = 0L; - for (int i = 0; i < loops; i++) { - tmp = toUInt32(toUInt32(v0 << 4) + k2); - v1 = toUInt32( v1 - toUInt32(tmp ^ toUInt32(v0 + sum) ^ toUInt32((v0 >> 5) + k3)) ); - tmp = toUInt32(toUInt32(v1 << 4) + k0); - v0 = toUInt32( v0 - toUInt32(tmp ^ toUInt32(v1 + sum) ^ toUInt32((v1 >> 5) + k1)) ); - sum = toUInt32(sum - delta); - } - byte[] b0 = long_to_bytes(v0, 4); - byte[] b1 = long_to_bytes(v1, 4); - return new byte[] {b0[0], b0[1], b0[2], b0[3], b1[0], b1[1], b1[2], b1[3]}; - } - - - /** - * 将 long 类型的 n 转为 byte 数组,如果 len 为 4,则只返回低32位的4个byte - * @param n 需要转换的long - * @param len 若为4,则只返回低32位的4个byte,否则返回8个byte - * @return 转换后byte数组 - */ - private static byte[] long_to_bytes(long n, int len) { - byte a = (byte)((n & BYTE_4) >> 24); - byte b = (byte)((n & BYTE_3) >> 16); - byte c = (byte)((n & BYTE_2) >> 8); - byte d = (byte)(n & BYTE_1); - if (len == 4) { - return new byte[] {a, b, c, d}; - } - byte ha = (byte)(n >> 56); - byte hb = (byte)((n >> 48) & BYTE_1); - byte hc = (byte)((n >> 40) & BYTE_1); - byte hd = (byte)((n >> 32) & BYTE_1); - return new byte[] {ha, hb, hc, hd, a, b, c, d}; - } - - /** - * 将4个byte转为 Unsigned Integer 32,以 long 形式返回 - * @param bs 需要转换的字节 - * @return 返回 long,高32位为0,低32位视为Unsigned Integer - */ - private static long bytes_to_uint32(byte[] bs) { - return ((bs[0]<<24) & BYTE_4) + - ((bs[1]<<16) & BYTE_3) + - ((bs[2]<<8) & BYTE_2) + - (bs[3] & BYTE_1); - } - - /** - * 将long的高32位清除,只保留低32位,低32位视为Unsigned Integer - * @param n 需要清除的long - * @return 返回高32位全为0的long - */ - private static long toUInt32(long n) { - return n & UINT32_MAX; - } - - - // ------------------------------------------------------- - // 以下 是用于Debug的函数 - // ------------------------------------------------------- - private static void println_array(byte[] b) { - for (byte x : b) { - System.out.printf("%02X ", x); - } - System.out.println(); - } - /*private static void println_array(long[] b) { - for (long x : b) { - System.out.printf("%016X ", x); - } - System.out.println(); - }*/ - - /** - * 以8个字节为单位进行顺序调整 - * @param src - * @return - */ - public static byte[] reverseBytesBy8(byte[] src){ - int data_len = src.length; - int group_len = 8; - int residues = data_len % group_len; // 余数 - int dlen = data_len; - if(residues!=0){ - dlen = data_len + (8-residues); - } -// System.out.println("新数据长度:"+dlen); - byte[] result = new byte[dlen]; - for (int i = 0; i < src.length; i+=4) { - for(int j=0;j<4;j+=1){ - if((i + 3 - j)>=data_len){ - result[i + j] = 0x00; - }else { - result[i + j] = src[i + 3 - j]; - } - } - } - return result; - } - - public static void main(String[] args) { -// byte[] bs = new byte[] {(byte)0xFF, (byte)0xEE, (byte)0xDD, (byte)0xCC}; -// System.out.printf("%016X\n", bytes_to_uint32(bs)); -// System.out.println(bytes_to_uint32(bs)); -// -// - String info = "oyAAE0EgGAYAAgMAAgSGAV53zuugXOYSih4="; - info = "1806EEF00C28711D2B74E59ABEAB7808"; - info = "1806EEF00C28711D2B74E59ABEAB7808"; - //System.out.println("原数据:" + info); - byte[] temps = ByteUtils.fromHexString(info); - byte[] temp = temps; - byte[] reverse = TeaUtils.reverseBytesBy8(temp); - System.out.println("待解密:"+ ByteUtils.toBinaryString(temp)); - System.out.println("待解密:"+ ByteUtils.toBinaryString(reverse)); - System.out.print("待解密:"); - TeaUtils.println_array(reverse); - - TeaUtils t = new TeaUtils(); - byte[] pnt = new byte[] { - (byte)0xc7,0x00, 0x00, 0x00, - 0x00, 0x01, 0x00 - }; - byte[] k = new byte[] { - 0x33, 0x32, 0x31, 0x30 , - 0x37, 0x36, 0x35, 0x34, - 0x62, 0x61, 0x39, 0x38, - 0x66, 0x65, 0x64, 0x63 - }; -// k = new byte[] { -// 0x30, 0x30, 0x30, 0x30 , -// 0x30, 0x30, 0x30, 0x30, -// 0x30, 0x30, 0x30, 0x30, -// 0x30, 0x30, 0x30, 0x30 -// }; - t.setKey(k); -// byte[] enc = t.encrypt(v, k); -// byte[] dec = t.decrypt(enc, k); - pnt = TeaUtils.reverseBytesBy8(pnt); - byte[] enc = t.encrypt(pnt);//加密 - //byte[] enc = new byte[] {(byte) 0xC1, (byte) 0xC6, 0x48, 0x7A, (byte) 0x9E, 0x6F, (byte) 0xF2, 0x56}; - reverse = TeaUtils.reverseBytesBy8(enc); -// reverse = TeaUtils.reverseBytesBy8(enc); -// reverse = enc; -// reverse = enc; - byte[] dec = t.decrypt(reverse);//解密 - byte[] reverse_dec = TeaUtils.reverseBytesBy8(dec); - - //println_array(v_from_byte_to_long(new byte[]{ 0x7F, 0x1E, 0x55, 0x56, 0x32, 0x35, 0x65, 0x78 })); - //println_array(k_from_byte_to_long(new byte[]{ 0x7F, 0x1E, 0x55, 0x56, 0x32, 0x35, 0x65, 0x78, 0x6F, 0x1E, 0x55, 0x56, 0x32, 0x35, 0x65, 0x78 })); - //println_array(long_to_bytes((long)0x7E987654, 8)); - //byte b = (byte)0xEF; - //println_array(new long[] { (b << 24) & 0xFF000000L } ); - //println_array(new long[] {(byte)0xEF}); - -// String[] plain = new String[32]; -// for (i = 0; i < 32; i++) { -// plain[i] = String. -// } -// byte[] pnt = "123".getBytes(); -// byte[] enc = encrypt(pnt, k); -// byte[] dec = decrypt(enc, k); - - System.out.println("Key:"); - println_array(k); - - System.out.println("Encrypt And Decrypt:"); - println_array(pnt);//待加密数据 - println_array(reverse); - println_array(enc); - println_array(reverse_dec); - } - -} \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtilsX.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtilsX.java new file mode 100644 index 0000000..5a91ab8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtilsX.java @@ -0,0 +1,299 @@ +package com.casic.missiles.parser.safe.impl; + + +import com.casic.missiles.parser.safe.SafeStrategy; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.compress.utils.ByteUtils; +import org.apache.shiro.codec.Hex; +import org.springframework.stereotype.Component; + +import java.util.Arrays; + +/** + * @author: wxy + */ +@Component("tea") +public class TeaUtilsX implements SafeStrategy { + + + @Override + public ByteBuf decryption(String cipher) { + byte[] reverse = reverseBytesBy8(Hex.decode(cipher)); + TeaUtilsX t=new TeaUtilsX(); + byte[] k = new byte[]{ + 0x33, 0x32, 0x31, 0x30, + 0x37, 0x36, 0x35, 0x34, + 0x62, 0x61, 0x39, 0x38, + 0x66, 0x65, 0x64, 0x63 + }; + t.setKey(k); + byte[] enc = encrypt(reverse);//加密 + return ByteBufAllocator.DEFAULT.buffer().writeBytes(reverseBytesBy8(enc)); + } + + @Override + public ByteBuf encryption(String lightText) { + byte[] reverse = reverseBytesBy8(Hex.decode(lightText)); + byte[] dec = decrypt(reverse);//解密 + return ByteBufAllocator.DEFAULT.buffer().writeBytes(reverseBytesBy8(dec)); + } + + private static long UINT32_MAX = 0xFFFFFFFFL; + private static long BYTE_1 = 0xFFL; + private static long BYTE_2 = 0xFF00L; + private static long BYTE_3 = 0xFF0000L; + private static long BYTE_4 = 0xFF000000L; + + private static long delta = 0x9E3779B9L; + + private long k0, k1, k2, k3; + + private int loops = 32; + + + public byte[] encrypt(byte[] data) { + int data_len = data.length; // 数据的长度 + if (data_len == 0) {//输入数据长度为0 + return new byte[]{}; + } + int group_len = 8; + int residues = data_len % group_len; // 余数 + int dlen = data_len - residues; + + // 用于储存加密的密文,第一字节为余数的大小 + int result_len = data_len; + if (residues > 0) { + result_len += group_len - residues; + } + byte[] result = new byte[result_len]; + + byte[] plain = new byte[group_len]; + byte[] enc = new byte[group_len]; + + for (int i = 0; i < dlen; i += group_len) { + for (int j = 0; j < group_len; j++) { + plain[j] = data[i + j]; + } + enc = encrypt_group(plain); + for (int k = 0; k < group_len; k++) { + result[i + k] = enc[k]; + } + } + if (residues > 0) { + for (int j = 0; j < residues; j++) { + plain[j] = data[dlen + j]; + } + int padding = group_len - residues; + for (int j = 0; j < padding; j++) { + plain[residues + j] = (byte) 0x00; + } + enc = encrypt_group(plain); + for (int k = 0; k < group_len; k++) { + result[dlen + k] = enc[k]; + } + } + return result; + } + + public byte[] decrypt(byte[] data) { + int group_len = 8; +// if (data.length % group_len != 1) { +// return new byte[] {}; +// } + int data_len = data.length, dlen; // 数据的长度 + int residues = data.length % group_len; // 余数 + if (residues > 0) { + dlen = data_len - group_len; + } else { + dlen = data_len; + } + + byte[] result = new byte[dlen + residues]; + + byte[] dec = new byte[group_len]; + byte[] enc = new byte[group_len]; + for (int i = 0; i < dlen; i += group_len) { + for (int j = 0; j < group_len; j++) { + enc[j] = data[i + j]; + } + dec = decrypt_group(enc); + for (int k = 0; k < group_len; k++) { + result[i + k] = dec[k]; + } + } + if (residues > 0) { + for (int j = 0; j < group_len; j++) { + enc[j] = data[dlen + j + 1]; + } + dec = decrypt_group(enc); + for (int k = 0; k < residues; k++) { + result[dlen + k] = dec[k]; + } + } + return result; + } + + /** + * 设置密钥 + * + * @param k 密钥 + * @return 密钥长度为16个byte时, 设置密钥并返回true,否则返回false + */ + public boolean setKey(byte[] k) { + if (k.length != 16) { + return false; + } + k0 = bytes_to_uint32(new byte[]{k[0], k[1], k[2], k[3]}); + k1 = bytes_to_uint32(new byte[]{k[4], k[5], k[6], k[7]}); + k2 = bytes_to_uint32(new byte[]{k[8], k[9], k[10], k[11]}); + k3 = bytes_to_uint32(new byte[]{k[12], k[13], k[14], k[15]}); + return true; + } + + /** + * 加密一组明文 + * + * @param v 需要加密的明文 + * @return 返回密文 + */ + private byte[] encrypt_group(byte[] v) { + long v0 = bytes_to_uint32(new byte[]{v[0], v[1], v[2], v[3]}); + long v1 = bytes_to_uint32(new byte[]{v[4], v[5], v[6], v[7]}); + long sum = 0L; + long v0_xor_1 = 0L, v0_xor_2 = 0L, v0_xor_3 = 0L; + long v1_xor_1 = 0L, v1_xor_2 = 0L, v1_xor_3 = 0L; + for (int i = 0; i < loops; i++) { + sum = toUInt32(sum + delta); + v0_xor_1 = toUInt32(toUInt32(v1 << 4) + k0); + v0_xor_2 = toUInt32(v1 + sum); + v0_xor_3 = toUInt32((v1 >> 5) + k1); + v0 = toUInt32(v0 + toUInt32(v0_xor_1 ^ v0_xor_2 ^ v0_xor_3)); + v1_xor_1 = toUInt32(toUInt32(v0 << 4) + k2); + v1_xor_2 = toUInt32(v0 + sum); + v1_xor_3 = toUInt32((v0 >> 5) + k3); +// System.out.printf("%08X\t%08X\t%08X\t%08X\n", i, v0, v0 >> 5, k3); + v1 = toUInt32(v1 + toUInt32(v1_xor_1 ^ v1_xor_2 ^ v1_xor_3)); + } + byte[] b0 = long_to_bytes(v0, 4); + byte[] b1 = long_to_bytes(v1, 4); + return new byte[]{b0[0], b0[1], b0[2], b0[3], b1[0], b1[1], b1[2], b1[3]}; + } + + /** + * 解密一组密文 + * + * @param v 要解密的密文 + * @return 返回明文 + */ + public byte[] decrypt_group(byte[] v) { + long v0 = bytes_to_uint32(new byte[]{v[0], v[1], v[2], v[3]}); + long v1 = bytes_to_uint32(new byte[]{v[4], v[5], v[6], v[7]}); + long sum = 0xC6EF3720L, tmp = 0L; + for (int i = 0; i < loops; i++) { + tmp = toUInt32(toUInt32(v0 << 4) + k2); + v1 = toUInt32(v1 - toUInt32(tmp ^ toUInt32(v0 + sum) ^ toUInt32((v0 >> 5) + k3))); + tmp = toUInt32(toUInt32(v1 << 4) + k0); + v0 = toUInt32(v0 - toUInt32(tmp ^ toUInt32(v1 + sum) ^ toUInt32((v1 >> 5) + k1))); + sum = toUInt32(sum - delta); + } + byte[] b0 = long_to_bytes(v0, 4); + byte[] b1 = long_to_bytes(v1, 4); + return new byte[]{b0[0], b0[1], b0[2], b0[3], b1[0], b1[1], b1[2], b1[3]}; + } + + + /** + * 将 long 类型的 n 转为 byte 数组,如果 len 为 4,则只返回低32位的4个byte + * + * @param n 需要转换的long + * @param len 若为4,则只返回低32位的4个byte,否则返回8个byte + * @return 转换后byte数组 + */ + private static byte[] long_to_bytes(long n, int len) { + byte a = (byte) ((n & BYTE_4) >> 24); + byte b = (byte) ((n & BYTE_3) >> 16); + byte c = (byte) ((n & BYTE_2) >> 8); + byte d = (byte) (n & BYTE_1); + if (len == 4) { + return new byte[]{a, b, c, d}; + } + byte ha = (byte) (n >> 56); + byte hb = (byte) ((n >> 48) & BYTE_1); + byte hc = (byte) ((n >> 40) & BYTE_1); + byte hd = (byte) ((n >> 32) & BYTE_1); + return new byte[]{ha, hb, hc, hd, a, b, c, d}; + } + + /** + * 将4个byte转为 Unsigned Integer 32,以 long 形式返回 + * + * @param bs 需要转换的字节 + * @return 返回 long,高32位为0,低32位视为Unsigned Integer + */ + private static long bytes_to_uint32(byte[] bs) { + return ((bs[0] << 24) & BYTE_4) + + ((bs[1] << 16) & BYTE_3) + + ((bs[2] << 8) & BYTE_2) + + (bs[3] & BYTE_1); + } + + /** + * 将long的高32位清除,只保留低32位,低32位视为Unsigned Integer + * + * @param n 需要清除的long + * @return 返回高32位全为0的long + */ + private static long toUInt32(long n) { + return n & UINT32_MAX; + } + + /** + * 以8个字节为单位进行顺序调整 + * + * @param src + * @return + */ + public static byte[] reverseBytesBy8(byte[] src) { + int data_len = src.length; + int group_len = 8; + int residues = data_len % group_len; // 余数 + int dlen = data_len; + if (residues != 0) { + dlen = data_len + (8 - residues); + } +// System.out.println("新数据长度:"+dlen); + byte[] result = new byte[dlen]; + for (int i = 0; i < src.length; i += 4) { + for (int j = 0; j < 4; j += 1) { + if ((i + 3 - j) >= data_len) { + result[i + j] = 0x00; + } else { + result[i + j] = src[i + 3 - j]; + } + } + } + return result; + } + + public static void main(String[] args) { + String infos = "6000002000013310000050000300010160000009000102c502d1e200040000000060000511000200ec600005130002ffa56000051600020002"; + String infoss = "328af9a4b8d90323819b7c635f748f26cea92e740b253f310389c610820ddee3d796ad2359abe201fa0041299aec6a1d393217191019baa2253aead50b70df"; + byte[] reverse = reverseBytesBy8(Hex.decode(infos)); + TeaUtilsX teaUtilsX=new TeaUtilsX(); + byte[] k = new byte[]{ + 0x33, 0x32, 0x31, 0x30, + 0x37, 0x36, 0x35, 0x34, + 0x62, 0x61, 0x39, 0x38, + 0x66, 0x65, 0x64, 0x63 + }; + teaUtilsX.setKey(k); + byte[] enc = teaUtilsX.encrypt(reverse);//加密 + System.out.println(ByteBufUtil.hexDump(reverseBytesBy8(enc))); + byte[] dec = teaUtilsX.decrypt(enc);//解密 + byte[] reverse_dec = reverseBytesBy8(dec); + System.out.println(ByteBufUtil.hexDump(reverse_dec)); + } + +} \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java deleted file mode 100644 index 9f89e78..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Tea.java +++ /dev/null @@ -1,420 +0,0 @@ -package com.casic.missiles.parser.safe.impl; - - -import io.netty.buffer.ByteBufUtil; -import org.apache.shiro.codec.Hex; - -public class TEA { - - public static byte[] encrypt(byte[] data, byte[] key) { - - int data_len = data.length; //数据的长度 - - if (data_len == 0) { - - return new byte[]{}; - - } - - TEA t = new TEA(); - - if (!t.setKey(key)) { - - return new byte[]{}; - - } - - int group_len = 8; - - int residues = data_len % group_len; //余数 - - int dlen = data_len - residues; - -//用于储存加密的密文,第一字节为余数的大小 - - int result_len = data_len + 1; - - if (residues > 0) { - - result_len += group_len - residues; - - } - - byte[] result = new byte[result_len]; - - result[0] = (byte) residues; - - byte[] plain = new byte[group_len]; - - byte[] enc = new byte[group_len]; - - for (int i = 0; i < dlen; i += group_len) { - - for (int j = 0; j < group_len; j++) { - - plain[j] = data[i + j]; - - } - - enc = t.encrypt_group(plain); - - for (int k = 0; k < group_len; k++) { - - result[i + k + 1] = enc[k]; - - } - - } - - if (residues > 0) { - - for (int j = 0; j < residues; j++) { - - plain[j] = data[dlen + j]; - - } - - int padding = group_len - residues; - - for (int j = 0; j < padding; j++) { - - plain[residues + j] = (byte) 0x00; - - } - - enc = t.encrypt_group(plain); - - for (int k = 0; k < group_len; k++) { - - result[dlen + k + 1] = enc[k]; - - } - - } - - return result; - - } - - public static byte[] decrypt(byte[] data, byte[] key) { - - int group_len = 8; - - if (data.length % group_len != 1) { - - return new byte[]{}; - - } - - TEA t = new TEA(); - - if (!t.setKey(key)) { - - return new byte[]{}; - - } - - int data_len = data.length - 1, dlen; //数据的长度 - - int residues = (int) (data[0]); //余数 - - if (residues > 0) { - - dlen = data_len - group_len; - - } else { - - dlen = data_len; - - } - - byte[] result = new byte[dlen + residues]; - - byte[] dec = new byte[group_len]; - - byte[] enc = new byte[group_len]; - - for (int i = 0; i < dlen; i += group_len) { - - for (int j = 0; j < group_len; j++) { - - enc[j] = data[i + j + 1]; - - } - - dec = t.decrypt_group(enc); - - for (int k = 0; k < group_len; k++) { - - result[i + k] = dec[k]; - - } - - } - - if (residues > 0) { - - for (int j = 0; j < group_len; j++) { - - enc[j] = data[dlen + j + 1]; - - } - - dec = t.decrypt_group(enc); - - for (int k = 0; k < residues; k++) { - - result[dlen + k] = dec[k]; - - } - - } - - return result; - - } - - /*** 设置密钥 - *@paramk 密钥 - *@return密钥长度为16个byte时, 设置密钥并返回true,否则返回false*/ - - public boolean setKey(byte[] k) { - - if (k.length != 16) { - - return false; - - } - - k0 = bytes_to_uint32(new byte[]{k[0], k[1], k[2], k[3]}); - - k1 = bytes_to_uint32(new byte[]{k[4], k[5], k[6], k[7]}); - - k2 = bytes_to_uint32(new byte[]{k[8], k[9], k[10], k[11]}); - - k3 = bytes_to_uint32(new byte[]{k[12], k[13], k[14], k[15]}); - - return true; - - } - - /*** 设置加密的轮数,默认为32轮 - *@paramloops 加密轮数 - *@return轮数为16、32、64时,返回true,否则返回false*/ - - public boolean setLoops(int loops) { - - switch (loops) { - - case 16: - - case 32: - - case 64: - - this.loops = loops; - - return true; - - } - - return false; - - } - - private static long UINT32_MAX = 0xFFFFFFFFL; - - private static long BYTE_1 = 0xFFL; - - private static long BYTE_2 = 0xFF00L; - - private static long BYTE_3 = 0xFF0000L; - - private static long BYTE_4 = 0xFF000000L; - - private static long delta = 0x9E3779B9L; - - private long k0, k1, k2, k3; - - private int loops = 32; - - /*** 加密一组明文 - *@paramv 需要加密的明文 - *@return返回密文*/ - - private byte[] encrypt_group(byte[] v) { - - long v0 = bytes_to_uint32(new byte[]{v[0], v[1], v[2], v[3]}); - - long v1 = bytes_to_uint32(new byte[]{v[4], v[5], v[6], v[7]}); - - long sum = 0L; - - long v0_xor_1 = 0L, v0_xor_2 = 0L, v0_xor_3 = 0L; - - long v1_xor_1 = 0L, v1_xor_2 = 0L, v1_xor_3 = 0L; - - for (int i = 0; i < loops; i++) { - - sum = toUInt32(sum + delta); - - v0_xor_1 = toUInt32(toUInt32(v1 << 4) + k0); - - v0_xor_2 = toUInt32(v1 + sum); - - v0_xor_3 = toUInt32((v1 >> 5) + k1); - - v0 = toUInt32(v0 + toUInt32(v0_xor_1 ^ v0_xor_2 ^ v0_xor_3)); - - v1_xor_1 = toUInt32(toUInt32(v0 << 4) + k2); - - v1_xor_2 = toUInt32(v0 + sum); - - v1_xor_3 = toUInt32((v0 >> 5) + k3); - - System.out.printf("%08X\t%08X\t%08X\t%08X\n", i, v0, v0 >> 5, k3); - - v1 = toUInt32(v1 + toUInt32(v1_xor_1 ^ v1_xor_2 ^ v1_xor_3)); - - } - - byte[] b0 = long_to_bytes(v0, 4); - - byte[] b1 = long_to_bytes(v1, 4); - - return new byte[]{b0[0], b0[1], b0[2], b0[3], b1[0], b1[1], b1[2], b1[3]}; - - } - - /*** 解密一组密文 - *@paramv 要解密的密文 - *@return返回明文*/ - - private byte[] decrypt_group(byte[] v) { - - long v0 = bytes_to_uint32(new byte[]{v[0], v[1], v[2], v[3]}); - - long v1 = bytes_to_uint32(new byte[]{v[4], v[5], v[6], v[7]}); - - long sum = 0xC6EF3720L, tmp = 0L; - - for (int i = 0; i < loops; i++) { - - tmp = toUInt32(toUInt32(v0 << 4) + k2); - - v1 = toUInt32(v1 - toUInt32(tmp ^ toUInt32(v0 + sum) ^ toUInt32((v0 >> 5) + k3))); - - tmp = toUInt32(toUInt32(v1 << 4) + k0); - - v0 = toUInt32(v0 - toUInt32(tmp ^ toUInt32(v1 + sum) ^ toUInt32((v1 >> 5) + k1))); - - sum = toUInt32(sum - delta); - - } - - byte[] b0 = long_to_bytes(v0, 4); - - byte[] b1 = long_to_bytes(v1, 4); - - return new byte[]{b0[0], b0[1], b0[2], b0[3], b1[0], b1[1], b1[2], b1[3]}; - - } - - /*** 将 long 类型的 n 转为 byte 数组,如果 len 为 4,则只返回低32位的4个byte - *@paramn 需要转换的long - *@paramlen 若为4,则只返回低32位的4个byte,否则返回8个byte - *@return转换后byte数组*/ - - private static byte[] long_to_bytes(long n, int len) { - - byte a = (byte) ((n & BYTE_4) >> 24); - - byte b = (byte) ((n & BYTE_3) >> 16); - - byte c = (byte) ((n & BYTE_2) >> 8); - - byte d = (byte) (n & BYTE_1); - - if (len == 4) { - - return new byte[]{a, b, c, d}; - - } - - byte ha = (byte) (n >> 56); - - byte hb = (byte) ((n >> 48) & BYTE_1); - - byte hc = (byte) ((n >> 40) & BYTE_1); - - byte hd = (byte) ((n >> 32) & BYTE_1); - - return new byte[]{ha, hb, hc, hd, a, b, c, d}; - } - - /*** 将4个byte转为 Unsigned Integer 32,以 long 形式返回 - *@parambs 需要转换的字节 - *@return返回 long,高32位为0,低32位视为Unsigned Integer*/ - - private static long bytes_to_uint32(byte[] bs) { - - return ((bs[0] << 24) & BYTE_4) + - - ((bs[1] << 16) & BYTE_3) + - - ((bs[2] << 8) & BYTE_2) + - - (bs[3] & BYTE_1); - - } - - /*** 将long的高32位清除,只保留低32位,低32位视为Unsigned Integer - *@paramn 需要清除的long - *@return返回高32位全为0的long*/ - - private static long toUInt32(long n) { - - return n & UINT32_MAX; - - } - -//-------------------------------------------------------//以下 是用于Debug的函数//------------------------------------------------------- - - private static void println_array(byte[] b) { - - for (byte x : b) { - - System.out.printf("%02X ", x); - - } - - System.out.println(); - - } - - private static void test() { - - } - - public static void main(String[] args) { - - TEA t = new TEA(); - - byte[] TEA_key = {0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66}; - t.setKey(TEA_key); - String info = "6000002000013310000050000300010160000009000102c502d1e200040000000060000511000200ec600005130002ffa56000051600020002"; - - byte[] enc = t.encrypt_group(Hex.decode(info)); - - byte[] dec = t.decrypt_group(enc); - - System.out.println("Key:" + ByteBufUtil.hexDump(TEA_key)); - - System.out.println("Encrypt And Encrypt:" + ByteBufUtil.hexDump(enc)); - - System.out.println("Encrypt And Decrypt:" + ByteBufUtil.hexDump(dec)); - - } - -} - diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtils.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtils.java deleted file mode 100644 index 5f248bb..0000000 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtils.java +++ /dev/null @@ -1,348 +0,0 @@ -package com.casic.missiles.parser.safe.impl; - -import org.bouncycastle.pqc.math.linearalgebra.ByteUtils; - -import java.util.Arrays; - -/** - * @author: wxy - */ -public class TeaUtils { - private static long UINT32_MAX = 0xFFFFFFFFL; - private static long BYTE_1 = 0xFFL; - private static long BYTE_2 = 0xFF00L; - private static long BYTE_3 = 0xFF0000L; - private static long BYTE_4 = 0xFF000000L; - - private static long delta = 0x9E3779B9L; - - private long k0, k1, k2, k3; - - private int loops = 32; - - - public byte[] encrypt(byte[] data) { - int data_len = data.length; // 数据的长度 - if (data_len == 0) {//输入数据长度为0 - return new byte[] {}; - } - int group_len = 8; - int residues = data_len % group_len; // 余数 - int dlen = data_len - residues; - - // 用于储存加密的密文,第一字节为余数的大小 - int result_len = data_len; - if (residues > 0) { - result_len += group_len - residues; - } - byte[] result = new byte[result_len]; - - byte[] plain = new byte[group_len]; - byte[] enc = new byte[group_len]; - - for (int i = 0; i < dlen; i += group_len) { - for (int j = 0; j < group_len; j++) { - plain[j] = data[i + j]; - } - enc = encrypt_group(plain); - for (int k = 0; k < group_len; k++) { - result[i + k ] = enc[k]; - } - } - if (residues > 0) { - for (int j = 0; j < residues; j++) { - plain[j] = data[dlen + j]; - } - int padding = group_len - residues; - for (int j = 0; j < padding; j++) { - plain[residues + j] = (byte)0x00; - } - enc = encrypt_group(plain); - for (int k = 0; k < group_len; k++) { - result[dlen + k ] = enc[k]; - } - } - return result; - } - - public byte[] decrypt(byte[] data) { - int group_len = 8; -// if (data.length % group_len != 1) { -// return new byte[] {}; -// } - int data_len = data.length, dlen; // 数据的长度 - int residues = data.length % group_len; // 余数 - if (residues > 0) { - dlen = data_len - group_len; - } else { - dlen = data_len; - } - - byte[] result = new byte[dlen + residues]; - - byte[] dec = new byte[group_len]; - byte[] enc = new byte[group_len]; - for (int i = 0; i < dlen; i += group_len) { - for (int j = 0; j < group_len; j++) { - enc[j] = data[i + j]; - } - dec = decrypt_group(enc); - for (int k = 0; k < group_len; k++) { - result[i + k] = dec[k]; - } - } - if (residues > 0) { - for (int j = 0; j < group_len; j++) { - enc[j] = data[dlen + j + 1]; - } - dec = decrypt_group(enc); - for (int k = 0; k < residues; k++) { - result[dlen + k] = dec[k]; - } - } - return result; - } - - /** - * 设置密钥 - * @param k 密钥 - * @return 密钥长度为16个byte时, 设置密钥并返回true,否则返回false - */ - public boolean setKey(byte[] k) { - if (k.length != 16) { - return false; - } - k0 = bytes_to_uint32(new byte[] {k[0], k[1], k[2], k[3]}); - k1 = bytes_to_uint32(new byte[] {k[4], k[5], k[6], k[7]}); - k2 = bytes_to_uint32(new byte[] {k[8], k[9], k[10], k[11]}); - k3 = bytes_to_uint32(new byte[] {k[12], k[13], k[14], k[15]}); - return true; - } - - /** - * 设置加密的轮数,默认为32轮 - * @param loops 加密轮数 - * @return 轮数为16、32、64时,返回true,否则返回false - */ - public boolean setLoops(int loops) { - switch (loops) { - case 16: - case 32: - case 64: - this.loops = loops; - return true; - } - return false; - } - - - /** - * 加密一组明文 - * @param v 需要加密的明文 - * @return 返回密文 - */ - private byte[] encrypt_group(byte[] v) { - long v0 = bytes_to_uint32(new byte[] {v[0], v[1], v[2], v[3]}); - long v1 = bytes_to_uint32(new byte[] {v[4], v[5], v[6], v[7]}); - long sum = 0L; - long v0_xor_1 = 0L, v0_xor_2 = 0L, v0_xor_3 = 0L; - long v1_xor_1 = 0L, v1_xor_2 = 0L, v1_xor_3 = 0L; - for (int i = 0; i < loops; i++) { - sum = toUInt32(sum + delta); - v0_xor_1 = toUInt32(toUInt32(v1 << 4) + k0); - v0_xor_2 = toUInt32(v1 + sum); - v0_xor_3 = toUInt32((v1 >> 5) + k1); - v0 = toUInt32( v0 + toUInt32(v0_xor_1 ^ v0_xor_2 ^ v0_xor_3) ); - v1_xor_1 = toUInt32(toUInt32(v0 << 4) + k2); - v1_xor_2 = toUInt32(v0 + sum); - v1_xor_3 = toUInt32((v0 >> 5) + k3); -// System.out.printf("%08X\t%08X\t%08X\t%08X\n", i, v0, v0 >> 5, k3); - v1 = toUInt32( v1 + toUInt32(v1_xor_1 ^ v1_xor_2 ^ v1_xor_3) ); - } - byte[] b0 = long_to_bytes(v0, 4); - byte[] b1 = long_to_bytes(v1, 4); - return new byte[] {b0[0], b0[1], b0[2], b0[3], b1[0], b1[1], b1[2], b1[3]}; - } - - /** - * 解密一组密文 - * @param v 要解密的密文 - * @return 返回明文 - */ - public byte[] decrypt_group(byte[] v) { - long v0 = bytes_to_uint32(new byte[] {v[0], v[1], v[2], v[3]}); - long v1 = bytes_to_uint32(new byte[] {v[4], v[5], v[6], v[7]}); - long sum = 0xC6EF3720L, tmp = 0L; - for (int i = 0; i < loops; i++) { - tmp = toUInt32(toUInt32(v0 << 4) + k2); - v1 = toUInt32( v1 - toUInt32(tmp ^ toUInt32(v0 + sum) ^ toUInt32((v0 >> 5) + k3)) ); - tmp = toUInt32(toUInt32(v1 << 4) + k0); - v0 = toUInt32( v0 - toUInt32(tmp ^ toUInt32(v1 + sum) ^ toUInt32((v1 >> 5) + k1)) ); - sum = toUInt32(sum - delta); - } - byte[] b0 = long_to_bytes(v0, 4); - byte[] b1 = long_to_bytes(v1, 4); - return new byte[] {b0[0], b0[1], b0[2], b0[3], b1[0], b1[1], b1[2], b1[3]}; - } - - - /** - * 将 long 类型的 n 转为 byte 数组,如果 len 为 4,则只返回低32位的4个byte - * @param n 需要转换的long - * @param len 若为4,则只返回低32位的4个byte,否则返回8个byte - * @return 转换后byte数组 - */ - private static byte[] long_to_bytes(long n, int len) { - byte a = (byte)((n & BYTE_4) >> 24); - byte b = (byte)((n & BYTE_3) >> 16); - byte c = (byte)((n & BYTE_2) >> 8); - byte d = (byte)(n & BYTE_1); - if (len == 4) { - return new byte[] {a, b, c, d}; - } - byte ha = (byte)(n >> 56); - byte hb = (byte)((n >> 48) & BYTE_1); - byte hc = (byte)((n >> 40) & BYTE_1); - byte hd = (byte)((n >> 32) & BYTE_1); - return new byte[] {ha, hb, hc, hd, a, b, c, d}; - } - - /** - * 将4个byte转为 Unsigned Integer 32,以 long 形式返回 - * @param bs 需要转换的字节 - * @return 返回 long,高32位为0,低32位视为Unsigned Integer - */ - private static long bytes_to_uint32(byte[] bs) { - return ((bs[0]<<24) & BYTE_4) + - ((bs[1]<<16) & BYTE_3) + - ((bs[2]<<8) & BYTE_2) + - (bs[3] & BYTE_1); - } - - /** - * 将long的高32位清除,只保留低32位,低32位视为Unsigned Integer - * @param n 需要清除的long - * @return 返回高32位全为0的long - */ - private static long toUInt32(long n) { - return n & UINT32_MAX; - } - - - // ------------------------------------------------------- - // 以下 是用于Debug的函数 - // ------------------------------------------------------- - private static void println_array(byte[] b) { - for (byte x : b) { - System.out.printf("%02X ", x); - } - System.out.println(); - } - /*private static void println_array(long[] b) { - for (long x : b) { - System.out.printf("%016X ", x); - } - System.out.println(); - }*/ - - /** - * 以8个字节为单位进行顺序调整 - * @param src - * @return - */ - public static byte[] reverseBytesBy8(byte[] src){ - int data_len = src.length; - int group_len = 8; - int residues = data_len % group_len; // 余数 - int dlen = data_len; - if(residues!=0){ - dlen = data_len + (8-residues); - } -// System.out.println("新数据长度:"+dlen); - byte[] result = new byte[dlen]; - for (int i = 0; i < src.length; i+=4) { - for(int j=0;j<4;j+=1){ - if((i + 3 - j)>=data_len){ - result[i + j] = 0x00; - }else { - result[i + j] = src[i + 3 - j]; - } - } - } - return result; - } - - public static void main(String[] args) { -// byte[] bs = new byte[] {(byte)0xFF, (byte)0xEE, (byte)0xDD, (byte)0xCC}; -// System.out.printf("%016X\n", bytes_to_uint32(bs)); -// System.out.println(bytes_to_uint32(bs)); -// -// - String info = "oyAAE0EgGAYAAgMAAgSGAV53zuugXOYSih4="; - info = "1806EEF00C28711D2B74E59ABEAB7808"; - info = "1806EEF00C28711D2B74E59ABEAB7808"; - //System.out.println("原数据:" + info); - byte[] temps = ByteUtils.fromHexString(info); - byte[] temp = temps; - byte[] reverse = TeaUtils.reverseBytesBy8(temp); - System.out.println("待解密:"+ ByteUtils.toBinaryString(temp)); - System.out.println("待解密:"+ ByteUtils.toBinaryString(reverse)); - System.out.print("待解密:"); - TeaUtils.println_array(reverse); - - TeaUtils t = new TeaUtils(); - byte[] pnt = new byte[] { - (byte)0xc7,0x00, 0x00, 0x00, - 0x00, 0x01, 0x00 - }; - byte[] k = new byte[] { - 0x33, 0x32, 0x31, 0x30 , - 0x37, 0x36, 0x35, 0x34, - 0x62, 0x61, 0x39, 0x38, - 0x66, 0x65, 0x64, 0x63 - }; -// k = new byte[] { -// 0x30, 0x30, 0x30, 0x30 , -// 0x30, 0x30, 0x30, 0x30, -// 0x30, 0x30, 0x30, 0x30, -// 0x30, 0x30, 0x30, 0x30 -// }; - t.setKey(k); -// byte[] enc = t.encrypt(v, k); -// byte[] dec = t.decrypt(enc, k); - pnt = TeaUtils.reverseBytesBy8(pnt); - byte[] enc = t.encrypt(pnt);//加密 - //byte[] enc = new byte[] {(byte) 0xC1, (byte) 0xC6, 0x48, 0x7A, (byte) 0x9E, 0x6F, (byte) 0xF2, 0x56}; - reverse = TeaUtils.reverseBytesBy8(enc); -// reverse = TeaUtils.reverseBytesBy8(enc); -// reverse = enc; -// reverse = enc; - byte[] dec = t.decrypt(reverse);//解密 - byte[] reverse_dec = TeaUtils.reverseBytesBy8(dec); - - //println_array(v_from_byte_to_long(new byte[]{ 0x7F, 0x1E, 0x55, 0x56, 0x32, 0x35, 0x65, 0x78 })); - //println_array(k_from_byte_to_long(new byte[]{ 0x7F, 0x1E, 0x55, 0x56, 0x32, 0x35, 0x65, 0x78, 0x6F, 0x1E, 0x55, 0x56, 0x32, 0x35, 0x65, 0x78 })); - //println_array(long_to_bytes((long)0x7E987654, 8)); - //byte b = (byte)0xEF; - //println_array(new long[] { (b << 24) & 0xFF000000L } ); - //println_array(new long[] {(byte)0xEF}); - -// String[] plain = new String[32]; -// for (i = 0; i < 32; i++) { -// plain[i] = String. -// } -// byte[] pnt = "123".getBytes(); -// byte[] enc = encrypt(pnt, k); -// byte[] dec = decrypt(enc, k); - - System.out.println("Key:"); - println_array(k); - - System.out.println("Encrypt And Decrypt:"); - println_array(pnt);//待加密数据 - println_array(reverse); - println_array(enc); - println_array(reverse_dec); - } - -} \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtilsX.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtilsX.java new file mode 100644 index 0000000..5a91ab8 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/TeaUtilsX.java @@ -0,0 +1,299 @@ +package com.casic.missiles.parser.safe.impl; + + +import com.casic.missiles.parser.safe.SafeStrategy; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; +import io.netty.buffer.ByteBufUtil; +import org.apache.commons.compress.utils.ByteUtils; +import org.apache.shiro.codec.Hex; +import org.springframework.stereotype.Component; + +import java.util.Arrays; + +/** + * @author: wxy + */ +@Component("tea") +public class TeaUtilsX implements SafeStrategy { + + + @Override + public ByteBuf decryption(String cipher) { + byte[] reverse = reverseBytesBy8(Hex.decode(cipher)); + TeaUtilsX t=new TeaUtilsX(); + byte[] k = new byte[]{ + 0x33, 0x32, 0x31, 0x30, + 0x37, 0x36, 0x35, 0x34, + 0x62, 0x61, 0x39, 0x38, + 0x66, 0x65, 0x64, 0x63 + }; + t.setKey(k); + byte[] enc = encrypt(reverse);//加密 + return ByteBufAllocator.DEFAULT.buffer().writeBytes(reverseBytesBy8(enc)); + } + + @Override + public ByteBuf encryption(String lightText) { + byte[] reverse = reverseBytesBy8(Hex.decode(lightText)); + byte[] dec = decrypt(reverse);//解密 + return ByteBufAllocator.DEFAULT.buffer().writeBytes(reverseBytesBy8(dec)); + } + + private static long UINT32_MAX = 0xFFFFFFFFL; + private static long BYTE_1 = 0xFFL; + private static long BYTE_2 = 0xFF00L; + private static long BYTE_3 = 0xFF0000L; + private static long BYTE_4 = 0xFF000000L; + + private static long delta = 0x9E3779B9L; + + private long k0, k1, k2, k3; + + private int loops = 32; + + + public byte[] encrypt(byte[] data) { + int data_len = data.length; // 数据的长度 + if (data_len == 0) {//输入数据长度为0 + return new byte[]{}; + } + int group_len = 8; + int residues = data_len % group_len; // 余数 + int dlen = data_len - residues; + + // 用于储存加密的密文,第一字节为余数的大小 + int result_len = data_len; + if (residues > 0) { + result_len += group_len - residues; + } + byte[] result = new byte[result_len]; + + byte[] plain = new byte[group_len]; + byte[] enc = new byte[group_len]; + + for (int i = 0; i < dlen; i += group_len) { + for (int j = 0; j < group_len; j++) { + plain[j] = data[i + j]; + } + enc = encrypt_group(plain); + for (int k = 0; k < group_len; k++) { + result[i + k] = enc[k]; + } + } + if (residues > 0) { + for (int j = 0; j < residues; j++) { + plain[j] = data[dlen + j]; + } + int padding = group_len - residues; + for (int j = 0; j < padding; j++) { + plain[residues + j] = (byte) 0x00; + } + enc = encrypt_group(plain); + for (int k = 0; k < group_len; k++) { + result[dlen + k] = enc[k]; + } + } + return result; + } + + public byte[] decrypt(byte[] data) { + int group_len = 8; +// if (data.length % group_len != 1) { +// return new byte[] {}; +// } + int data_len = data.length, dlen; // 数据的长度 + int residues = data.length % group_len; // 余数 + if (residues > 0) { + dlen = data_len - group_len; + } else { + dlen = data_len; + } + + byte[] result = new byte[dlen + residues]; + + byte[] dec = new byte[group_len]; + byte[] enc = new byte[group_len]; + for (int i = 0; i < dlen; i += group_len) { + for (int j = 0; j < group_len; j++) { + enc[j] = data[i + j]; + } + dec = decrypt_group(enc); + for (int k = 0; k < group_len; k++) { + result[i + k] = dec[k]; + } + } + if (residues > 0) { + for (int j = 0; j < group_len; j++) { + enc[j] = data[dlen + j + 1]; + } + dec = decrypt_group(enc); + for (int k = 0; k < residues; k++) { + result[dlen + k] = dec[k]; + } + } + return result; + } + + /** + * 设置密钥 + * + * @param k 密钥 + * @return 密钥长度为16个byte时, 设置密钥并返回true,否则返回false + */ + public boolean setKey(byte[] k) { + if (k.length != 16) { + return false; + } + k0 = bytes_to_uint32(new byte[]{k[0], k[1], k[2], k[3]}); + k1 = bytes_to_uint32(new byte[]{k[4], k[5], k[6], k[7]}); + k2 = bytes_to_uint32(new byte[]{k[8], k[9], k[10], k[11]}); + k3 = bytes_to_uint32(new byte[]{k[12], k[13], k[14], k[15]}); + return true; + } + + /** + * 加密一组明文 + * + * @param v 需要加密的明文 + * @return 返回密文 + */ + private byte[] encrypt_group(byte[] v) { + long v0 = bytes_to_uint32(new byte[]{v[0], v[1], v[2], v[3]}); + long v1 = bytes_to_uint32(new byte[]{v[4], v[5], v[6], v[7]}); + long sum = 0L; + long v0_xor_1 = 0L, v0_xor_2 = 0L, v0_xor_3 = 0L; + long v1_xor_1 = 0L, v1_xor_2 = 0L, v1_xor_3 = 0L; + for (int i = 0; i < loops; i++) { + sum = toUInt32(sum + delta); + v0_xor_1 = toUInt32(toUInt32(v1 << 4) + k0); + v0_xor_2 = toUInt32(v1 + sum); + v0_xor_3 = toUInt32((v1 >> 5) + k1); + v0 = toUInt32(v0 + toUInt32(v0_xor_1 ^ v0_xor_2 ^ v0_xor_3)); + v1_xor_1 = toUInt32(toUInt32(v0 << 4) + k2); + v1_xor_2 = toUInt32(v0 + sum); + v1_xor_3 = toUInt32((v0 >> 5) + k3); +// System.out.printf("%08X\t%08X\t%08X\t%08X\n", i, v0, v0 >> 5, k3); + v1 = toUInt32(v1 + toUInt32(v1_xor_1 ^ v1_xor_2 ^ v1_xor_3)); + } + byte[] b0 = long_to_bytes(v0, 4); + byte[] b1 = long_to_bytes(v1, 4); + return new byte[]{b0[0], b0[1], b0[2], b0[3], b1[0], b1[1], b1[2], b1[3]}; + } + + /** + * 解密一组密文 + * + * @param v 要解密的密文 + * @return 返回明文 + */ + public byte[] decrypt_group(byte[] v) { + long v0 = bytes_to_uint32(new byte[]{v[0], v[1], v[2], v[3]}); + long v1 = bytes_to_uint32(new byte[]{v[4], v[5], v[6], v[7]}); + long sum = 0xC6EF3720L, tmp = 0L; + for (int i = 0; i < loops; i++) { + tmp = toUInt32(toUInt32(v0 << 4) + k2); + v1 = toUInt32(v1 - toUInt32(tmp ^ toUInt32(v0 + sum) ^ toUInt32((v0 >> 5) + k3))); + tmp = toUInt32(toUInt32(v1 << 4) + k0); + v0 = toUInt32(v0 - toUInt32(tmp ^ toUInt32(v1 + sum) ^ toUInt32((v1 >> 5) + k1))); + sum = toUInt32(sum - delta); + } + byte[] b0 = long_to_bytes(v0, 4); + byte[] b1 = long_to_bytes(v1, 4); + return new byte[]{b0[0], b0[1], b0[2], b0[3], b1[0], b1[1], b1[2], b1[3]}; + } + + + /** + * 将 long 类型的 n 转为 byte 数组,如果 len 为 4,则只返回低32位的4个byte + * + * @param n 需要转换的long + * @param len 若为4,则只返回低32位的4个byte,否则返回8个byte + * @return 转换后byte数组 + */ + private static byte[] long_to_bytes(long n, int len) { + byte a = (byte) ((n & BYTE_4) >> 24); + byte b = (byte) ((n & BYTE_3) >> 16); + byte c = (byte) ((n & BYTE_2) >> 8); + byte d = (byte) (n & BYTE_1); + if (len == 4) { + return new byte[]{a, b, c, d}; + } + byte ha = (byte) (n >> 56); + byte hb = (byte) ((n >> 48) & BYTE_1); + byte hc = (byte) ((n >> 40) & BYTE_1); + byte hd = (byte) ((n >> 32) & BYTE_1); + return new byte[]{ha, hb, hc, hd, a, b, c, d}; + } + + /** + * 将4个byte转为 Unsigned Integer 32,以 long 形式返回 + * + * @param bs 需要转换的字节 + * @return 返回 long,高32位为0,低32位视为Unsigned Integer + */ + private static long bytes_to_uint32(byte[] bs) { + return ((bs[0] << 24) & BYTE_4) + + ((bs[1] << 16) & BYTE_3) + + ((bs[2] << 8) & BYTE_2) + + (bs[3] & BYTE_1); + } + + /** + * 将long的高32位清除,只保留低32位,低32位视为Unsigned Integer + * + * @param n 需要清除的long + * @return 返回高32位全为0的long + */ + private static long toUInt32(long n) { + return n & UINT32_MAX; + } + + /** + * 以8个字节为单位进行顺序调整 + * + * @param src + * @return + */ + public static byte[] reverseBytesBy8(byte[] src) { + int data_len = src.length; + int group_len = 8; + int residues = data_len % group_len; // 余数 + int dlen = data_len; + if (residues != 0) { + dlen = data_len + (8 - residues); + } +// System.out.println("新数据长度:"+dlen); + byte[] result = new byte[dlen]; + for (int i = 0; i < src.length; i += 4) { + for (int j = 0; j < 4; j += 1) { + if ((i + 3 - j) >= data_len) { + result[i + j] = 0x00; + } else { + result[i + j] = src[i + 3 - j]; + } + } + } + return result; + } + + public static void main(String[] args) { + String infos = "6000002000013310000050000300010160000009000102c502d1e200040000000060000511000200ec600005130002ffa56000051600020002"; + String infoss = "328af9a4b8d90323819b7c635f748f26cea92e740b253f310389c610820ddee3d796ad2359abe201fa0041299aec6a1d393217191019baa2253aead50b70df"; + byte[] reverse = reverseBytesBy8(Hex.decode(infos)); + TeaUtilsX teaUtilsX=new TeaUtilsX(); + byte[] k = new byte[]{ + 0x33, 0x32, 0x31, 0x30, + 0x37, 0x36, 0x35, 0x34, + 0x62, 0x61, 0x39, 0x38, + 0x66, 0x65, 0x64, 0x63 + }; + teaUtilsX.setKey(k); + byte[] enc = teaUtilsX.encrypt(reverse);//加密 + System.out.println(ByteBufUtil.hexDump(reverseBytesBy8(enc))); + byte[] dec = teaUtilsX.decrypt(enc);//解密 + byte[] reverse_dec = reverseBytesBy8(dec); + System.out.println(ByteBufUtil.hexDump(reverse_dec)); + } + +} \ No newline at end of file diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Teas.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Teas.java index 75ef727..384cd9a 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Teas.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Teas.java @@ -50,7 +50,12 @@ public static void main(String[] args) { // 测试数据 - byte[] TEA_key = {0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66}; + byte[] TEA_key = new byte[]{ + 0x33, 0x32, 0x31, 0x30, + 0x37, 0x36, 0x35, 0x34, + 0x62, 0x61, 0x39, 0x38, + 0x66, 0x65, 0x64, 0x63 + }; // byte[] TEA_key = {48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102}; String info = "6000002000013310000050000300010160000009000102c502d1e200040000000060000511000200ec600005130002ffa56000051600020002"; // String key = "000102030405060708090a0b0c0d0e0f"; @@ -60,11 +65,13 @@ info += "00"; } } - byte[] retEnBytes = MyTea_Encrypt(Hex.decode(info), Hex.decode(info).length, TEA_key); + byte[] reverse = reverseBytesBy8(Hex.decode(info)); + byte[] retEnBytes = MyTea_Encrypt(reverse, reverse.length, TEA_key); System.out.println("加密后为:" + Hex.toHexString(retEnBytes)); + System.out.println("加密后为:" + Hex.toHexString(reverseBytesBy8(retEnBytes) )); Hex.decode(info); String infoss = "328af9a4b8d90323819b7c635f748f26cea92e740b253f310389c610820ddee3d796ad2359abe201fa0041299aec6a1d393217191019baa2253aead50b70df"; - byte[] retDeBytes = MyTea_Decrypt(Hex.decode(infoss),Hex.decode(infoss).length, TEA_key); + byte[] retDeBytes = MyTea_Decrypt(Hex.decode(infoss), Hex.decode(infoss).length, TEA_key); System.out.println("解密后为:" + Hex.toHexString(retDeBytes)); } @@ -95,5 +102,27 @@ v[index + 1] = z; } + + public static byte[] reverseBytesBy8(byte[] src) { + int data_len = src.length; + int group_len = 8; + int residues = data_len % group_len; // 余数 + int dlen = data_len; + if (residues != 0) { + dlen = data_len + (8 - residues); + } +// System.out.println("新数据长度:"+dlen); + byte[] result = new byte[dlen]; + for (int i = 0; i < src.length; i += 4) { + for (int j = 0; j < 4; j += 1) { + if ((i + 3 - j) >= data_len) { + result[i + j] = 0x00; + } else { + result[i + j] = src[i + 3 - j]; + } + } + } + return result; + } }