首页
|
新闻
|
新品
|
文库
|
方案
|
视频
|
下载
|
商城
|
开发板
|
数据中心
|
座谈新版
|
培训
|
工具
|
博客
|
论坛
|
百科
|
GEC
|
活动
|
主题月
|
电子展
注册
登录
论坛
博客
搜索
帮助
导航
默认风格
uchome
discuz6
GreenM
»
MCU 单片机技术
»
ARM
» TEA加密算法的文件加密和解密的实现
返回列表
回复
发帖
发新话题
发布投票
发布悬赏
发布辩论
发布活动
发布视频
发布商品
TEA加密算法的文件加密和解密的实现
发短消息
加为好友
yuyang911220
当前离线
UID
1029342
帖子
9914
精华
0
积分
4959
阅读权限
90
在线时间
286 小时
注册时间
2014-5-22
最后登录
2017-7-24
论坛元老
UID
1029342
性别
男
1
#
打印
字体大小:
t
T
yuyang911220
发表于 2016-8-15 11:00
|
只看该作者
TEA加密算法的文件加密和解密的实现
剑桥大学
,
文件加密
,
计算机
,
实验室
,
英国
一、TEA加密算法简介
TEA加密算法是由英国剑桥大学计算机实验室提出的一种对称分组加密算法。它采用扩散和混乱方法,
对64位的明文数据块,用128位密钥分组进行加密,产生64位的密文数据块
,其循环轮数可根据加密强度需要设定。
文件加密过程中,加法运算和减法运算用作可逆的操作。算法轮流使用异或运算和加法运算提供非线性特性,双移位操作使密钥和数据的所有比特重复地混合,最多16轮循环就能使数据或密钥的单个比特的变化扩展到接近32比特。因此,当循环轮数达到16轮以上时,该算法具有很强的抗差分攻击能力,128比特密钥长度可以抗击穷举搜索攻击,该算法设计者推荐算法迭代次数为32轮。
TEA加密算法本身非常简练,无论采用软件方式还是硬件方式,实现起来都非常容易。
1、TEA加密算法的C语言程序
加密过程
[url=]
[/url]
staticvoidcode(
uint
[]v,
uint
[]k){ uinty
=v[
0
]; uintz
=v[
1
];
//
v(0)和v(1)为明文块
uintsum=
0
; uintdelta
=
0x9e3779b9
; uintn
=
16
;
//
n=32
while
(n-->
0
) { sum
+=
delta; y
+=(z<<
4
)+k[
0
]^z+sum^(z>>
5
)+k[
1
]; z
+=(y<<
4
)+k[
2
]^y+sum^(y>>
5
)+k[
3
]; } v[
0
]=
y; v[
1
]=z;
//
v(0)和v(1)为密文块
}
[url=]
[/url]
解密过程:
[url=]
[/url]
staticvoiddecode(
uint
[]v,
uint
[]k){ uintn
=
16
; uintsum; uinty
=v[
0
]; uintz
=v[
1
]; uintdelta
=
0x9e3779b9
; sum
=delta<<
4
;
//
由于进行16轮运算,所以将delta左移4位,减16次后刚好为0,32轮运算则左移5位
while
(n-->
0
) { z
=(y<<
4
)+k[
2
]^y+sum^(y>>
5
)+k[
3
]; y
=(z<<
4
)+k[
0
]^z+sum^(z>>
5
)+k[
1
]; sum
=
delta; } v[
0
]=
y; v[
1
]=
z;}
[url=]
[/url]
其中,
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;若小于字节数组长度,则执行如下或运算操作:
[url=]
[/url]
uint
output;output
=(
uint
)v
;output
|=(
uint
)(v[i+
1
]<<
8
);output
|=(
uint
)(v[i+
2
]<<
16
);output
|=(
uint
)(v[i+
3
]<<
24
);return output;
[url=]
[/url]
即将字节数组中的下标位与下标后一位左移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所示。
收藏
分享
评分
继承事业,薪火相传
回复
引用
订阅
TOP
返回列表
模拟电路
MCU 单片机技术
FPGA/CPLD可编程逻辑
DSP技术
测试测量
综合技术交流
工业控制
无线技术
通信技术
LED技术
电商论坛
Pine A64
资料下载
方案分享
FAQ
行业应用
消费电子
便携式设备
医疗电子
汽车电子
工业控制
热门技术
智能可穿戴
3D打印
智能家居
综合设计
示波器技术
存储器
电子制造
计算机和外设
软件开发
分立器件
传感器技术
无源元件
资料共享
PCB综合技术
综合技术交流
EDA
MCU 单片机技术
ST MCU
Freescale MCU
NXP MCU
新唐 MCU
MIPS
X86
ARM
PowerPC
DSP技术
嵌入式技术
FPGA/CPLD可编程逻辑
模拟电路
数字电路
富士通半导体FRAM 铁电存储器“免费样片”使用心得
电源与功率管理
LED技术
测试测量
通信技术
3G
无线技术
微波在线
综合交流区
职场驿站
活动专区
在线座谈交流区
紧缺人才培训课程交流区
意见和建议