当前位置: 代码迷 >> Java相关 >> java 3des加密算法求解解决方案
  详细解决方案

java 3des加密算法求解解决方案

热度:7039   发布时间:2013-02-25 21:50:11.0
java 3des加密算法求解
我下载了一个3des加密的工具,得到如下结果:
原文:06111111FFFFFFFF
密钥:11111111111111111111111111111111
密文:C1335C0C5EC48958

这个也是我需要的结果,但是我用java始终没有得到这样的结果。求相关java代码,紧急,谢谢

------解决方案--------------------------------------------------------
我用java写的测试,生成的结果前面的8字节与你相同,只是多个8个字节,供参考:
Java code
import javax.crypto.*;import javax.crypto.spec.SecretKeySpec;public class TestDes {    private static final String Algorithm = "DESede";         public static byte[] encryptMode(byte[] keybyte, byte[] src) {       try {                        SecretKey deskey = new SecretKeySpec(keybyte, Algorithm);                        Cipher c1 = Cipher.getInstance(Algorithm);           c1.init(Cipher.ENCRYPT_MODE, deskey);            return c1.doFinal(src);        } catch (java.security.NoSuchAlgorithmException e1) {            e1.printStackTrace();        } catch (javax.crypto.NoSuchPaddingException e2) {            e2.printStackTrace();        } catch (java.lang.Exception e3) {            e3.printStackTrace();        }        return null;    }    public static byte[] decryptMode(byte[] keybyte, byte[] src) {          try {            SecretKey deskey = new SecretKeySpec(keybyte, Algorithm);            Cipher c1 = Cipher.getInstance(Algorithm);            c1.init(Cipher.DECRYPT_MODE, deskey);            return c1.doFinal(src);        } catch (java.security.NoSuchAlgorithmException e1) {            e1.printStackTrace();        } catch (javax.crypto.NoSuchPaddingException e2) {            e2.printStackTrace();        } catch (java.lang.Exception e3) {            e3.printStackTrace();        }        return null;    }    //转换成十六进制字符串        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;            if (n<b.length-1)  hs=hs+":";        }        return hs.toUpperCase();    }        public static void main(String[] args)    {         final byte[] keyBytes = { 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11                                   ,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11};       byte[] szSrc = {0x06,0x11,0x11,0x11,(byte)0xFF,(byte)0xFF,(byte)0xFF,(byte)0xFF};                System.out.println("加密前的字符串:" + byte2hex(szSrc));                byte[] encoded = encryptMode(keyBytes,szSrc );                System.out.println("加密后的字符串:" + byte2hex(encoded));                byte[] srcBytes = decryptMode(keyBytes, encoded);        System.out.println("解密后的字符串:" + byte2hex(srcBytes));    }}
------解决方案--------------------------------------------------------
下面的程序是改装火龙果大侠以前写的:

Java code
import java.security.Key;import java.security.spec.KeySpec;import javax.crypto.Cipher;import javax.crypto.SecretKey;import javax.crypto.SecretKeyFactory;import javax.crypto.spec.DESKeySpec;public class BcTest {    static void test() throws Exception {    byte[] data = { 0x06, 0x11, 0x11, 0x11, (byte) 0xFF, (byte) 0xFF,        (byte) 0xFF, (byte) 0xFF };    byte[] key1 = new byte[] { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,        0x11 };    byte[] key2 = new byte[] { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,        0x11 };    byte[] key3 = new byte[] { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,        0x11 };    // 3DES ciphertext = EK3(DK2(EK1(plaintext)))    byte[] crypt = encrypt(decrypt(encrypt(data, key1), key2), key3);    // 3DES plaintext = DK1(EK2(DK3(ciphertext)))    byte[] plain = decrypt(encrypt(decrypt(crypt, key3), key2), key1);    System.out.println("  key: " + ByteUtil.bytes2HexSpace(key1) + " "        + ByteUtil.bytes2HexSpace(key2) + " "        + ByteUtil.bytes2HexSpace(key3));    System.out.println(" data: " + ByteUtil.bytes2HexSpace(data));    System.out.println("crypt: " + ByteUtil.bytes2HexSpace(crypt));    System.out.println("plain: " + ByteUtil.bytes2HexSpace(plain));    }    public static void main(String[] args) throws Exception {    test();    }    public static byte[] decrypt(byte[] crypt, byte[] key) throws Exception {    Key k = toKey(key);    Cipher cipher = Cipher.getInstance("DES/ECB/NoPadding");    cipher.init(Cipher.DECRYPT_MODE, k);    return cipher.doFinal(crypt);    }    public static byte[] encrypt(byte[] data, byte[] key) throws Exception {    Key k = toKey(key);    Cipher cipher = Cipher.getInstance("DES/ECB/NoPadding");    cipher.init(Cipher.ENCRYPT_MODE, k);    return cipher.doFinal(data);    }    public static SecretKey toKey(byte[] key) throws Exception {    KeySpec dks = new DESKeySpec(key);    SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");    return keyFactory.generateSecret(dks);    }}class ByteUtil {    private static final char HEX[] = "0123456789abcdef".toCharArray();    public static String bytes2HexSpace(byte bys[]) {    char chs[] = new char[(bys.length * 2 + bys.length) - 1];    int i = 0;    int offset = 0;    for (; i < bys.length; i++) {        if (i > 0)        chs[offset++] = ' ';        chs[offset++] = HEX[bys[i] >> 4 & 15];        chs[offset++] = HEX[bys[i] & 15];    }    return new String(chs);    }}/*output:key: 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11data: 06 11 11 11 ff ff ff ffcrypt: c1 33 5c 0c 5e c4 89 58plain: 06 11 11 11 ff ff ff ff*/
  相关解决方案