delphi php 加解密,PHP加密算法转换delphi出问题

function encrypt($string,$operation,$key='') { $key=md5($key); $key_length=strlen($key); $string=$operation=='D'?base64_decode($string):substr(md5($string.$key),0,8).$string; $string_length=strlen($string); $rndkey=$box=array(); $result=''; for($i=0;$i<=255;$i++) { $rndkey[$i]=ord($key[$i%$key_length]); $box[$i]=$i; } for($j=$i=0;$i<256;$i++) { $j=($j+$box[$i]+$rndkey[$i])%256; $tmp=$box[$i]; $box[$i]=$box[$j]; $box[$j]=$tmp; } for($a=$j=$i=0;$i';echo '解密:'.encrypt($token, 'D', $key);

function encrypt(str, operation, key: string): string; function StrToMD5(s: string): string; var Md5Encode: TIdHashMessageDigest5; begin Md5Encode := TIdHashMessageDigest5.Create; Result := Md5Encode.AsHex(Md5Encode.HashValue(S)); Md5Encode.Free; end;var key_length: Integer; string_length: Integer; I, j, A: Integer; rndkey: array[0..255] of Byte; Box: array[0..255] of Byte; tmp: Byte;begin key := LowerCase(StrToMD5(key)); key_length := Length(key); if operation = 'D' then str := DecodeString(str) else str := Copy(lowerCase(StrToMD5(str + key)), 1, 8) + str; string_length := Length(str); result := ''; for i := 0 to 255 do begin rndkey[i] := ord(key[(i mod key_length) + 1]); Box[i] := i; end; j := 0; for i := 0 to 255 do begin j := (j + Box[i] + rndkey[i]) mod 256; tmp := Box[i]; Box[i] := Box[j]; Box[j] := tmp; end; a := 0; j := 0; for i := 1 to string_length do begin A := (A + 1) mod 256; j := (j + Box[A]) mod 256; tmp := Box[A]; Box[A] := Box[j]; Box[j] := tmp; result := result + chr(ord(str[i]) xor (Box[(Box[A] + Box[j]) mod 256])); end; if (operation = 'D') then begin if (copy(result, 1, 8) = copy(lowerCase(StrToMd5(copy(result, 9, Length(Result) - 8) + key)), 1, 8)) then begin Result := copy(result, 9, Length(Result) - 8); end else begin Result := ''; end; end else begin Result := StringReplace(EncodeString(result), '=', '', [rfReplaceAll]); end; end;

自己网上找的PHP加密算法,但是转成DELPHI 时候只有加密正确 解密不正确

求前辈帮忙完美转换

回复讨论(解决方案)

这个完全没什么技术难度,你只是不会调试而已。

既然能把代码转过去了,哪行对应哪行就清楚了

取一行php输出一下变量,delphi输出一下变量,如果变量值有不同就是这行错了。

程序就在那里慢慢查肯定能查出是哪行错了,实在不行一行行对比也行啊。

所以找到问题只是时间问题,这个完全没有难度只是费时费力而已。

你这个是什么加密算法?

delphi 的 DecodeString 是对应 php 的 base64_decode 吗?

那么 DecodeString 函数是残废的 base64 串是如何处理的?

建议你补齐尾部的 =

这个完全没什么技术难度,你只是不会调试而已。

既然能把代码转过去了,哪行对应哪行就清楚了

取一行php输出一下变量,delphi输出一下变量,如果变量值有不同就是这行错了。

程序就在那里慢慢查肯定能查出是哪行错了,实在不行一行行对比也行啊。

所以找到问题只是时间问题,这个完全没有难度只是费时费力而已。

调试过了 DecodeString 后解密出来的字符串 delphi 比 php 少了2位

delphi 的 DecodeString 是对应 php 的 base64_decode 吗?

那么 DecodeString 函数是残废的 base64 串是如何处理的?

建议你补齐尾部的 =

我试试吧后尾补=看看,

delphi 的 DecodeString 是对应 php 的 base64_decode 吗?

那么 DecodeString 函数是残废的 base64 串是如何处理的?

建议你补齐尾部的 =

补齐尾部的=也不行,现在发现DecodeString解密出来的字符出错了

按你给出的参数,$token 尾部有一个 = 被删去

这与你 delphi 比 php 少了2位 的说法是吻合的

base64 将 3 个字解扩展成 4 个字节 ,尾部的 2 个字符扩展后需用 = 补齐

解码时如果因残废了而舍弃,就正好少了2个字符

你怎么补的?贴出代码

按你给出的参数,$token 尾部有一个 = 被删去

这与你 delphi 比 php 少了2位 的说法是吻合的

base64 将 3 个字解扩展成 4 个字节 ,尾部的 2 个字符扩展后需用 = 补齐

解码时如果因残废了而舍弃,就正好少了2个字符

按照你的方法我的delphi 版后面加了 =

然后解密出来 字符再转成 Asc码比对了下delphi 和 PHP 分别为

delphi 版

1571920612038416510212118647183621641859132545612373206113391

php 版

157192061203841651021211864718362164185913254561237320611339

后面少了个1

if operation = 'D' then

在这里给 str 加上 (4 - Length(str)%4)%4 个 =

str := DecodeString(str)

else

或者你看看

DecodeString("YWI=")

DecodeString("YWI")

的结果分别是什么

if operation = 'D' then

在这里给 str 加上 (4 - Length(str)%4)%4 个 =

str := DecodeString(str)

else

按照你的方法可以了,原来要补齐4的整数=谢谢版主

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值