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


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

    代码
    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代码下载

  • 相关阅读:
    PsySH——PHP交互式控制台
    PHP通过ssh或socks5读取远程服务器的mysql数据库
    构建:vue项目配置后端接口服务信息
    module.exports用法
    PhpStorm连接服务器,开始自动上传功能
    JavaScript Array.some()方法用法
    vue-router query和params传参(接收参数),$router、$route的区别
    ES6箭头函数(Arrow Functions)
    工作中常用到的ES6语法
    VueJs2.0建议学习路线
  • 原文地址:https://www.cnblogs.com/DxSoft/p/1638329.html
Copyright © 2020-2023  润新知