- 浏览: 498536 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
devon.k:
推荐的一种解决方案:https://developer.jbo ...
JBoss应用遇到问题记录 -
liuzl121:
楼主你好,我遇到了你说的第一个问题,能不能详细一些?
JBoss应用遇到问题记录 -
showzh:
...
MySQL5.1列类型 -
zijie110:
...
使用SpringSide的PropertyFilter无法实现 where 属性名1 like '%值1%' or 属性名1 like '%值2%' 的效果 -
JAVA-JVM:
您好,我看了您的一篇文章“用Maven构建Flex4项目实践记 ...
用Maven构建Flex4项目实践记录
----------------------------------------------------------------------------------------------------------
参考: http://www.iteye.com/topic/193137
http://www.iteye.com/problems/3692
----------------------------------------------------------------------------------------------------------
何为交叉加解密?
——Java加密、Delphi解密,或 Delphi加密、Java解密。
近日,手头上当前的项目进展到优化、完善阶段,其中一点是需要增强服务端与客户端通信的安全性,考虑采用对报文进行DES加密的方法来实现。
服务端是Java编写的,客户端是Delphi编写的,原以为两端各自coding完进行个联调就OK了,结果发现同样的明文、密钥通过Delphi、Java所产生的密文是不同的。
在网上搜索相关资源,得出结论:
原来这是个普遍存在的问题,主要原因是不同的语言在明文的长度不够8byte倍数时,补充的字节各不相同所致。
Java和C之间已经有解决方案(http://shirlly.iteye.com/blog/310759 ),而Java和Delphi的已由公司牛人 于2009-12-10解决,代码如下:
import java.security.SecureRandom; import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESKeySpec; /** * DES加解密,支持与delphi交互(字符串编码需统一为UTF-8) * * @author wym */ public class DESCipherCrossoverDelphi { /** * 密钥 */ public static final String KEY = "12345678"; private final static String DES = "DES"; /** * 加密 * * @param src * 明文(字节) * @param key * 密钥,长度必须是8的倍数 * @return 密文(字节) * @throws Exception */ public static byte[] encrypt(byte[] src, byte[] key) throws Exception { // DES算法要求有一个可信任的随机数源 SecureRandom sr = new SecureRandom(); // 从原始密匙数据创建DESKeySpec对象 DESKeySpec dks = new DESKeySpec(key); // 创建一个密匙工厂,然后用它把DESKeySpec转换成 // 一个SecretKey对象 SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES); SecretKey securekey = keyFactory.generateSecret(dks); // Cipher对象实际完成加密操作 Cipher cipher = Cipher.getInstance(DES); // 用密匙初始化Cipher对象 cipher.init(Cipher.ENCRYPT_MODE, securekey, sr); // 现在,获取数据并加密 // 正式执行加密操作 return cipher.doFinal(src); } /** * 解密 * * @param src * 密文(字节) * @param key * 密钥,长度必须是8的倍数 * @return 明文(字节) * @throws Exception */ public static byte[] decrypt(byte[] src, byte[] key) throws Exception { // DES算法要求有一个可信任的随机数源 SecureRandom sr = new SecureRandom(); // 从原始密匙数据创建一个DESKeySpec对象 DESKeySpec dks = new DESKeySpec(key); // 创建一个密匙工厂,然后用它把DESKeySpec对象转换成 // 一个SecretKey对象 SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES); SecretKey securekey = keyFactory.generateSecret(dks); // Cipher对象实际完成解密操作 Cipher cipher = Cipher.getInstance(DES); // 用密匙初始化Cipher对象 cipher.init(Cipher.DECRYPT_MODE, securekey, sr); // 现在,获取数据并解密 // 正式执行解密操作 return cipher.doFinal(src); } /** * 加密 * * @param src * 明文(字节) * @return 密文(字节) * @throws Exception */ public static byte[] encrypt(byte[] src) throws Exception { return encrypt(src, KEY.getBytes()); } /** * 解密 * * @param src * 密文(字节) * @return 明文(字节) * @throws Exception */ public static byte[] decrypt(byte[] src) throws Exception { return decrypt(src, KEY.getBytes()); } /** * 加密 * * @param src * 明文(字符串) * @return 密文(16进制字符串) * @throws Exception */ public final static String encrypt(String src) { try { return byte2hex(encrypt(src.getBytes(), KEY.getBytes())); } catch (Exception e) { e.printStackTrace(); } return null; } /** * 解密 * * @param src * 密文(字符串) * @return 明文(字符串) * @throws Exception */ public final static String decrypt(String src) { try { return new String(decrypt(hex2byte(src.getBytes()), KEY.getBytes())); } catch (Exception e) { e.printStackTrace(); } return null; } /** * 加密 * * @param src * 明文(字节) * @return 密文(16进制字符串) * @throws Exception */ public static String encryptToString(byte[] src) throws Exception { return encrypt(new String(src)); } /** * 解密 * * @param src * 密文(字节) * @return 明文(字符串) * @throws Exception */ public static String decryptToString(byte[] src) throws Exception { return decrypt(new String(src)); } public static String byte2hex(byte[] b) { String hs = ""; String stmp = ""; for (int n = 0; n < b.length; n++) { stmp = (java.lang.Integer.toHexString(b[n] & 0XFF)); if (stmp.length() == 1) hs = hs + "0" + stmp; else hs = hs + stmp; } return hs.toUpperCase(); } public static byte[] hex2byte(byte[] b) { if ((b.length % 2) != 0) throw new IllegalArgumentException("长度不是偶数"); byte[] b2 = new byte[b.length / 2]; for (int n = 0; n < b.length; n += 2) { String item = new String(b, n, 2); b2[n / 2] = (byte) Integer.parseInt(item, 16); } return b2; } public static void main(String[] args) { try { String src = "测试"; String crypto = DESCipherCrossoverDelphi.encrypt(src); System.out.println("密文[" + src + "]:" + crypto); System.out.println("解密后:" + DESCipherCrossoverDelphi.decrypt(crypto)); } catch (Exception e) { e.printStackTrace(); } } }
main函数运行结果如下:
密文[测试]:F25C2FB5F47CCE5F 解密后:测试
评论
2 楼
eppen
2012-09-14
md5的话是不是也同样道理?
1 楼
netix1999
2010-01-06
楼主能不能把Delphi的源代码也贴出来
我也在找这方面的东西
客户端同样存在破解的风险,如果delphi是用外挂的dll的话,
更是容易,简单的弄个钩子就能得到通讯内容了
最好是有des实现的源码,编译进exe文件中
然后再给exe文件加壳
我也在找这方面的东西
客户端同样存在破解的风险,如果delphi是用外挂的dll的话,
更是容易,简单的弄个钩子就能得到通讯内容了
最好是有des实现的源码,编译进exe文件中
然后再给exe文件加壳
发表评论
-
JVM记要
2020-03-13 22:06 4JVM架构 图略(iteye已废) ... -
JUC(java.util.concurrent)要点笔记
2020-03-02 11:40 880iteye没落了,编辑格式太难整,表格位置有问题,图片 ... -
JMH记要
2020-01-16 11:46 5151.What's JMH?——OpenJDK提供的微基准测 ... -
Windows下多个jdk共存问题
2016-08-26 13:52 1084现象: 共安装有jdk1.6、1.7、1.8这3个版本, ... -
国际化
2015-01-06 16:50 866语言代码标准 国家代码标准 Java: pu ... -
LTW(Loading-Time Weaving)应用实践要点记录
2013-05-09 17:50 0http://static.springsource.org ... -
Java常用命令(工具)
2013-03-21 16:04 2057启动参数加上-XX:+HeapDumpOnOutOfMemor ... -
Java基础修炼
2012-12-13 19:00 1041Java标准与规范 Java ... -
Java并发编程持续学习
2012-07-04 17:31 1333一. 概念与基础 book: 《Java并发编程实践》 ... -
Openfire和Spark本地开发环境搭建记要
2012-05-16 22:41 111011. Openfire 参考:openfire搭建 ... -
Java基础恶补——Development
2012-02-18 19:26 1014[SCJP Sun Certified Programmer ... -
Java基础恶补——线程
2012-02-11 23:19 874[SCJP Sun Certified Programmer ... -
Java基础恶补——内部类
2012-02-04 19:35 1146[SCJP Sun Certified Programmer ... -
Java基础恶补——泛型和集合
2012-02-01 18:17 3119[SCJP Sun Certified Programmer ... -
Java基础恶补——Strings, I/O, Formatting, and Parsing
2012-01-29 15:51 1183[SCJP Sun Certified Programmer ... -
Java基础恶补——控制流、异常、断言
2011-11-30 19:02 2014[SCJP Sun Certified Programmer ... -
Java基础恶补——Operators
2011-11-24 16:00 1146[SCJP Sun Certified Programmer ... -
Java基础恶补——Assignments
2011-11-23 14:42 1085[SCJP Sun Certified Programmer ... -
Java基础恶补——OO
2011-11-17 13:30 1136[SCJP Sun Certified Programmer ... -
Java基础恶补——声明及访问控制
2011-11-07 15:54 1124[SCJP Sun Certified Programmer ...
相关推荐
上次忘记发源代码了,补上。 java与delphi通用DES加解密(源代码)
Delphi7与C#实现Des加解密互通Demo,全网找遍只次一份
delphi des加解密的源码,希望对需要的人有用
Delphi写的使用Des算法对字符串进行加密解密函数,文件中包含例子。
delphi 对原始des进行修改 加密 解密
支持des、2des、3des、4des、5des、6des、7des、8des、9des、10des加密方式 支持ECB、cbc、cfb、ofb、pcbc加密模式 支持各种填充模式
之前在Delphi7中使用了一个Des的加解密单元,但是程序升级为2010时,这个算法在2010时不能使用的了! 但是因为必须兼容以前的软件,所以必须将Delphi7中的Des单元修改为Delphi2010能用,而且两都之间可以互相加解密...
delphi7 加解密DES
(delphi)一个des的加密解密小程序,java写的des的一个类!希望对你有所帮助!
最近做一个接口,与JAVA的关于DES/CBC/PKCS5Padding 互相解密。在网上找了很多资料,摸索了3天才摸索出来。同样的明文,用JAVA加密的密文死活都跟用DELPHI加密的不相等,有时候少于8个字符的就正常,多了8个字符的就...
使用的是Chilkat Delphi DLL,经过测试仅实现了3DES中ECB加密模式,填充方式为pkcs5pading的加解密,加密后的内容可用在线3DES加解密来验证,可得到与网页一致的加密结果。所以可以与Java,C#等其他语言实现互通加...
Delphi实现AES加密和解密, 同Java加解密兼容
支持delphi xe5 des 加密 解密 代码
NULL 博文链接:https://hqs998.iteye.com/blog/916610
delphi2007 des 3des mars Base64 Crc RC2 RC4 RC5 RC6加解密
Delphi xe 10 对字符串进行加密解密,完全可用。可直接修改加密字符串
C# 静态调用 delphi des 加解密dll接口 实现加解密demo. delphi string与C# string 不同,调用时不能使用string,delphi 中改用pchar.
基于delphi的des加密函数源码,可以自行设定des加解密密码。
Delphi、Lazarus、C语言实现DES、3DES对称加密解密模块,支持单倍长和双倍长密钥。
加密后生成一个文件,需要文件的也可以对代码进行修改。加密后的文件可以用c#、java解密,加密模式为ECB。代码已经在项目中使用。