一、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. 在C中嵌入汇编

    早前公布了C和汇编混编的温度控制器程序,收到一些朋友的询问,他们无法在自己程序中使用我的18B20的汇编子程序或无法正常通过混编后的程序编译. 其实在KEIL中嵌入汇编的方法很简单.如图一,在C文件中 ...

  2. Qt5+VS2013兼容XP方法

    用Qt5+VS2013编译程序默认配置会在XP运行时报"不是有效的Win32程序"工作需要必须要XP运行 pro文件中加一句: 复制代码 QMAKE_LFLAGS_WINDOWS ...

  3. 【Android】Android布局中实现圆角边框

    设置corners_bg.xml 设置边框圆角可以在drawable-mdpi目录里定义一个xml: <?xml version="1.0" encoding="u ...

  4. 查看登录用户who

    几个命令:wwho每隔5秒钟,就来查看hadoop是否已经登录,如登录,显示其已经登录,并退出:sleep whoami last,显示/var/log/wtmp文件,显示用户登录历史及系统重启历史  ...

  5. 【转】使用vnc连接linux服务器方便hadoop开发调试

    VNC(Virtual Network Computing)它能将完整的窗口界面通过网络,传输到另一台计算机的屏幕上. 类似的软件在Windows服务器中包含的"Terminal Serve ...

  6. mysql 编码设置

    (windows下) 打开C:\Program Files\MySQL\MySQL Server 5.0\my.ini (ubuntu下) 打开 /etc/mysql/my.cnf 在[client] ...

  7. 阻止IOS自动识别页面上的电话号码、email地址

    之前写页面的时候碰到一个很恶心的情况,在6P上数字自动变色,后来找了一些资料: 在iOS的浏览器上,他们有时候会有一些“自作聪明”,自动把页面上的一串数字识别成电话号码,这样用户不小心点击这串数字,就 ...

  8. Android Eclipse Errors

    1.The import org.apache.http.client; tip: cannot be resolved; resolve: Find library in your sdk and ...

  9. SQL Server一些常见却不太记得住的命令

    一.数据库大小查询 1. exec sp_spaceused '表名'          --(SQL统计数据,大量事务操作后可能不准)2. exec sp_spaceused '表名', true  ...

  10. _BLOCK_TYPE_IS_VALID错误

    _BLOCK_TYPE_IS_VALID宏用来检测这个内存块在当前堆上是否有效,但是这里的指针是一个临时变量,临时变量是在栈上分配的,函数清理栈时会自动回收这些内存,程序员无需管理. new 和 ma ...