Tea加密算法和XxTea加密算法
TEA(Tiny Encryption Algorithm)是一种小型的对称加密解密算法,支持128位密码,与BlowFish一样TEA每次只能加密/解密8字节数据。TEA特点是速度快、效率高,实现也非常简单。由于针对TEA的攻击不断出现,所以TEA也发展出几个版本,分别是XTEA、Block TEA和XXTEA。
TEA加密和解密时都使用一个常量值,这个常量值为0x9e3779b,这个值是近似黄金分割率,注意,有些编程人员为了避免在程序中直接出现"mov 变量,0x9e3779b",以免被破解者直接搜索0x9e3779b这个常数得知使用TEA算法,所以有时会使用"sub 变量,0x61C88647"代替"mov 变量,0x9e3779b",0x61C88647=-(0x9e3779b)。
TEA算法每一次可以操作64bit(8byte),采用128bit(16byte)作为key,算法采用迭代的形式,推荐的迭代轮数是64轮,最少32轮。
标准的16轮运算TEA,如果要改成标准的32轮运算TEA,只需修改code和decode中的n为32,并将decode中的delta左移4位改成左移5位即可。
C#的实现代码:
public static class Tea
{
public static byte[] Encrypt(byte[] data, byte[] key)
{
byte[] dataBytes;
== )
{
dataBytes = data;
}
else
{
dataBytes = ];
Array.Copy(data, , dataBytes, , data.Length);
dataBytes[data.Length] = 0x0;
}
];
uint[] formattedKey = FormatKey(key);
];
; i < dataBytes.Length; i += )
{
tempData[] = dataBytes[i];
tempData[] = dataBytes[i + ];
code(tempData, formattedKey);
Array.Copy(ConvertUIntToByteArray(tempData[]), , result, i * , );
Array.Copy(ConvertUIntToByteArray(tempData[]), , result, i * + , );
}
return result;
}
public static byte[] Decrypt(byte[] data, byte[] key)
{
uint[] formattedKey = FormatKey(key);
;
];
* ];
; i < data.Length; i += )
{
tempData[] = ConvertByteArrayToUInt(data, i);
tempData[] = ConvertByteArrayToUInt(data, i + );
decode(tempData, formattedKey);
dataBytes[x++] = (];
dataBytes[x++] = (];
}
//修剪添加的空字符
] == 0x0)
{
];
Array.Copy(dataBytes, , result, , dataBytes.Length - );
}
return dataBytes;
}
static uint[] FormatKey(byte[] key)
{
)
throw new ArgumentException("Key must be between 1 and 16 characters in length");
];
)
{
Array.Copy(key, , refineKey, , key.Length);
; k++)
{
refineKey[k] = 0x20;
}
}
else
{
Array.Copy(key, , refineKey, , );
}
];
;
; i < refineKey.Length; i += )
formattedKey[j++] = ConvertByteArrayToUInt(refineKey, i);
return formattedKey;
}
#region Tea Algorithm
static void code(uint[] v, uint[] k)
{
];
];
;
uint delta = 0x9e3779b9;
;
)
{
sum += delta;
y += (z << ) + k[] ^ z + sum ^ (z >> ) + k[];
z += (y << ) + k[] ^ y + sum ^ (y >> ) + k[];
}
v[] = y;
v[] = z;
}
static void decode(uint[] v, uint[] k)
{
;
uint sum;
];
];
uint delta = 0x9e3779b9;
/*
* 由于进行16轮运算,所以将delta左移4位,减16次后刚好为0.
*/
sum = delta << ;
)
{
z -= (y << ) + k[] ^ y + sum ^ (y >> ) + k[];
y -= (z << ) + k[] ^ z + sum ^ (z >> ) + k[];
sum -= delta;
}
v[] = y;
v[] = z;
}
#endregion
private static byte[] ConvertUIntToByteArray(uint v)
{
];
result[] = (byte)(v & 0xFF);
result[] = () & 0xFF);
result[] = () & 0xFF);
result[] = () & 0xFF);
return result;
}
private static uint ConvertByteArrayToUInt(byte[] v, int offset)
{
> v.Length) ;
uint output;
output = (uint)v[offset];
output |= (] << );
output |= (] << );
output |= (] << );
return output;
}
}
XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。在 1998 年,Markku-Juhani Saarinen 给出了一个可有效攻击 Block TEA 算法的代码,但之后很快 David J. Wheeler 和 Roger M. Needham 就给出了 Block TEA 算法的修订版,这个算法被称为 XXTEA。XXTEA 使用跟 Block TEA 相似的结构,但在处理块中每个字时利用了相邻字。它利用一个更复杂的 MX 函数代替了 XTEA 轮循函数,MX 使用 2 个输入量。
如果加密字符串长度不是 4 的整数倍,则这些实现的在加密后无法真正还原,还原以后的字符串实际上与原字符串不相等,而是后面多了一些 \0 的字符,或者少了一些 \0 的字符。原因在于 XXTEA 算法只定义了如何对 32 位的信息块数组(实际上是 32 位无符号整数数组)进行加密,而并没有定义如何来将字符串编码为这种数组。而现有的实现中在将字符串编码为整数数组时,都丢失了字符串长度信息,因此还原出现了问题。
C#的实现代码:
using System;
class XXTEA
{
public static Byte[] Encrypt(Byte[] Data, Byte[] Key)
{
)
{
return Data;
}
return ToByteArray(Encrypt(ToUInt32Array(Data, true), ToUInt32Array(Key, false)), false);
}
public static Byte[] Decrypt(Byte[] Data, Byte[] Key)
{
)
{
return Data;
}
return ToByteArray(Decrypt(ToUInt32Array(Data, false), ToUInt32Array(Key, false)), true);
}
public static UInt32[] Encrypt(UInt32[] v, UInt32[] k)
{
Int32 n = v.Length - ;
)
{
return v;
}
)
{
UInt32[] Key = ];
k.CopyTo(Key, );
k = Key;
}
UInt32 z = v[n], y = v[], delta = , e;
Int32 p, q = + / (n + );
)
{
sum = unchecked(sum + delta);
e = sum >> & ;
; p < n; p++)
{
y = v[p + ];
z = ^ y << ) + (y >> ^ z << ) ^ (sum ^ y) + (k[p & ^ e] ^ z));
}
y = v[];
z = ^ y << ) + (y >> ^ z << ) ^ (sum ^ y) + (k[p & ^ e] ^ z));
}
return v;
}
public static UInt32[] Decrypt(UInt32[] v, UInt32[] k)
{
Int32 n = v.Length - ;
)
{
return v;
}
)
{
UInt32[] Key = ];
k.CopyTo(Key, );
k = Key;
}
UInt32 z = v[n], y = v[], delta = 0x9E3779B9, sum, e;
Int32 p, q = + / (n + );
sum = unchecked((UInt32)(q * delta));
)
{
e = sum >> & ;
; p--)
{
z = v[p - ];
y = ^ y << ) + (y >> ^ z << ) ^ (sum ^ y) + (k[p & ^ e] ^ z));
}
z = v[n];
y = ] -= (z >> ^ y << ) + (y >> ^ z << ) ^ (sum ^ y) + (k[p & ^ e] ^ z));
sum = unchecked(sum - delta);
}
return v;
}
private static UInt32[] ToUInt32Array(Byte[] Data, Boolean IncludeLength)
{
Int32 n = (((Data.Length & ) == ) ? (Data.Length >> ) : ((Data.Length >> ) + ));
UInt32[] Result;
if (IncludeLength)
{
Result = ];
Result[n] = (UInt32)Data.Length;
}
else
{
Result = new UInt32[n];
}
n = Data.Length;
; i < n; i++)
{
Result[i >> ] |= (UInt32)Data[i] << ((i & ) << );
}
return Result;
}
private static Byte[] ToByteArray(UInt32[] Data, Boolean IncludeLength)
{
Int32 n;
if (IncludeLength)
{
n = (Int32)Data[Data.Length - ];
}
else
{
n = Data.Length << ;
}
Byte[] Result = new Byte[n];
; i < n; i++)
{
Result[i] = (Byte)(Data[i >> ] >> ((i & ) << ));
}
return Result;
}
}
Tea加密算法和XxTea加密算法的更多相关文章
- python实现DES加密算法和3DES加密算法
pyDes.py ############################################################################# # Documentati ...
- 加密算法和MD5等散列算法的区别(转)
本文转自http://www.cnblogs.com/eternalwt/archive/2013/03/21/2973807.html 感谢作者 1.在软件开发的用户注册功能中常出现MD5加密这个概 ...
- RSA加密算法和SSH远程连接服务器
服务器端与客户端的密钥系统不一样,称为非对称式密钥系统 RSA算法的基础是模运算x mod n,事实上: [(a mod n) + (b mod n)] mod n = (a+b) mod n [(a ...
- 利用SHA-1算法和RSA秘钥进行签名验签(带注释)
背景介绍 1.SHA 安全散列算法SHA (Secure Hash Algorithm)是美国国家标准和技术局发布的国家标准FIPS PUB 180-1,一般称为SHA-1.其对长度不超过264二进制 ...
- 介绍XXTEA加密算法及其C实现
介绍XXTEA加密算法及其C实现 http://en.wikipedia.org/wiki/XXTEA “微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA)都是分组加密算法 ...
- TEA加密
TEA(Tiny Encryption Algorithm)是一种小型的对称加密解密算法,支持128位密码,与BlowFish一样TEA每次只能加密/解密8字节数据.TEA特点是速度快.效率高,实现也 ...
- 数据的加密传输——单片机上实现TEA加密解密算法
各位大侠在做数据传输时,有没有考虑过把数据加密起来进行传输,若在串口或者无线中把所要传的数据加密起来,岂不是增加了通信的安全性.常用的加密解密算法比如DES.RSA等,受限于单片机的内存和运算速度,实 ...
- 单片机上使用TEA加密通信(转)
源:单片机上使用TEA加密通信 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境: 主机:WIN7 开发环境:MDK4.72 单片机:STM32 说 ...
- ANSI-X99MAC算法和PBOC的3DES MAC算法
仅仅要有标准的DES加密和解密算法.类似ANSI-X99MAC算法和PBOC3DES算法就非常好实现.他们都是用DES算法再经过一层算法实现的.实现原理看图就能看明确.3DES算法实现就更简单了.就是 ...
随机推荐
- SqlServer 使用小技巧
1.在sqlserver下直接画ER图 步骤:点击数据关系图 右击新建数据关系图这样就ok 了 2,查看表的设计结构或表中的数据 步骤:右击选择设计或查看前百行 3,监测程序对数据库的操作 点击工具 ...
- android WebView, WebChromeClient和WebViewClient加载网页基本用法
WebView, WebChromeClient和WebViewClient加载网页基本用法 webview是android中的浏览器控件,在一些手机应用中常会用到b/s模式去开发应用,这时webvi ...
- !!!!OpenWrt系列教程汇总
OpenWrt FAQ https://dev.openwrt.org.cn/wiki/faqs OpenWrt编译教程 完全新手教程:openwrt编译全过程(sse) 直接编译出带中文的openw ...
- 【HDU1514】Stars(树状数组)
绝对大坑.千万记住树状数组0好下标位置是虚拟节点.详见大白书P195.其实肉眼看也能得出,在add(有的也叫update)的点修改操作中如果传入0就会死循环.最后TLE.所以下标+1解决问题.上代码! ...
- Android应用开发学习之AlertDialog对话框
作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz 本文中我们通过一个例子来看AlertDialog对话框的实现,其运行效果如下: 主布局文件main.xml内容如下: ...
- 异步套接字基础:select函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET
参考:[原创]技术系列之 网络模型(三)多路复用模型 select函数 select函数: 系统提供select函数来实现多路复用输入/输出模型.原型: #include <sys/time.h ...
- python学习之路-2 初识python数据类型
数字 int(整型) 在32位机器上,整数的位数为32位,取值范围为-2**31-2**31-1,即-2147483648-2147483647 在64位系统上,整数的位数为64位,取值范围为-2** ...
- Android学习总结——TextView跑马灯效果
Android系统中TextView实现跑马灯效果,必须具备以下几个条件: 1.android:ellipsize="marquee" 2.TextView必须单行显示,即内容必须 ...
- Atitit. 最佳实践 QA----减少cpu占有率--cpu占用太高怎么办
Atitit. 最佳实践 QA----减少cpu占有率--cpu占用太高怎么办 跟个磁盘队列长度雅十,一到李80%走不行兰.... 1. 寻找线程too 多的.关闭... Taskman>> ...
- XCode中在提示窗体中对已弃用的API接口画上红线
当我们在XCode中写程序时会不断的出现相关API提示窗体,那敲起来是一个爽啊. 有时候会看到一些API已经弃用了被画上红色的横线.说明该接口已经被弃用,仍保留,但不建议使用,对弃用API实现画横线事 ...