DES对称加密-CSDN博客

DES是一个分组加密算法,典型的DES64位为分组对数据加密,加密和解密用的是同一个
算法。它的密钥长度64位,其中8位不参与加密计算,仅仅用做校验该密钥的有效性。所以
真正参与加密的密钥是56位。
DES对64位(bit)的明文分组M进行操作,M经过一个初式置换ip,置换成m0,将m0明文分
成左半部分和右半部分,各32位长
DES会根据我们的原始密钥生成16个64位长度的加密密钥,分别供每一轮运算中使用(每一轮就
是对左右部分进行运算)
package cn.hzh.demo.test;

import org.apache.tomcat.util.codec.binary.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;

/**
 * @author hzh
 * @create 2019/11/19
 */
 
public class DESTest {

    public static void main(String[] args) throws IllegalBlockSizeException, InvalidKeyException, BadPaddingException, NoSuchAlgorithmException, NoSuchPaddingException {

        /**
         * 明文: cleartext
         * 原始密钥:oraginKey
         */
        // 问题二 :原始密钥必须64位8个字节,否则报错(AES原始密钥可以128位16个字节)
        // 解决>> 无论原始密钥多长,我们都要形成长度为8个字节的密钥

        String cleartext = "嗨!This is just a test";
        String oraginKey = "abcefsaasas";
        //获得8个字节的密钥
        String key = getKey(oraginKey);
        //加密后的密文
        String ciphertext = desEncript(cleartext, key);
        System.out.println(ciphertext);
        //解密后的明文
        String text = desDecript(ciphertext, key);
        System.out.println(text);

    }

    /**
     * 用DES算法进行加密
     *  Cipher
     *
     * NoSuchPaddingException 填充异常
     * NoSuchAlgorithmException 没有此算法异常
     * InvalidKeyException 无效的密钥异常
     */
    private static String desEncript(String cleartext,String oraginKey) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
        //1、获得加密算法工具类对象 Cipher
        Cipher cipher = Cipher.getInstance("DES");
        //2、对加密工具类对象进行初式化
        //   MODE:加密解密模式
        //   key: 对原始密钥处理后的密钥
        SecretKeySpec key = new SecretKeySpec(oraginKey.getBytes(),"DES");
        cipher.init(Cipher.ENCRYPT_MODE,key);
        //3、用加密工具来对明文进行加密
        byte[] doFinal = cipher.doFinal(cleartext.getBytes());

        // 问题一 :这个地方不能用gbk进行解码,因为在加密的过程,可能导致在编码表找不到对应的字符
        // 解决>> 用Base64,加密后用Base64进去编码,然后再gbk解码(Base64编码后,就一定可以用gbk解码)
        // 错误>> return new String(doFinal);

        byte[] base64 = Base64.encodeBase64(doFinal);
        return new String(base64);
    }

    /**
     * 用DES算法进行解密
     *  Cipher
     */
    private static String desDecript(String ciphertext,String oraginKey) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
        //1、获得加密算法工具类对象 Cipher
        Cipher cipher = Cipher.getInstance("DES");
        //2、对加密工具类对象进行初式化
        SecretKeySpec key = new SecretKeySpec(oraginKey.getBytes(),"DES");
        cipher.init(Cipher.DECRYPT_MODE,key);
        //3、用解密工具来对明文进行解密
        //   因为之前有用Base64编码,所以解密之前要先用Base64进去解码
        byte[] base64 = Base64.decodeBase64(ciphertext.getBytes());

        byte[] cipherBytes = cipher.doFinal(base64);
        return new String(cipherBytes);

    }

    private static String getKey(String oraginKey){
        //字节数组元素初始化默认为0
        byte[] key = new byte[8];
        byte[] oraginBytes = oraginKey.getBytes();
        for (int i = 0; i< 8 && i < oraginBytes.length; i++) {
            key[i] = oraginBytes[i];
        }
        return new String(key);
    }
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值