浏览 5006 次
锁定老帖子 主题:JAVA DES加解密
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (6)
|
|
---|---|
作者 | 正文 |
发表时间:2014-03-03
最后修改:2014-03-03
目前单位和另外家公司合作一项目,我们公司负责服务端的开发,使用的java,合作公司负责客户端开发,使用的C语言,双方通过socket通讯,当然双方通讯接收发报文没有问题,问题出在报文的解析上,由于合作公司的客户端是一种消费刷卡机,考虑到信息安全,使用了DES加密的机制,我用了网上的一些通用的加解密java代码,根本解析不了。附件中是我跟合作单位要的C语言的DES加密源码,请牛人帮忙看下java如何解析? 另外说明:由于消费机发送报文大小的限制,报文中大部分数据都是十六进制的。如下: 密钥:A1A2A3A4A5A6A7A8 16进制 明文:3132333435363738 16进制 密文:B1C3D2A87DBDB68F 报文中发的实际数据,需要解密成 3132333435363738 忘记上附件了!! 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2014-03-03
或者哪位朋友用过java的jni调用C实现des加解密的dll动态链接库,可以共享给我吗?QQ:2643291891,不胜感谢!!!
|
|
返回顶楼 | |
发表时间:2014-03-05
你的密文不全
private static byte[] parse(String str) { byte[] b = new byte[str.length() / 2]; for (int i = 0, n = str.length(); i < n; i += 2) { b[i / 2] = (byte) (Integer.parseInt(str.substring(i, i + 2), 16)); } return b; } public static void main(String[] args) throws Exception { SecretKeyFactory kf = SecretKeyFactory.getInstance("DES"); SecretKey key = kf.generateSecret(new DESKeySpec(parse("A1A2A3A4A5A6A7A8"))); Cipher c = Cipher.getInstance("DES"); c.init(Cipher.ENCRYPT_MODE, key); byte[] b1 = c.doFinal(parse("3132333435363738")); System.out.format("%X\n", new BigInteger(1, b1)); c.init(Cipher.DECRYPT_MODE, key); byte[] b2 = c.doFinal(parse("B1C3D2A87DBDB68FA73FBBBCD6F083AC")); System.out.format("%X\n", new BigInteger(1, b2)); } B1C3D2A87DBDB68FA73FBBBCD6F083AC B1C3D2A87DBDB68F |
|
返回顶楼 | |
发表时间:2014-03-06
syq820520 写道 或者哪位朋友用过java的jni调用C实现des加解密的dll动态链接库,可以共享给我吗?QQ:2643291891,不胜感谢!!!
对方肯定有加密解密的dll库,你可以这样java->jni->自己写的c程序->对方c写的dll |
|
返回顶楼 | |
发表时间:2014-03-06
JAVA的DES没有搞过,如果是JNI的话就好办,你可以看看这个文档关于JNI的介绍http://www3.ntu.edu.sg/home/ehchua/programming/java/JavaNativeInterface.html#zz-5.4
|
|
返回顶楼 | |
发表时间:2014-03-07
找对方要 DES的加解密规范,POS交易那报文明显是用的银联的 ISO8583格式吧。。。
这个DES的加密,在银联的CUPS上面是会设置你用的是什么DES ,3倍的3DES 或者其他的什么。要详细的算法文档。 |
|
返回顶楼 | |
发表时间:2014-03-08
这个正常,java和c的 des 确实是不好互通,很麻烦
|
|
返回顶楼 | |
发表时间:2014-03-08
abc130314 写道 你的密文不全
private static byte[] parse(String str) { byte[] b = new byte[str.length() / 2]; for (int i = 0, n = str.length(); i < n; i += 2) { b[i / 2] = (byte) (Integer.parseInt(str.substring(i, i + 2), 16)); } return b; } public static void main(String[] args) throws Exception { SecretKeyFactory kf = SecretKeyFactory.getInstance("DES"); SecretKey key = kf.generateSecret(new DESKeySpec(parse("A1A2A3A4A5A6A7A8"))); Cipher c = Cipher.getInstance("DES"); c.init(Cipher.ENCRYPT_MODE, key); byte[] b1 = c.doFinal(parse("3132333435363738")); System.out.format("%X\n", new BigInteger(1, b1)); c.init(Cipher.DECRYPT_MODE, key); byte[] b2 = c.doFinal(parse("B1C3D2A87DBDB68FA73FBBBCD6F083AC")); System.out.format("%X\n", new BigInteger(1, b2)); } B1C3D2A87DBDB68FA73FBBBCD6F083AC B1C3D2A87DBDB68F Cipher c = Cipher.getInstance("DES/ECB/NoPadding"); 用这个加密出来刚好是 |
|
返回顶楼 | |
发表时间:2014-03-08
最后修改:2014-03-08
abc130314 写道 你的密文不全
private static byte[] parse(String str) { byte[] b = new byte[str.length() / 2]; for (int i = 0, n = str.length(); i < n; i += 2) { b[i / 2] = (byte) (Integer.parseInt(str.substring(i, i + 2), 16)); } return b; } public static void main(String[] args) throws Exception { SecretKeyFactory kf = SecretKeyFactory.getInstance("DES"); SecretKey key = kf.generateSecret(new DESKeySpec(parse("A1A2A3A4A5A6A7A8"))); Cipher c = Cipher.getInstance("DES"); c.init(Cipher.ENCRYPT_MODE, key); byte[] b1 = c.doFinal(parse("3132333435363738")); System.out.format("%X\n", new BigInteger(1, b1)); c.init(Cipher.DECRYPT_MODE, key); byte[] b2 = c.doFinal(parse("B1C3D2A87DBDB68FA73FBBBCD6F083AC")); System.out.format("%X\n", new BigInteger(1, b2)); } B1C3D2A87DBDB68FA73FBBBCD6F083AC B1C3D2A87DBDB68F public static void main(String[] args) throws Exception { String srcStr = "3132333435363738"; String key_16 = "A1A2A3A4A5A6A7A8"; String c_en_16 = "B1C3D2A87DBDB68F"; SecretKeyFactory kf = SecretKeyFactory.getInstance("DES"); SecretKey key = kf.generateSecret(new DESKeySpec(parse(key_16))); //Cipher c = Cipher.getInstance("DES"); // 主要修改这里 Cipher c = Cipher.getInstance("DES/ECB/NoPadding"); c.init(Cipher.ENCRYPT_MODE, key); byte[] b1 = c.doFinal(parse(srcStr)); //System.out.format("%X\n", new BigInteger(1, b1)); //byte[] b2 = c.doFinal(parse("B1C3D2A87DBDB68FA73FBBBCD6F083AC")); //System.out.format("%X\n", new BigInteger(1, b2)); System.out.println("明文:" + srcStr); System.out.println("C加密后密文:" + c_en_16); //en String en_str = bytesToHex(b1); System.out.println("J加密后密文:" + en_str); //de c.init(Cipher.DECRYPT_MODE, key); byte[] b2 = c.doFinal(parse(en_str)); String de_str = bytesToHex(b2); System.out.println("解密:" + de_str); } public static String bytesToHex(byte[] data) { if (data == null) { return null; } else { int len = data.length; String str = ""; for (int i = 0; i < len; i++) { if ((data[i] & 0xFF) < 16) str = str + "0" + java.lang.Integer.toHexString(data[i] & 0xFF); else str = str + java.lang.Integer.toHexString(data[i] & 0xFF); } return str.toUpperCase(); } } private static byte[] parse(String str) { byte[] b = new byte[str.length() / 2]; for (int i = 0, n = str.length(); i < n; i += 2) { b[i / 2] = (byte) (Integer.parseInt(str.substring(i, i + 2), 16)); } return b; } 明文:3132333435363738 C加密后密文:B1C3D2A87DBDB68F J加密后密文:B1C3D2A87DBDB68F 解密:3132333435363738 |
|
返回顶楼 | |