DES属对称加密——块加密,现在基本不用了,但也没规定不准用了,学学没坏处。你写了放在什么工程实践里,简直酷毙了。

  1. 密码体系包括明文空间、密文空间、密钥空间、加密算法、解密算法(记住这几个,看参数会理解地容易些)。
  2. 本代码可再做优化,加密解密只是参数不同,但分开写有利于学习。
  3. 密钥生成算法没有写,毕竟现在都不用了,而且密钥规定8字节,学习学习就够了,不用深究。
  4. 解密部分最后结果必须用new String处理返回,用toString和Awarry的string转换是不行的,具体原因回头在另一片文章里写清楚。【toString与new String】
  5. Base64的具体知识也在另一篇文章里写。base64笔记

代码

package DES;

import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.SecretKeySpec;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;

/**
 * @创建人 
 * @创建时间 
 * @描述  对称加密——DES加密
 */
public class DES {


    /**
     * DES加密
     * @param input 明文
     * @param key  秘钥 必须为8字节
     * @param transformation  算法
     * @param algorthm  加密类型
     * @return  经过base64编码处理过的密文,
     *          base64编码处理的原因:加密后为字节数组,不一定存在于asscii表中,
     *          譬如,可能加密后的字节中有-66,此字符在表中不存在
     */
    private static String encryptDES(String input, String key, String transformation, String algorthm)
            throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {

        //获取Java加密操作的对象Cipher
        Cipher cipher = Cipher.getInstance(transformation);

        //创建加密规则 参数:秘钥的字节,加密类型
        SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(),algorthm);

        //调用cipher对象初始化加密模式和算法
        //Cipher.ENCRYPT_MODE 为加密模式
        //Cipher.DECRYPT_MODE 为解密模式
        cipher.init(Cipher.ENCRYPT_MODE,secretKeySpec);

        //执行加密操作 返回的是字节数组
        byte[] bytes = cipher.doFinal(input.getBytes());

        String encode = Base64.encode(bytes);


        return encode;
    }

    /**
     * DES解密
     * @param encryptDES  密文
     * @param key  密钥 必须为8字节
     * @param transformation  加密算法
     * @param algoryhm  加密类型
     * @return 明文字符串
     */
    private static String decryptDES(String encryptDES,String key,String transformation,String algoryhm)
            throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {

        Cipher cipher = Cipher.getInstance(transformation);
        SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(),algoryhm);
        cipher.init(Cipher.DECRYPT_MODE,secretKeySpec);
        byte[] decode = Base64.decode(encryptDES); //加密时得到的密文是base64编码处理后的字符串
        byte[] bytes = cipher.doFinal(decode);

        return new String(bytes); //返回值必须是new String处理的字节数组
    }

    public static void main(String[] args) throws IllegalBlockSizeException, InvalidKeyException, BadPaddingException, NoSuchAlgorithmException, NoSuchPaddingException {
        String input = "作曲 : LTN乐队\n" + "\n" + "作词 : LTN乐队\n" + "\n" + "她曾这样穷尽一生\n" + "\n" +
                "劝告人们不必认真\n" + "\n" + "那还在回想的爱\n" + "\n" + "深沉\n" + "\n" + "他仍然在倾尽所能\n" +
                "\n" + "装满自己失落灵魂\n" + "\n" + "那还在远处的路\n" + "\n" + "清醒\n" + "\n" + "把不带走的已丢尽\n" +
                "\n" + "孑然乞讨一丝惊喜\n" + "\n" + "崎岖伴游戏伴四季\n" + "\n" + "聚散存于\n" + "\n" + "失之交臂\n" +
                "\n" + "走吧 aaa~\n" + "\n" + "走吧 aaa~\n" + "\n" + " \n" + "\n" + "走吧 haa~\n" + "\n" +
                "走吧 haa~\n" + "\n" + " \n" + "\n" + "作词:BAIGANG\n" + "\n" + "作曲:BAIGANG\n" + "\n" +
                "编曲:LTN乐队/袁志鹏\n" + "\n" + "混音师:王晨雨\n" + "\n" + "出品方:众乐纪\n";

        String key = "12345678";
        String transformation = "DES";
        String algorthm = "DES";

        System.out.println("原文是:" + input);
        String encryptDES = encryptDES(input,key,transformation,algorthm);
        System.out.println("密文是:" + encryptDES);
        String decryptDES = decryptDES(encryptDES,key,transformation,algorthm);
        System.out.println("解密后原文是:" + decryptDES);

    }

}