最近在使用Java实现QQ的基本通讯协议,QQ的通讯协议中使用MD5算法两次加密密码,并将通讯中的所有数据包使用TEA算法进行加密。MD5加密可以通过Java API提供的MessageDigest直接进行,而TEA加密则需自己编写。
TEA加密每次使用128bit密钥加密64bit数据,生成加密数据亦为64bit,为典型的对称加密算法。该算法使用C语言实现非常简单,但使用Java进行实现时,受制于Java的特性,在实现上稍有复杂。
代码如下:
public class TEA { /** * value is 0xffffffff * filter long to unsigned int */ public static Long UIFILTER = Long.decode("0xffffffff"); /** * value is 0xff * filter short to unsigned byte */ public static Short UBFILTER = Short.decode("0xff"); /** * Encipher method * 64bit plaintext, 128bit key * @param v Plaintext * @param k Key * @return */ public static Short[] encipher(Short [] v, Short [] k) { Long[] vL = shortToLong(v); Long[] kL = shortToLong(k); Long[] wL = new Long[vL.length]; Short[] w = null; long y = vL[0]; long z = vL[1]; long a = kL[0]; long b = kL[1]; long c = kL[2]; long d = kL[3]; long n = 0x10; /* do encrypt 16 (0x10) times */ long sum = 0; long delta = Long.decode("0x9E3779B9"); /* 0x9E3779B9 - 0x100000000 = -0x61C88647 */ while (n-- > 0) { sum += delta; sum &= UIFILTER; y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); y &= UIFILTER; z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); z &= UIFILTER; } wL[0] = y; wL[1] = z; w = longToShort(wL); return w; } /** * Decipher method * 64bit ciphertext, 128bit key * @param v Ciphertext * @param k Key * @return */ public static Short[] decipher(Short [] v, Short [] k) { Long[] vL = shortToLong(v); Long[] kL = shortToLong(k); Long[] wL = new Long[vL.length]; Short[] w = null; long y = vL[0]; long z = vL[1]; long a = kL[0]; long b = kL[1]; long c = kL[2]; long d = kL[3]; long n = 0x10; /* sum = delta << 4, in general sum = delta * n */ long sum = Long.decode("0xE3779B90"); long delta = Long.decode("0x9E3779B9"); // use filter to get unsigned int // use ~x +1 instead -x while (n-- > 0) { z += (~(((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d)) + 1); z &= UIFILTER; y += (~(((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b)) + 1); y &= UIFILTER; sum += ((~delta) + 1); sum &= UIFILTER; } wL[0] = y; wL[1] = z; w = longToShort(wL); return w; } /** * convert bytes to longs, put every 4 bytes to 1 long * use long instead unsigned int * use short instead unsigned byte * @param source - the Short [] that save unsigned bytes to convert * @return the Long [] save unsigned int */ public static Long [] shortToLong(Short [] source){ int sourlen = source.length; int turn = sourlen / 4; // how many turns int remainder = sourlen % 4; // how many bytes in first turn int tarlen = turn + (remainder == 0 ? 0 : 1); Long [] target = new Long[tarlen]; for(int i = 0; i < target.length; i++){ target[i] = Long.parseLong("0"); } int iter = 0; int turnIter = 0; for(turnIter = 0; turnIter < tarlen; turnIter++){ for(iter = 0; iter < 4; iter++){ target[turnIter] <<= 8; if((turnIter != turn - 1) || ((turnIter == turn - 1) && (iter < remainder || remainder == 0))) target[turnIter] += source[turnIter * 4 + iter]; } } return target; } /** * convert longs to bytes * cut 1 long(32bit valid to instead unsigned int) to 4 short(8bit valid to instead unsigned byte) * use long instead unsigned int * use short instead unsigned byte * @param source - the Long [] that save unsigned int to convert * @return the Short [] that save unsigned bytes */ public static Short [] longToShort(Long [] source){ int sourlen = source.length; Short [] target = new Short[sourlen * 4]; int turn = target.length % 4; int iter = 0; int move = 0; for(iter = 0; iter < target.length; iter++){ move = 8 * (3 - (iter % 4)); target[iter] = Short.parseShort(Long.toString((source[iter / 4] & (UBFILTER << move)) >> move)); } return target; } } [/code] 代码中需要注意的几点如下: 由于Java种没有无符号数的概念,故如int, long, byte等基础类型其最高位均为符号位,故不能使用该种类型进行无符号运算。本代码中使用long代替unsigned int,使用short代替unsigned byte。 相 对C语言代码,在解密时不使用减法,而是用取反加一的方式将减法转换为加法。这是由于Java中Long类型是有符号的,其进行的计算亦为有符号计算。若 被减数小于减数时,减法结果将为负数,这不符合无符号减法的规则。转化为加法运算后,将其高位溢出,则可得无符号减法的结果。 由于Java中不允许高位溢出,会抛出异常,故高位溢出需要手工完成,即将运算结果与0xffffffff或0xff进行与运算(视具体类型而定)。 测试类如下: [code=java] public class TestPoint { public static void main(String [] args){ Long[] keyLong = new Long[4]; //加密解密所用的KEY keyLong[0] = Long.decode("0x789f5645"); keyLong[1] = Long.decode("0xf68bd5a4"); keyLong[2] = Long.decode("0x81963ffa"); keyLong[3] = Long.decode("0x458fac58"); Short[] key = TEA.longToShort(keyLong); Short[] info = new Short[]{ 1, 2, 3, 4, 5, 6, 7, 8 }; System.out.print("原数据:"); for(Short i : info) System.out.print(i + " "); System.out.println(); Short[] secretInfo = TEA.encipher(info, key); System.out.print("加密后的数据:"); for(Short i : secretInfo) System.out.print(i + " "); System.out.println(); Short[] decryptInfo = TEA.decipher(secretInfo, key); System.out.print("解密后的数据:"); for(Short i : decryptInfo) System.out.print(i + " "); } }
相关推荐
TEA加密算法Java实现.txt
用java实现了Tea加密,解密过程。经过C项目,java项目对接测试通过
TEA加密算法的C/C++实现 TEA加密算法是Feistel密码的一种变体,由David Wheeler和Roger Needham在1994年提出。该算法的特点是速度快、代码简洁、安全性高。TEA加密算法的C/C++实现提供了一个基于TEA算法的加密和...
总的来说,这个C++代码示例提供了一个实践TEA加密算法的平台,同时也包含了一个基本的性能评估机制。对于学习密码学和软件开发的学生来说,这是一个很好的学习资源,可以帮助他们深入理解加密算法的工作方式,以及...
《C++实现TEA加密算法详解及应用》 TEA(Tiny Encryption Algorithm)是一种轻量级的加密算法,由David Wheeler和Roger Needham在1994年提出。它的设计目标是简单、快速且适用于资源有限的环境。本文将详细介绍如何...
通过这个教程,你将了解如何在易语言环境下用汇编语言实现16轮TEA加密算法,这对于理解加密算法的内部工作原理以及优化代码性能具有重要意义。同时,这也是对易语言和汇编语言结合使用的一个实践案例,能提升你在低...
在提供的压缩包中,"TEA介绍及数据加密算法之程序代码.doc"可能包含关于TEA算法的详细解释,包括其工作原理、伪代码和可能的C/C++或Java等编程语言的实现。文档可能还会讨论如何在Windows环境下集成和测试这些代码,...
由于单片机通常具有较小的内存和较低的计算能力,因此在单片机上实现像DES(Data Encryption Standard)或RSA这样的复杂加密算法可能较为困难。而TEA算法以其简单的结构和较高的执行效率,成为了单片机加密的良好...
XXTEA(Extreme eXtended TEA)是一种块加密算法,由David Wheeler和Roger Needham在1994年提出。它是在TEA(Tiny Encryption Algorithm)的基础上改进的,提高了安全性和性能。XXTEA算法是面向小整数序列的,通常...
本篇文章将围绕"邮件加密和发送程序"这一主题,深入探讨JMail组件以及TEA加密算法在邮件安全中的应用。 首先,我们要了解JMail组件。JMail是一款广泛应用于Java平台的邮件发送库,它提供了丰富的功能,使得开发者...
利用java编写的加解密集成工具,集成了凯撒,base64,html等多种编解码,加解密,支持自定义python脚本。CTF比赛实战工具,简明易用。
XXTEA(Extreme eXtended TEA,极度扩展的TEA)是一种简单的加密算法,由David Wheeler和Roger Needham在1994年提出。它是对Tiny Encryption Algorithm(TEA)的一种改进,旨在解决TEA存在的微小弱点。XXTEA在保持...
由于标签为空,我们无法直接获取更多上下文信息,但我们可以根据"压缩包子文件的文件名称列表"——"csharp"来推测,这个压缩包可能包含了C#编写的源代码文件,比如.cs文件,它们可能是实现或演示TEA加密算法的代码。...
然后,通过查看源代码,特别是核心算法实现的类,可以了解TEA加密算法的Java实现。测试代码可以帮助理解算法的工作原理,并验证其正确性。如果项目使用了构建工具,如Maven或Gradle,你可以运行`mvn install`或`...
这个项目对于学习和理解编译过程以及TEA加密算法的实现非常有价值,同时也可能包含了一些关于如何在实际项目中应用这些技术的示例。通过阅读源码、运行测试并查看文档,开发者可以深入学习编译原理和加密算法的实践...
但通常在Java社区中,"TEA"不直接与游戏相关,它可能指的是一种特定的加密算法(Tiny Encryption Algorithm),这与游戏编程不太直接相关,因此在此我们将忽略这个标签。 压缩包内的文件名为"Silent.jad"和"Silent....
总的来说,xxteac是一个基于XXTEA加密算法的开源软件,它提供了一个加密和解密的工具,适用于那些寻求轻量级加密解决方案的用户。开源社区的参与和贡献使得该软件能够保持更新和改进,尽管在当今的安全环境中,XXTEA...