使用tea算法对数据进行加密
使用tea算法对数据进行加密
对QQ协议进行分析过的同学可能知道,QQ的数据传输是使用tea算法进行的加密。
tea算法是一种对称加密算法,特点是速度快,代码量小(加密、解密的核心算法总共才20来行)。算法的安全性虽然不比AES,但其算法的破译难度取决于其迭代的次数。网上说QQ是16次迭代,推荐的迭代次数是64次。我就对这些简洁小巧的事物没有抗拒力,于是在网上搜索一下其代码,研究一下。
找到了一个别人封装好的类,很好用,我一会打包起来给大家。
我对代码进行了处理,写了一个简单的加密字符串的软件。
首先引用了网上的一个类,很简洁的90行代码,其中加密的方法是:
TEA tea(key, TIMES, false);
tea.encrypt(plain, crypt);
解密的方法是:
TEA tea(key, TIMES, false);
tea.decrypt(crypt, plain);
构造函数中传入密钥key,TIMES是迭代次数,我用的64次,第三个参数是“是否专为网络序”,如果加密完成后的密文不在网络上传输的话,就填false。
encrypt方法对密文进行加密,plain是明文,crypt是输出密文的缓冲区。而decrypt方法正好相反。
下面是几点要注意的:
第一,plain、key、crypt三个参数类型都是byte *,也就unsigned char *,里面保存的是二进制码,是不能直接输出在屏幕上的,所以你如果要加密字符串,输出hex,就得加一些代码处理一下。如果大家加密一个文件的话,就不用处理了。
第二,key长度16bit,所以我用了一个md5处理之。将我们输入的任意长度的字符串先hash成md5,再作为一个16bit的key传入tea的构造函数。
第三,加密时,明文长度必须是8bit,于是我把明文分成许多8bit的段,将每段密文加密。如果密文密文长度不是8的倍数,则我会在最后一段明文后面补随机二进制位,凑成8bit。所以一段明文加密出来的结果可能不相同,但不相同的一定是最后8bit,前面都应该是一样的。而最后8bit中有效长度,我就放在密文的第一位。所以密文一定是奇数长度。
我在网上看QQ的TEA加密是这样两个技巧:和我类似补随机二进制位补齐8的倍数,但采用了交织算法:消息被分为多个加密单元,每一个加密单元都是8字节,使用TEA进行加密,加密结果与下一个加密单元做异或运算后再作为待加密的明文。
这样感觉会更加复杂和安全一点,但我嫌麻烦就没这么处理了。如果对安全性要求更高的同学可以自己下去稍微一改。
我把源文件打包给大家,里面包含了我的整个工程。附件中自己下。大家可以根据自己的需要进行修改。
附件:tea.zip
- 2014上半年国内安卓银行应用隐私泄露和安全隐患研究报告
- Do You Kown Asp.Net Core -- Asp.Net Core 2.0 未来web开发新趋势 Razor Page
- Metasploitable2使用指南
- 在渗透测试中使用fuzz技术(附windows安装指南)
- 黑了记者:写个恶意软件玩玩(二)
- 开源BUG跟踪平台JIRA目录遍历漏洞分析
- 黑了记者:写个恶意软件玩玩(一)
- 使用 Python 工具 Locust 进行负载测试
- 玩转Google的XSS游戏
- iOS基于GPUImage的图像形变设计(简单形变部分)
- 不错的node.js入门
- Sql语句收藏
- View-ForumsGroupView.ascx 读解
- GoAgent漏洞可能导致中间人攻击
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法