一、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. Postgres的用户认证

    我们先来讲讲postgresql的用户认证吧. 我想我们有必要明白以下几个问题: 第一.postgresql的用户和操作系统的用户没有任何直接的的关系.虽然在postgaresql的初始安装中,它会有 ...

  2. Cmake中的find_package功能

    find_package其实在windows下扮演的角色并不是很重要.在Unix下就非常重要了,find_package可以根据cmake内置的.cmake的脚本去找相应的库的模块,当然,内建了很多库 ...

  3. Linux文件夹执行权限

    在Linux中,文件有三种权限--可读,可写,可执行.目录也有三种权限--可读,可写,可执行.但是实际上他们有着不同的意义. 对于文件: 可读 :表示可以读取文件里的数据: 可写 :表示可以改变和删除 ...

  4. hdu 1829 A Bug's Life(并查集)

                                                                                                    A Bu ...

  5. Java Fuck Bignumber

    为了熟悉java , 开一套poj大数处理的题来写. ------------------------------------------------------------------- A: (1 ...

  6. PHP 字符串替换 substr_replace 与 str_replace 函数

    PHP 字符串替换 用于从字符串中替换指定字符串. 相关函数如下: substr_replace():把字符串的一部分替换为另一个字符串 str_replace():使用一个字符串替换字符串中的另一些 ...

  7. DBA 经典面试题(3)

    这里的回答并不是十分全面,这些问题可以通过多个角度来进行解释,也许你不必在面试过程中给出完全详尽的答案,只需要通过你的解答使面试考官了解你对ORACLE概念的熟悉程度.   1.解释冷备份和热备份的不 ...

  8. [bzoj1003][ZJOI2006][物流运输] (最短路+dp)

    Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格 ...

  9. mycat实例(2)

    全局序列号 数据切分后,原有的关系数据库中的主键约束在分布式条件下将无法使用,因此需要引入外部机制保证数据唯一性标识,这种保证全局性的数据唯一标识的机制就是全局序列号(sequence). 1. 本地 ...

  10. windows 和linux 同步api对比

    初始化临界区 (win) InitializeCriticalSection(RTL_CRITICAL_SECTION &rtl_critial_section) (linux) pthrea ...