Delphi2010中字符串汇编需要注意的一点,以及支持2010的AES加密库

2018-10-30

昨天研究了一下Delphi2010的Unicode,同时也改了几个单元到2010中来,今天下午修改AES的加密库的时候,碰到一个问题,我将AES中的StrtoHex换成了自己写的汇编函数!其他的地方,都修改好了,但是加密之后总是没有结果返回!奇怪了半天,然后我将修改后的AES放到2007下去运行是一点问题都没有!最后调试了半天,将断点定在了StrToHex这个函数内部,调试运行也没发现问题,但是这个函数就是没结果返回。还真是奇怪了,于是翻开了它自己带的AnsiStrings单元查看里面相关的函数,晕,恍然大悟,原来在AnsiString的管理时也多加了一个CodePage的设置。既然如此,那么函数需要做相应的修改了哈!主题代码如下:

代码

Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->function StrToHex(Const str: Ansistring): Ansistring;
asm
   push ebx
   push esi
   push edi
   test eax,eax
   jz   @@Exit
   mov  esi,edx    //保存edx值,用来产生新字符串的地址
   mov  edi,eax    //保存原字符串
   mov  edx,[eax-4]  //获得字符串长度
   test edx,edx    //检查长度
   je   @@Exit    {Length(S) = 0}
   mov  ecx,edx    //保存长度
   Push ecx
   add  edx,edx
   mov  eax,esi
   {$IFDEF VER210}
   movzx ecx, word ptr [edi-12] {需要设置CodePage}
   {$ENDIF}
   call System.@LStrSetLength //设置新串长度
   mov  eax,esi    //新字符串地址
   Call UniqueString  //产生一个唯一的新字符串,串位置在eax中
   Pop   ecx
  @@SetHex:
   xor  edx,edx    //清空edx
   mov  dl, [edi]    //Str字符串字符
   mov  ebx,edx    //保存当前的字符
   shr  edx,4    //右移4字节,得到高8位
   mov  dl,byte ptr[edx+@@HexChar] //转换成字符
   mov  [eax],dl    //将字符串输入到新建串中存放
   and  ebx,$0F    //获得低8位
   mov  dl,byte ptr[ebx+@@HexChar] //转换成字符
   inc  eax    //移动一个字节,存放低位
   mov  [eax],dl
   inc  edi
   inc  eax
   loop @@SetHex
  @@Exit:
   pop  edi
   pop  esi
   pop  ebx
   ret
  @@HexChar: db '0123456789ABCDEF'
end;

LStrSetLength之前要同时传入CodePage设置,这样这个函数经过这样修改之后就可以正常返回信息了!

同时附上修改的AES代码 AES代码下载

来源:http://www.cnblogs.com/DxSoft/archive/2010/01/03/1638329.html


阅读9