首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java相关 >

java 3des加密算法求解解决思路

2013-07-01 
java3des加密算法求解我下载了一个3des加密的工具,得到如下结果:原文:06111111FFFFFFFF密钥:1111111111111

java 3des加密算法求解
我下载了一个3des加密的工具,得到如下结果:
原文:06111111FFFFFFFF
密钥:11111111111111111111111111111111
密文:C1335C0C5EC48958

这个也是我需要的结果,但是我用java始终没有得到这样的结果。求相关java代码,紧急,谢谢
[解决办法]
我用java写的测试,生成的结果前面的8字节与你相同,只是多个8个字节,供参考:


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));
    }
}



运行结果:
加密前的字符串:06:11:11:11:FF:FF:FF:FF
加密后的字符串:C1:33:5C:0C:5E:C4:89:58:B9:53:74:BA:8D:DF:F8:C2
解密后的字符串:06:11:11:11:FF:FF:FF:FF

[解决办法]
下面的程序是改装火龙果大侠以前写的:



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 11
data: 06 11 11 11 ff ff ff ff
crypt: c1 33 5c 0c 5e c4 89 58
plain: 06 11 11 11 ff ff ff ff
*/






原文:
http://topic.csdn.net/u/20100512/19/c7dcc2fa-a561-4d81-9969-b31bea3bfacc.html

热点排行