DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: delifei
今日帖子: 48
在线用户: 16
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 cenunus (cenunus) ▲▲▲▲▲ -
注册会员
2018/9/7 8:17:12
标题:
请求帮助转换java代码为delphi 浏览:454
加入我的收藏
楼主: 我用的是delphixe10.1,在网上找的代码都没用,自己写的base64(md5(str))得到的字符串不对,java中md5得到的字符串是16位的,我得到的是32位的。。。。。所以到这里请求帮助!

import java.io.FileInputStream;
 import java.io.InputStream;
 import java.security.MessageDigest;

import sun.misc.BASE64Encoder;

public class Util {

    public static String loadFile(String fileName) {
         InputStream fis;
         try {
          fis = new FileInputStream(fileName);
          byte[] bs = new byte[fis.available()];
          fis.read(bs);
          String res = new String(bs);
          fis.close();
          return res;
         } catch (Exception e) {
          throw new RuntimeException(e);
         }
     }

    public static String md5EncryptAndBase64(String str) {
         return encodeBase64(md5Encrypt(str));
     }

    private static byte[] md5Encrypt(String encryptStr) {
         try {
          MessageDigest md5 = MessageDigest.getInstance("MD5");
          md5.update(encryptStr.getBytes("utf8"));
          return md5.digest();
         } catch (Exception e) {
          throw new RuntimeException(e);
         }
     }

    private static String encodeBase64(byte[] b) {
         sun.misc.BASE64Encoder base64Encode = new BASE64Encoder();
         String str = base64Encode.encode(b);
         return str;
     }

    public static void main(String[] args) {
         String xml = loadFile(args[0]);
         String checkword = loadFile(args[1]);
         System.out.println(md5EncryptAndBase64(xml + checkword));
         System.out.println(md5EncryptAndBase64("abc"));
         System.out.println(md5EncryptAndBase64("中"));
     }
 }

下面是我写的代码
var
  MD5:TIdHashMessageDigest5;
  base64:TIdEncoderMIME;
  str:string;
begin
  MD5 := TIdHashMessageDigest5.Create;
  base64:=TIdEncoderMIME.Create(nil);
  try
    base64.FillChar:='=';
    str:=MD5.HashStringAsHex(tmp);
    Result:=base64.EncodeBytes(TIdBytes(TEncoding.UTF8.GetBytes(str)));
  finally
    MD5.Free;
    base64.Free;
  end;
end;


这个是要加密的字符串:
<Request service="RouteService" lang="zh-CN"><Head>TMZY</Head><Body><RouteRequest tracking_type="1" method_type="1" tracking_number="249071387647"/></Body></Request>XghizSW2NHQKNlR1DT4xrarywqqTyn3F

这个是别人得到的字符
Khxp5cMIRjzi51pJJzOdgQ==

这个是我得到的字符串:
RTg3NDg0QkMxRjI0RUY0MUFCODEzNkE3Q0M1QUU5NkQ=

请老大们看看,谢谢!
----------------------------------------------
作者:
男 wang_80919 (Flying Wang) ▲▲▲▲△ -
普通会员
2018/9/7 8:47:40
1楼: 1 md5 已经是 官方内置了,不需要 indy
2 人家是 Md5 直接返回 Base64 你是 md5 先返回了一个 Hex 字符串,又作为数据源,返回 BASE64,多此一举。
3 同样的 Base64 官方也内置了。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 roadrunner (roadrunner) ★☆☆☆☆ -
盒子活跃会员
2018/9/7 9:01:58
2楼: str:=MD5.HashStringAsHex(tmp);
这里错了, java版并没有AsHex, 你擅自加了AsHex上去
----------------------------------------------
-
作者:
男 cenunus (cenunus) ▲▲▲▲▲ -
注册会员
2018/9/7 10:39:31
3楼: 多谢各位大佬提醒!改成这样就对了:
function TForm8.加密(tmp: string): string;
var
  MD5:TIdHashMessageDigest5;
  base64:TIdEncoderMIME;
  str:string;
begin
  MD5 := TIdHashMessageDigest5.Create;
  base64:=TIdEncoderMIME.Create(nil);
  try
    base64.FillChar:='=';
    //str:=MD5.HashStringAsHex(tmp);
    //str:=;
    Result:=base64.EncodeBytes(TIdBytes(MD5.HashString(tmp)));
  finally
    MD5.Free;
    base64.Free;
  end;
end;
----------------------------------------------
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v2.1 版权所有 页面执行15.625毫秒 RSS