论坛首页 Java企业应用论坛

JAVA DES加解密

浏览 5006 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (6)
作者 正文
   发表时间:2014-03-03   最后修改:2014-03-03
各位大侠,帮忙啊!!!!
目前单位和另外家公司合作一项目,我们公司负责服务端的开发,使用的java,合作公司负责客户端开发,使用的C语言,双方通过socket通讯,当然双方通讯接收发报文没有问题,问题出在报文的解析上,由于合作公司的客户端是一种消费刷卡机,考虑到信息安全,使用了DES加密的机制,我用了网上的一些通用的加解密java代码,根本解析不了。附件中是我跟合作单位要的C语言的DES加密源码,请牛人帮忙看下java如何解析?
另外说明:由于消费机发送报文大小的限制,报文中大部分数据都是十六进制的。如下:
密钥:A1A2A3A4A5A6A7A8  16进制
明文:3132333435363738  16进制
密文:B1C3D2A87DBDB68F  报文中发的实际数据,需要解密成 3132333435363738

忘记上附件了!!
   发表时间:2014-03-03  
或者哪位朋友用过java的jni调用C实现des加解密的dll动态链接库,可以共享给我吗?QQ:2643291891,不胜感谢!!!
0 请登录后投票
   发表时间: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 
1 请登录后投票
   发表时间:2014-03-06  
syq820520 写道
或者哪位朋友用过java的jni调用C实现des加解密的dll动态链接库,可以共享给我吗?QQ:2643291891,不胜感谢!!!

对方肯定有加密解密的dll库,你可以这样java->jni->自己写的c程序->对方c写的dll
0 请登录后投票
   发表时间:2014-03-06  
JAVA的DES没有搞过,如果是JNI的话就好办,你可以看看这个文档关于JNI的介绍http://www3.ntu.edu.sg/home/ehchua/programming/java/JavaNativeInterface.html#zz-5.4
0 请登录后投票
   发表时间:2014-03-07  
找对方要 DES的加解密规范,POS交易那报文明显是用的银联的 ISO8583格式吧。。。

这个DES的加密,在银联的CUPS上面是会设置你用的是什么DES ,3倍的3DES 或者其他的什么。要详细的算法文档。
0 请登录后投票
   发表时间:2014-03-08  
这个正常,java和c的 des 确实是不好互通,很麻烦
0 请登录后投票
   发表时间: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");

用这个加密出来刚好是
0 请登录后投票
   发表时间: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
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics