DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: cuiqingbo
今日帖子: 20
在线用户: 12
导航: 论坛 -> 移动应用开发 斑竹:flyers,iamdream  
作者:
男 blueflag (昆了) ★☆☆☆☆ -
盒子活跃会员
2022/1/2 12:25:44
标题:
求助JAVA和delphi通用的AES DES加密解密模块 浏览:2670
加入我的收藏
楼主: 各位大大,最近有个小麻烦,就是用delphi和java后台通讯,需要解密和加密共享。就是delphi作为客户端要把加密后的数据发给java后台,再解密后台反馈的数据,各位有没有成功地案例,让在下学习学习,谢谢
----------------------------------------------
-
作者:
男 janker (janker) ★☆☆☆☆ -
盒子活跃会员
2022/1/2 14:33:05
1楼: http://bbs.2ccc.com/topic.asp?topicid=614470

这里,参考下
----------------------------------------------
-
作者:
男 janker (janker) ★☆☆☆☆ -
盒子活跃会员
2022/1/2 14:58:18
2楼: https://github.com/TurboPack/LockBox3
这个是Pascal的
----------------------------------------------
-
作者:
男 xiaobaosoft (小宝软件) ▲▲△△△ -
普通会员
2022/1/2 18:06:47
3楼: 用TMS的加密组件即可。

三方开源的  用法都不方便
----------------------------------------------
-
作者:
男 dbyoung (dbyoung) ★☆☆☆☆ -
普通会员
2022/1/2 18:34:58
3楼: 1、将平台端给的 Java 文件编译,得到 Class 文件(相当于 DLL 文件了)。
2、利用 JNI,在 Delphi 中调用 Class 文件,编写带参数的 DOS 命令行程序。
3、根据命令行输入参数的不同,输出不同的结果(就是封装你在 Delphi 中需要调用的几个功能)。
4、在我们的对接程序中,带参数运行这个 DOS 命令行程序,利用 TDOSCommand 捕获命令行输出。

当然,你做成 DLL 方式也可以。直接集成 Class 功能到你的 Delphi 代码中也可以。
但如果是 DLL 方式, 一旦这个 DLL 崩溃,主程序会跟着一起崩溃。
做成 EXE 命令行程序的好处是,这个 EXE 程序崩溃,不会影响主程序。因为是两个进程。
而且,我们的对接程序,看着好像也和 Java 没有多大关系,也很简单。

如果你对 Java 熟悉的话,可以用 Java 编写个带参数的 DOS 命令行程序。
这样和 Delphi 就没有任何关系了。什么语言都能调用。

我对 Java,七窍通了六窍,一窍不通。
我是做成 Delphi EXE 命令行程序的,在正式环境中运行正常。
部署机器上需要安装 Java 虚拟机。发布时,Class 文件要一起发布。

没必要翻译 Java 文件,费力不讨好。大牛另当别论。
----------------------------------------------
武汉天气不好
作者:
男 letianwuji (大器晚成) ▲▲▲▲▲ -
普通会员
2022/1/4 10:42:11
4楼: 真麻烦,我现在比较喜欢用C#,写个C#的dll模块,让delphi调用。
算法直接兼容,毕竟c#跟js之间的兼容算法代码太泛滥。
----------------------------------------------
相信自己,若自己都不相信,那还有谁可信。
作者:
男 hz_2009 (盒子) ★☆☆☆☆ -
普通会员
2022/1/4 14:38:42
5楼: 网上搜吧,很多代码,自己调试通过,修修改改,适合自己的需求即可。没有正好的。
----------------------------------------------
-
作者:
男 cnpack (CnPack) ★☆☆☆☆ -
普通会员
2022/1/7 15:57:18
6楼: 现成能用的比较难找,不同端的分组加密考虑的因素有很多:

1、每块的加密算法(DES/AES等)
2、数据分块的每块大小(128/192/256等)
3、块与块之间的运算模式(ECB/CBC等)
4、数据不满足整数块时如何填充(PKCS1/PKCS7等)
5、密文是否要转变成可读的(Hex/Base64等)
6、明文如果是字符串,加密时还有字符编码问题(UTF8/UTF16/Ansi等)

网上找的代码,但凡有一处和所需的不一样,加密出来的结果就对不上号,还是得挨个去研究。
----------------------------------------------
欢迎使用CnPack IDE Wizards
http://www.cnpack.org/
作者:
男 fb4819 (方明) ★☆☆☆☆ -
盒子活跃会员
2022/1/8 10:55:50
7楼: 只有Java,Delphi,c#通用的Des加密解密
测试环境Delphi XE6+LockBox2.09,Eclipse 4.7.2
vs没装没写测试代码了,加解密函数见DesJava.java
此帖子包含附件:fb4819_202218105550.rar 大小:123.1K
----------------------------------------------
vvvvvvvvvv
作者:
男 bdsclub (重庆专业做Delphi的老人。) ★☆☆☆☆ -
普通会员
2022/1/8 17:04:08
8楼: 我已实现Delphi、JAVA、H5等三端加密解密。
此帖子包含附件:
PNG 图像
大小:9.6K
----------------------------------------------
逐梦DELPHI的重庆仔儿!
作者:
男 fb4819 (方明) ★☆☆☆☆ -
盒子活跃会员
2022/1/8 20:35:03
9楼: AES128通用代码
Java:
 // AES-128 加密
  public static String AESEncrypt(String sSrc, String sKey) {    
    // 判断Key是否为16位
    if (sKey.length() != 16) {
      System.out.print("Key长度不是16位");
      return null;
    }
    try {
      byte[] raw = sKey.getBytes("utf-8");
      SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
      Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");// "算法/模式/补码方式"
      cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
      byte[] encrypted = cipher.doFinal(sSrc.getBytes("utf-8"));
      BASE64Encoder base64Encoder = new BASE64Encoder();
      return base64Encoder.encode(encrypted);// 此处使用BASE64做转码功能,同时能起到2次加密的作用。
    } catch (Exception e) {
      e.printStackTrace();
      return sSrc;
    }
  }
    
    // AES解密
  public static String AESDecrypt(String sSrc, String sKey) {
    // 判断Key是否为16位
    if (sKey.length() != 16) {
      System.out.print("Key长度不是16位");
      return null;
    }
    try {
      byte[] raw = sKey.getBytes("utf-8");
      SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
      Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
      cipher.init(Cipher.DECRYPT_MODE, skeySpec);
      BASE64Decoder base64Decoder = new BASE64Decoder();
      byte[] encrypted1 = base64Decoder.decodeBuffer(sSrc);// 先用base64解密
      byte[] original = cipher.doFinal(encrypted1);
      String originalString = new String(original, "utf-8");
      return originalString;
    } catch (Exception e) {
      System.out.println(e.toString());
      return null;
    }
  }
Delphi:
uses SynCommons,SynCrypto;
//memo1:明文 memo2:密文
procedure TForm1.Button1Click(Sender: TObject);
var
  cc:TAESCBC;
  s:AnsiString;
begin
  s:=AnsiString(Memo1.Text) ;
  cc:=TAESCBC.CREATE(AnsiString('aaaaaaaabbbbbbbb'),128);
  Memo2.text:=Utf8ToString(BintoBase64(cc.EncryptPKCS7(Utf8Encode(s))));
  cc.free;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  cc:TAESCBC;
  s:AnsiString;
begin
  s:=AnsiString(Memo2.Text) ;
  cc:=TAESCBC.CREATE(AnsiString('aaaaaaaabbbbbbbb'),128);
  Memo1.text:=Utf8ToString(cc.DecryptPKCS7(Base64ToBin(s)));
  cc.free;
end;
----------------------------------------------
vvvvvvvvvv
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行93.75毫秒 RSS