-3

用代码做三重DES:

public class TripleDES {

    private static sun.misc.BASE64Decoder decoder = new sun.misc.BASE64Decoder();
    private static sun.misc.BASE64Encoder encoder = new sun.misc.BASE64Encoder();

    public static void main(String[] args) {

        try {
            try {
                Cipher c = Cipher.getInstance("DESede");
            } catch (Exception e) {
                System.err.println("Installing SunJCE provider.");
                Provider sunjce = new com.sun.crypto.provider.SunJCE();
                Security.addProvider(sunjce);
            }

            File keyFile = new File("D:/3DES/keygen.txt");

            /*
             * writeKey(generateKey(),keyFile);
             * System.out.println("After writing to file");
             */

            SecretKey rKey = readKey(keyFile);
            System.out.println("Secret key :" + rKey);
            String encryptedMssg = encrypt(rKey, "afda");
            System.out.println("Encrypted mssg :" + encryptedMssg);

            String decryptedMssg = decrypt(rKey, encryptedMssg);
            System.out.println("Decrypted mssg :" + decryptedMssg);

        } catch (Exception e) {
            System.err.println(e);
            System.err.println("Usage: java " + TripleDES.class.getName()
                    + " -d|-e|-g <keyfile>");
        }
    }

    public static SecretKey generateKey() throws NoSuchAlgorithmException {
        KeyGenerator keygen = KeyGenerator.getInstance("DESede");
        System.out.println(keygen.generateKey());
        return keygen.generateKey();
    }

    public static void writeKey(SecretKey key, File f) throws IOException,
            NoSuchAlgorithmException, InvalidKeySpecException {
        SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("DESede");
        DESedeKeySpec keyspec = (DESedeKeySpec) keyfactory.getKeySpec(key,
                DESedeKeySpec.class);
        byte[] rawkey = keyspec.getKey();
        FileOutputStream out = new FileOutputStream(f);
        out.write(rawkey);
        out.close();
    }

    public static SecretKey readKey(File f) throws IOException,
            NoSuchAlgorithmException, InvalidKeyException,
            InvalidKeySpecException {
        DataInputStream in = new DataInputStream(new FileInputStream(f));
        byte[] rawkey = new byte[(int) f.length()];
        in.readFully(rawkey);
        in.close();
        DESedeKeySpec keyspec = new DESedeKeySpec(rawkey);
        SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("DESede");
        SecretKey key = keyfactory.generateSecret(keyspec);

        return key;
    }

    public static SecretKey readKey(byte[] rawkey) throws IOException,
            NoSuchAlgorithmException, InvalidKeyException,
            InvalidKeySpecException {
        // DataInputStream in = new DataInputStream(new FileInputStream(f));
        // byte[] rawkey = new byte[(int)f.length()];
        // in.readFully(rawkey);
        // in.close();
        DESedeKeySpec keyspec = new DESedeKeySpec(rawkey);
        SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("DESede");
        SecretKey key = keyfactory.generateSecret(keyspec);

        return key;
    }

    public static String encrypt(SecretKey key, String clearData)
            throws NoSuchAlgorithmException, InvalidKeyException,
            NoSuchPaddingException, IOException, Exception {
        System.out.println("inside encrypt");
        System.out.println("KEYYYYY::" + key);
        Cipher cipher = Cipher.getInstance("DESede");
        cipher.init(Cipher.ENCRYPT_MODE, key);
        byte[] cleartext = clearData.getBytes("ASCII");
        byte[] ciphertext = cipher.doFinal(cleartext);

        return encoder.encode(ciphertext);
    }

    public static String decrypt(SecretKey key, String encryptedData)
            throws NoSuchAlgorithmException, InvalidKeyException, IOException,
            IllegalBlockSizeException, NoSuchPaddingException,
            BadPaddingException, Exception {
        Cipher cipher = Cipher.getInstance("DESede");
        cipher.init(Cipher.DECRYPT_MODE, key);
        byte[] dec = decoder.decodeBuffer(encryptedData);
        byte[] clearbytes = cipher.doFinal(dec);

        return new String(clearbytes, "ASCII");
    }


}

使用此代码,我不应该先加密然后解密然后再加密吗?它正在生成加密字符串,但与问题区域所在的在线 des 计算器不匹配。

什么是问题区域?

4

1 回答 1

1

加密算法"DESede"是使用密钥 C 进行加密,使用密钥 B 进行解密,使用密钥 A 进行加密。这些密钥取自提供给 的数据DESedeKeySpec。所以DESedeKeySpec应该包含连接的键 C、B 和 A:3 * 8 字节 = 24 字节。

较新的 Java 版本还支持 16 字节的 DES EDE 密钥。在这种情况下,加密、解密和加密由用于加密的密钥 A、用于解密的密钥 B 和用于再次加密的 A 执行。这通常称为 DES ABA 密钥。

换句话说,DESede 确实在算法本身内部使用了三个密钥。您不必自己编程,而且您的代码似乎执行得很好。

于 2014-11-09T20:45:50.177 回答