一、TEA加密算法简介

TEA加密算法是由英国剑桥大学计算机实验室提出的一种对称分组加密算法。它采用扩散和混乱方法,对64位的明文数据块,用128位密钥分组进行加密,产生64位的密文数据块,其循环轮数可根据加密强度需要设定。

文件加密过程中,加法运算和减法运算用作可逆的操作。算法轮流使用异或运算和加法运算提供非线性特性,双移位操作使密钥和数据的所有比特重复地混合,最多16轮循环就能使数据或密钥的单个比特的变化扩展到接近32比特。因此,当循环轮数达到16轮以上时,该算法具有很强的抗差分攻击能力,128比特密钥长度可以抗击穷举搜索攻击,该算法设计者推荐算法迭代次数为32轮。

TEA加密算法本身非常简练,无论采用软件方式还是硬件方式,实现起来都非常容易。

1、TEA加密算法的C语言程序

加密过程

staticvoidcode(uint[]v,uint[]k)
{
    uinty=v[];
    uintz=v[];        //v(0)和v(1)为明文块
    uintsum=;
    uintdelta=0x9e3779b9;
    uintn=;         //n=32
    )
    {
        sum+=delta;
        y+=(z<<)+k[]^z+sum^(z>>)+k[];
        z+=(y<<)+k[]^y+sum^(y>>)+k[];
    }
    v[]=y;
    v[]=z;            //v(0)和v(1)为密文块

}

解密过程:

staticvoiddecode(uint[]v,uint[]k)
{
    uintn=;
    uintsum;
    uinty=v[];
    uintz=v[];
    uintdelta=0x9e3779b9;
    sum=delta<<;    //由于进行16轮运算,所以将delta左移4位,减16次后刚好为0,32轮运算则左移5位

    )
    {
        z=(y<<)+k[]^y+sum^(y>>)+k[];
        y=(z<<)+k[]^z+sum^(z>>)+k[];
        sum=delta;
    }
    v[]=y;
    v[]=z;
}

其中,64比特数据分为v[0],v[1]两个32比特数,128比特数据分为k[0]~k[3]的4个32比特数,delta由黄金数得到:delta=(25-1)231=0x9E3779B9。每一轮使用delta的不同倍数,使得倍数的所有比特频繁地变化。与DES相比,TEA采用了较长的密钥,可变的循环轮数,不存在DES算法中S盒的“陷门”问题,具有更好的安全性能。另外,无论是硬件实现还是软件实现,TEA都比DES更简单。因此,TEA是一种较为优秀的对称分组加密算法。

二、TEA加密算法的文件加解密实现

1、文件加密过程实现

(1)文件的完整读取

用string[]lines=System.IO.File.ReadAllLines(String)实现打开一个文件,并确保将文件的所有行都读入一个字符串数组,关闭该文件,得到完整的文件内容。

(2)文件内容、密钥预处理

读取的文件内容很可能包含大量的文本信息,这些文本信息可能包含中英文和一些标点符号,由此在进行加密前需要进行统一的编码格式转换,然后转换成字节数组,如:System.Text.Encodingchs=System.Text.Encoding.GetEncoding(_gb2312!);byte[]bytes=chs.GetBytes(String);以便加密可以顺利进行。使用不同的字符编码得到的字节数组不尽相同,例如,使用UTF8编码得到的字符串数组就比使用gb2312编码的略有膨胀。同样用该办法将密钥转换成字节数组。

(3)无符号整数数组与字节数组互转方法

为了使密钥和密文更难被破解和方便运用TEA加密算法,在密钥转换和内容转换时设计了两项办法。

a、字节数组转无符号整数

根据传入参数#字节数组V_字节数组下标i,判断如果下标加4后长度大于字节数组长度返回0;若小于字节数组长度,则执行如下或运算操作:

uint output;

output=(uint)v[i];
output|=(]<<);
output|=(]<<);
output|=(]<<);
return output;

即将字节数组中的下标位与下标后一位左移8位后进行或运算,将所得结果与下标后第二位左移16位后进行或运算,再将结果与下标后第三位左移24位后进行或运算,最终结果为一无符号整数。

b、无符号整数转字节数组

首先创建长度为4的字节数组V,然后将无符号整数与十六进制的0xFF进行与运算,所得结果存入V[0];将无符号整数右移动8位后与0xFF进行与运算,所得结果存入V[1];将无符号整数右移动16位后与0xFF进行与运算,所得结果存入V[2];将无符号整数右移动24位后与0xFF进行与运算,所得结果存入V[3];至此完成转换,经过验证,能正确还原字节数组。

(4)TEA加密算法加密

TEA加密算法的密钥长度为128位,首先判断密钥字节数组长度,如密钥字节数组长度小于16位,则将其长度扩展到16位,多余的位数用16进制的0×20代替(转换成10进制为32,ASCII码表的32对应为键盘的空格键,即用个空格代替)。然后将字节数组切分成4份,每4位为一新的字节数组,采用字节数组转无符号整数方法,完成密钥格式化成长度为4的无符号整数数组。

判断明文字节数组长度是否为偶数,如不是则用0×0增补一位。依次取两位,用字节数组转无符号整数方法转换成2位无符号整数数组,与密钥无符号整数数组进行TEA加密算法,重复上述操作,直到数组所有字节加密完成,复制进新的密文字节数组,至此完成文件加密过程。加密过程如图1所示。

