tmp&#61; toUInt32(toUInt32(v0 <<4) &#43;k2);
v1&#61; toUInt32( v1 - toUInt32(tmp ^ toUInt32(v0 &#43; sum) ^ toUInt32((v0 >> 5) &#43;k3)) );
tmp&#61; toUInt32(toUInt32(v1 <<4) &#43;k0);
v0&#61; toUInt32( v0 - toUInt32(tmp ^ toUInt32(v1 &#43; sum) ^ toUInt32((v1 >> 5) &#43;k1)) );
sum&#61; toUInt32(sum -delta);
}byte[] b0 &#61; long_to_bytes(v0, 4);byte[] b1 &#61; 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 数组&#xff0c;如果 len 为 4&#xff0c;则只返回低32位的4个byte
*&#64;paramn 需要转换的long
*&#64;paramlen 若为4&#xff0c;则只返回低32位的4个byte&#xff0c;否则返回8个byte
*&#64;return转换后byte数组*/
private static byte[] long_to_bytes(long n, intlen) {byte a &#61; (byte)((n & BYTE_4) >> 24);byte b &#61; (byte)((n & BYTE_3) >> 16);byte c &#61; (byte)((n & BYTE_2) >> 8);byte d &#61; (byte)(n &BYTE_1);if (len &#61;&#61; 4) {return new byte[] {a, b, c, d};
}byte ha &#61; (byte)(n >> 56);byte hb &#61; (byte)((n >> 48) &BYTE_1);byte hc &#61; (byte)((n >> 40) &BYTE_1);byte hd &#61; (byte)((n >> 32) &BYTE_1);return new byte[] {ha, hb, hc, hd, a, b, c, d};
}/*** 将4个byte转为 Unsigned Integer 32&#xff0c;以 long 形式返回
*&#64;parambs 需要转换的字节
*&#64;return返回 long&#xff0c;高32位为0&#xff0c;低32位视为Unsigned Integer*/
private static long bytes_to_uint32(byte[] bs) {return ((bs[0]<<24) & BYTE_4) &#43;((bs[1]<<16) & BYTE_3) &#43;((bs[2]<<8) & BYTE_2) &#43;(bs[3] &BYTE_1);
}/*** 将long的高32位清除&#xff0c;只保留低32位&#xff0c;低32位视为Unsigned Integer
*&#64;paramn 需要清除的long
*&#64;return返回高32位全为0的long*/
private static long toUInt32(longn) {return n &UINT32_MAX;
}//-------------------------------------------------------//以下 是用于Debug的函数//-------------------------------------------------------
private static void println_array(byte[] b) {for (bytex : 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();
}*/
private static voidtest() {
}public static voidmain(String[] args) {//byte[] bs &#61; 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));//
//
TEA t &#61; newTEA();byte[] pnt &#61; new byte[] {0x00, 0x00, 0x00, 0x20,0x00, 0x00, 0x00, 0x10};byte[] k &#61; new byte[] {0x00, 0x00, 0x00, 0x04,0x00, 0x00, 0x00, 0x03,0x00, 0x00, 0x00, 0x02,0x00, 0x00, 0x00, 0x01};
t.setKey(k);//byte[] enc &#61; t.encrypt(v, k);//byte[] dec &#61; t.decrypt(enc, k);
byte[] enc &#61;t.encrypt_group(pnt);//byte[] enc &#61; new byte[] {(byte) 0xC1, (byte) 0xC6, 0x48, 0x7A, (byte) 0x9E, 0x6F, (byte) 0xF2, 0x56};
byte[] dec &#61;t.decrypt_group(enc);//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 &#61; (byte)0xEF;//println_array(new long[] { (b <<24) & 0xFF000000L } );//println_array(new long[] {(byte)0xEF});//String[] plain &#61; new String[32];//for (i &#61; 0; i <32; i&#43;&#43;) {//plain[i] &#61; String.//}//byte[] pnt &#61; "123".getBytes();//byte[] enc &#61; encrypt(pnt, k);//byte[] dec &#61; decrypt(enc, k);
System.out.println("Key:");
println_array(k);
System.out.println("Encrypt And Decrypt:");
println_array(pnt);
println_array(enc);
println_array(dec);
}
}