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 new file mode 100644 index 0000000..7968952 --- /dev/null +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/safe/impl/Teas.java @@ -0,0 +1,99 @@ +package com.casic.missiles.parser.safe.impl; + +import org.bouncycastle.util.encoders.Hex; +import org.springframework.stereotype.Component; + +/** + *
+ *
+ * Tea算法 + * 每次操作可以处理8个字节数据 + * KEY为16字节,应为包含4个int型数的int[],一个int为4个字节 + * 加密解密轮数应为8的倍数,推荐加密轮数为64轮 + * + * @author hyl + * @version v1.0: Tea.java, v 0.1 2021/3/12 13:48 $ + */ +@Component("tea") +public class Teas { + + public static byte[] MyTea_Encrypt(byte[] MyTeaContent, int ByteLen, byte[] MyTeakey) { + System.out.println("加密函数:"); + long[] value = MyUtils.byteToInt(MyTeaContent, MyTeaContent.length); + long[] key = MyUtils.byteToInt(MyTeakey, MyTeakey.length); + int num = ByteLen / 8; + for (int i = 0; i < num; i++) { + encrypt(value, i * 2, key); + } + int len = ByteLen / 4; + return MyUtils.IntToBytes(value, len); + } + + /** + * 参数为8字节的明文输入和16字节的密钥,输出8字节密文 + * + * @param MyTeaSecContent + * @param MyTeakey + * @return + */ + public static byte[] MyTea_Decrypt(byte[] MyTeaSecContent, int ByteLen, byte[] MyTeakey) { + System.out.println("解密函数:"); + long[] value = MyUtils.byteToInt(MyTeaSecContent, MyTeaSecContent.length); + long[] key = MyUtils.byteToInt(MyTeakey, MyTeakey.length); + int num = ByteLen / 8; + for (int i = 0; i < num; i++) { + decrypt(value, i * 2, key); + } + int len = ByteLen / 4; + return MyUtils.IntToBytes(value, len); + } + + 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 = {48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102}; + String info = "6000002000013310000050000300010160000009000102c502d1e200040000000060000511000200ec600005130002ffa56000051600020002"; +// String key = "000102030405060708090a0b0c0d0e0f"; + int a = info.length() / 2 % 8; + if (a != 0) { + for (int i = 0; i < 8 - a; i++) { + info += "00"; + } + } + byte[] retEnBytes = MyTea_Encrypt(Hex.decode(info), Hex.decode(info).length, TEA_key); + System.out.println("加密后为:" + Hex.toHexString(retEnBytes)); + Hex.decode(info); + String infoss = "328af9a4b8d90323819b7c635f748f26cea92e740b253f310389c610820ddee3d796ad2359abe201fa0041299aec6a1d393217191019baa2253aead50b70df"; + byte[] retDeBytes = MyTea_Decrypt(Hex.decode(infoss),Hex.decode(infoss).length, TEA_key); + System.out.println("解密后为:" + Hex.toHexString(retDeBytes)); + } + + + public static void encrypt(long[] v, int index, long[] k) { + long y = v[index], z = v[index + 1], sum = 0, i; + int delta = DELTA; + for (i = 0; i < 32; i++) { + sum += delta; + y += ((z << 4) + k[0]) ^ (z + sum) ^ ((sum >> 5) + k[1]); + z += ((y << 4) + k[2]) ^ (y + sum) ^ ((sum >> 5) + k[3]); + } + v[index] = y; + v[index + 1] = z; + } + + private static final int DELTA = 0x9e3779b9; + + public static void decrypt(long[] v, int index, long[] k) { + long y = v[index], z = v[index + 1], sum = 0xC6EF3720, i; + int delta = DELTA; + for (i = 0; i < 32; i++) { + z -= ((y << 4) + k[2]) ^ (y + sum) ^ ((sum >> 5) + k[3]); + y -= ((z << 4) + k[0]) ^ (z + sum) ^ ((sum >> 5) + k[1]); + sum -= delta; + } + v[index] = y; + v[index + 1] = z; + } + +} +