2、文件解密过程实现

相比文件加密过程,文件解密过程较简单。首先运用加密过程的办法对密钥进行预处理,得到长度为4的无符号整数数组。同样运用加密过程使用的办法处理密文字节数组,依次取两位,用字节数组转无符号整数方法转换成2位无符号整数数组,与密钥无符号整数数组进行TEA解密算法,重复上述操作,直到数组所有字节解密完成,复制进新的密文字节数组,然后判断最末位是否0×0,如是则修剪最末位,得到明文字节数组,再进行转换则可以还原明文。

3、文件加密程序运行效果如下

小知识之陷门计算机操作的陷门设置是指进入程序的秘密入口,它使得知道陷门的人可以不经过通常的安全检查访问过程而获得访问。程序员为了进行调试和测试程序,已经合法地使用了很多年的陷门技术。当陷门被无所顾忌的程序员用来获得非授权访问时,陷门就变成了威胁。对陷门进行操作系统的控制是困难的,必须将安全测量集中在程序开发和软件更新的行为上才能更好地避免这类攻击。

TEA加密算法的文件加密和解密的实现的更多相关文章

  1. C#使用RSA证书文件加密和解密示例

    修改MSDN上的示例,使之可以通过RSA证书文件加密和解密,中间遇到一个小问题. Q:执行ExportParameters()方法时,回报CryptographicException:该项不适于在指定 ...

  2. Android中文件加密和解密的实现

    最近项目中需要用到加解密功能,言外之意就是不想让人家在反编译后通过不走心就能获取文件里一些看似有用的信息,但考虑到加解密的简单实现,这里并不使用AES或DES加解密 为了对android中assets ...

  3. C#使用RSA证书文件加密和解密

    public class EncrypHelp { static public byte[] RSAEncrypt(byte[] DataToEncrypt, RSAParameters RSAKey ...

  4. Android加密算法之AES加密和解密实现

    <pre name="code" class="plain"><span style="font-family:Microsoft ...

  5. xxtea 文件加密与解密

    加密 cocos luacompile -s src -d dst_dir -e -b xxxxx -k xxxxx --disable-compile 解密 cocos luacompile -s ...

  6. java spring中对properties属性文件加密及其解密

    http://blog.csdn.net/yaerfeng/article/details/26561791

  7. Java实现文件的加密与解密

    最近在做一个项目,需要将资源文件(包括图片.动画等类型)进行简单的加密后再上传至云上的服务器,而在应用程序中对该资源使用前先将读取到的文件数据进行解密以得到真正的文件信息.此策略的原因与好处是将准备好 ...

  8. Python加密与解密

    前言 据记载,公元前400年,古希腊人发明了置换密码.1881年世界上的第一个电话 保密专利出现.在第二次世界大战期间,德国军方启用“恩尼格玛”密码机, 密码学在战争中起着非常重要的作用. 随着信息化 ...

  9. python 加密与解密

    加密算法分类 对称加密算法: 对称加密采用了对称密码编码技术,它的特点是文件加密和解密使用相同的密钥 发送方和接收方需要持有同一把密钥,发送消息和接收消息均使用该密钥. 相对于非对称加密,对称加密具有 ...

随机推荐

  1. Could not open a connection to your authentication agent

    执行ssh-add ~/.ssh/rsa  就会遇到上述错误了 解决方案: 先执行  eval `ssh-agent`  (是-键上的那个`) 再执行 ssh-add ~/.ssh/rsa成功 ssh ...

  2. Shell工具:jsondiff.sh

    逻辑很简单,无非就是通过curl在不同的服务器上取得结果集,然后diff即可,不过这里有几点需要注意的地方:首先,JSON就一行,直接 diff会失去意义:其次,JSON中汉字会被编码,不利于查看:另 ...

  3. linux网址

    1. 上海爱墨电子科技有限公司 http://www.shaimo.cn/showproduct.asp?piccat_id=196&pic_id=780 2. http://lxr.free ...

  4. Divide and Conquer.(Merge Sort) by sixleaves

    algo-C1-Introductionhtml, body {overflow-x: initial !important;}html { font-size: 14px; }body { marg ...

  5. poj1363

    堆栈的模拟,给定序列,1,2,3,4,...判断堆栈出栈顺序是否合法 5 //5个数入栈1 2 3 4 5 //出栈顺序5 4 1 2 3 //出栈顺序0 //5个数的结束6 //6个数的入栈6 5 ...

  6. 2016"百度之星" - 资格赛(Astar Round1) 1001

    思路:第一个做法就是:每读入起始位置i和结束位置j,就从这位置i到位置j计算,可是TLE了,后面我想想要是我输入一个最长的字符串,且以最大次数计算开始位置1到结束位置100000,那么这计算量是很大的 ...

  7. hdu 5288 OO’s Sequence(计数)

    Problem Description OO has got a array A of size n ,defined a function f(l,r) represent the number o ...

  8. Python 异步IO、IO多路复用

    事件驱动模型 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...

  9. web前端 - 模态对话框

    代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8& ...

  10. c++之 数组

    数组的定义 数组用于表示一组数值,例如: char arr[5]; 其中,arr称为"数组变量",简称"数组".它表示5个char型数据,我们把每一个数据称为一 ...