TEA加密算法的文件加密和解密的实现
一、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加密算法的文件加密和解密的实现的更多相关文章
- C#使用RSA证书文件加密和解密示例
修改MSDN上的示例,使之可以通过RSA证书文件加密和解密,中间遇到一个小问题. Q:执行ExportParameters()方法时,回报CryptographicException:该项不适于在指定 ...
- Android中文件加密和解密的实现
最近项目中需要用到加解密功能,言外之意就是不想让人家在反编译后通过不走心就能获取文件里一些看似有用的信息,但考虑到加解密的简单实现,这里并不使用AES或DES加解密 为了对android中assets ...
- C#使用RSA证书文件加密和解密
public class EncrypHelp { static public byte[] RSAEncrypt(byte[] DataToEncrypt, RSAParameters RSAKey ...
- Android加密算法之AES加密和解密实现
<pre name="code" class="plain"><span style="font-family:Microsoft ...
- xxtea 文件加密与解密
加密 cocos luacompile -s src -d dst_dir -e -b xxxxx -k xxxxx --disable-compile 解密 cocos luacompile -s ...
- java spring中对properties属性文件加密及其解密
http://blog.csdn.net/yaerfeng/article/details/26561791
- Java实现文件的加密与解密
最近在做一个项目,需要将资源文件(包括图片.动画等类型)进行简单的加密后再上传至云上的服务器,而在应用程序中对该资源使用前先将读取到的文件数据进行解密以得到真正的文件信息.此策略的原因与好处是将准备好 ...
- Python加密与解密
前言 据记载,公元前400年,古希腊人发明了置换密码.1881年世界上的第一个电话 保密专利出现.在第二次世界大战期间,德国军方启用“恩尼格玛”密码机, 密码学在战争中起着非常重要的作用. 随着信息化 ...
- python 加密与解密
加密算法分类 对称加密算法: 对称加密采用了对称密码编码技术,它的特点是文件加密和解密使用相同的密钥 发送方和接收方需要持有同一把密钥,发送消息和接收消息均使用该密钥. 相对于非对称加密,对称加密具有 ...
随机推荐
- 【给你几个使用Xamarin的理由】
写在开篇前 这种代理操作,绑定影射的机制,有些极端的开发者确实难以接受.追求完美,总感觉原生的各种优点. 如果你非得较这个真,那您还是感觉补习下 Java Eclipse ,买一台Mac 恶补Obj ...
- web前端之 HTML标签详细介绍
html标签的分类 点我查看完整的html标签介绍 在html中,标签一般分为块级标签和行内标签 块级标签:块元素一般都从新行开始,它可以容纳内联元素和其他块元素,常见块元素是段落标签"p& ...
- Java的IO以及线程练习
文件的IO操作: 字节流: 输入字节流: InputStream 所有输入字节流的基类,抽象类. FileInputStream 读取文件的输入字节流. BufferedInputStream ...
- androidHandler讲解
秒钟还没有完成的话,会收到Android系统的一个错误提示 "强制关闭". 这个时候我们需要把这些耗时的操作,放在一个子线程中,因为子线程涉及到UI更新,Android主线程是 ...
- Vs2012于Linux应用程序开发(2):图案
1.1 代码提示功能 在vs中开发中,Visual Assist是一个很优秀的插件,我们仍然能够使用它进行代码的分析,但它仅仅能支持vcxprojproject,因而我们选择对vcxproj的 ...
- Coreseek:常见的问题2
1.failed to lock XXXXX.spl档 这是当你构建的指数将是一个问题,您不必打开searchd服务关闭,既然你开searchd维修,他将建立呼叫xxx.spl临时文件,施工时的指数会 ...
- IOS总结_无需自己定义UITabbar也可改变UITabbarController的背景和点击和的颜色
在application: application didFinishLaunchingWithOptions: launchOptions 增加以下代码就能够实现对tabbar的颜色的改动 //设定 ...
- Flashback Query(函数示例)
Flashback Query 函数,存储过程,包,触发器等对象Flashback Drop 可以闪回与表相关联的对象, 如果是其他的对象,比如function,procedure,trigger等. ...
- EasyUI 1.3.1以下的组合验证
适用于EasyUI 1.3.1以下的, 1.3.2已经自带组合验证(如validType:['validator1','validator2']) $.extend($.fn.validatebox. ...
- ASP.NET网站与ASP.NET应用程序的区别
我们使用VS做ASP.NET的时候,可以选择新建ASP.NET应用程序,同时也可以新建ASP.NET网站,两者有什么具体区别呢?今天真是很幸运,比别人多上了老师一节课,讲的是这两者之间的一些区别.我学 ...