一个DELPHI写的AES算法源码中的问题
来源:互联网 发布:plc编程软件手机版 编辑:程序博客网 时间:2024/05/22 06:04
由于近来要看算法, 在网上找了几个Delphi写的AES源码,其中一个在各大下载站是最常见的,由ElASE.pas和AES.pas构成,其中主要实现文件EIASE.PAS作者EldoS, Alexander Ionov,AES.PAS实现了AES算法的接口;另外下的一个演示程序实际上主要文件也是EIASE.PAS,不过是繁体的,可能是台湾那边的。两个程序得到的结果相同,但是却让初看AES算法的我很迷惑,因为"this is a test!"这样一个16字符128位的明文,用这两个程序得到的结果密文居然是(16进制数据显示的)“10000000000000005F7DF0BF103A8C4AE6FAAD9906AC3B2A”,转回字节就是24字符了,而按照AES算法,得到的结果应该是16字节的。尝试随意用几段明文作加密,得到的结果前面都会有一堆的000,这是什么原因呢?按理说结果中不会有这些的。
经过跟踪分析,原来在AES.PAS中的加密函数中有这么一段代码
[code]
begin
OutStrm := TStream.Create;
Stream.Position := 0;
Count := Stream.Size;
OutStrm.Write(Count, SizeOf(Count));
try
{ -- 128 位密匙最大长度为 16 个字符 -- }
if KeyBit = kb128 then
[/code]
解密函数中也有一段
[code]
begin
OutStrm := TStream.Create;
Stream.Position := 0;
OutPos :=OutStrm.Position;
Stream.ReadBuffer(Count, SizeOf(Count));
try
{ -- 128 位密匙最大长度为 16 个字符 -- }
if KeyBit = kb128 then
[/code]
注意到 DS.WriteBuffer(Size, SizeOf(Size));就是说在初始化DS这个TStringStream后,接口程序会首先把明文的长度占用长度的类型长度(sizeof(size))写入ds的首部,以致后来转化成密文后再转成十六进制字符显示时会把这个长度信息也输出了,但这个显示不属于AES算法本身范围内,当然最奇怪的是那个繁体版的演示程序也是如此处理了,本来实现的主程序EIASE.PAS是没有任何问题的。
现在初步的解决办法就是把 OutStrm.Write(Count, SizeOf(Count));和Stream.ReadBuffer(Count, SizeOf(Count));注释掉。这样得到的密文就应该是正确的了。
- 一个DELPHI写的AES算法源码中的问题
- 一个Delphi写的DES算法, 翻译成C#
- AES算法源码
- Delphi关于改进AES算法的加解密文件功能
- PHP中的AES算法
- 自己写的一个加密,解密(AES)组件
- Delphi-JAVA互加解密AES算法
- Delphi写的一个屏幕截取函数
- 自己写的一个DELPHI 控制台程序
- 由delphi语言写的mapinfo算法
- Delphi写的折半查找算法实现
- VC调用Delphi写的dll的一个问题的处理
- 早些时候写的一个Delphi中的串口通读类.
- 请教高手关于delphi中的一个问题
- 一个java写的贪心算法实现删数问题
- 一个Delphi的源码加密插件
- DELPHI XE 调用 DELPHI 7 写的DLL的问题
- DELPHI写ActiveForm常见的一些问题
- Oracle 9i 分析函数参考手册
- asp开发记录(1)——[Microsoft][ODBC Microsoft Access Driver]行中有错误
- 解读ASP.NET Portal Starter Kit(3)——代码文件篇
- STL vector 容器介绍
- 撞死母猪
- 一个DELPHI写的AES算法源码中的问题
- 现在 你在看blog吗
- C语言宏定义技巧(常用宏定义)
- 时间管理
- 珍惜自己的所爱
- 个人对三层架构的理解
- 模态窗口和非模态窗口
- (翻译)需求的验证&确认
- 解读ASP.NET Portal Starter Kit(4)——角色身份认证篇