用java实现3DES加密解密算法

3DES加密也称三重加密,其底层加密算法与DES相同,只不过它的密钥长度是168位。由于在DES加密算法中,64位密钥中每一个字节的第8位是奇偶校验位,所以每个字节中只有后7位起密钥作用,实际是56位密钥长度。但是在3DES加密算法中,需要三个这样的密钥长度才能实现三重加密操作,所以3DES的密钥长度是56✖3=168,算上每个字节的奇偶校验位,则应该输入的密钥长度是168+24=192,即24个字节长度的密钥。在java中实现3DES加密算法的加密关键词是:DESede。以下是在DES加密解密操作的基础上改进的3DES加密解密算法:

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.Key;
import java.security.NoSuchAlgorithmException;
import java.util.Scanner;

public class TripleDES {
    private static final String Algorithm="DESede";
    public static void main(String[] args) throws Exception
    {
        System.out.println("请输入明文:");
        Scanner in=new Scanner(System.in);
        String clearText=in.nextLine();
        System.out.println("请输入24字节的密钥(每输入一个字符代表一个字节):");
        Scanner in1=new Scanner(System.in);
        String originKey=in1.nextLine();
        String cipherText = desEncript(clearText, originKey);
        System.out.println("通过3DES加密后的结果是:");
        System.out.println(cipherText);
        String clearText1=desDecript(cipherText,originKey);
        System.out.println("解密结果是:\n"+clearText1);
    }
    /**
     * 加密算法
     * @param clearText
     * @param originKey
     * @return
     * @throws NoSuchAlgorithmException
     * @throws NoSuchPaddingException
     * @throws InvalidKeyException
     * @throws BadPaddingException
     * @throws IllegalBlockSizeException
     */
    private static String desEncript(String clearText, String originKey) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException
    {
        Cipher cipher=Cipher.getInstance(Algorithm); /*提供加密的方式:DES*/
        SecretKeySpec key=getKey(originKey);  /*对密钥进行操作,产生16个48位长的子密钥*/
        cipher.init(Cipher.ENCRYPT_MODE,key); /*初始化cipher,选定模式,这里为加密模式,并同时传入密钥*/
        byte[] doFinal=cipher.doFinal(clearText.getBytes());   /*开始加密操作*/
        String encode= Base64.encode(doFinal);    /*对加密后的数据按照Base64进行编码*/
        return encode;
    }
    /**
     * 解密算法
     * @param cipherText
     * @param originKey
     * @return
     * @throws BadPaddingException
     * @throws IllegalBlockSizeException
     * @throws NoSuchPaddingException
     * @throws NoSuchAlgorithmException
     * @throws InvalidKeyException
     */
    private static String desDecript(String cipherText, String originKey) throws BadPaddingException, IllegalBlockSizeException, NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException
    {
        Cipher cipher=Cipher.getInstance(Algorithm);   /*初始化加密方式*/
        Key key=getKey(originKey);  /*获取密钥*/
        cipher.init(Cipher.DECRYPT_MODE,key);  /*初始化操作方式*/
        byte[] decode=Base64.decode(cipherText);  /*按照Base64解码*/
        byte[] doFinal=cipher.doFinal(decode);   /*执行解码操作*/
        return new String(doFinal);   /*转换成相应字符串并返回*/
    }
    /**
     * 获取密钥算法
     * @param originKey
     * @return
     */
    private static SecretKeySpec getKey(String originKey)
    {
        byte[] buffer=new byte[24];
        byte[] originBytes=originKey.getBytes();
        /**
         * 防止输入的密钥长度超过192位
         */
        for(int i=0;i<24&&i<originBytes.length;i++)
        {
            buffer[i]=originBytes[i];  /*如果originBytes不足8,buffer剩余的补零*/
        }
        SecretKeySpec key=new SecretKeySpec(buffer,Algorithm); /*第一个参数是密钥字节数组,第二个参数是加密方式*/
        return key;  /*返回操作之后得到的密钥*/
    }
}


程序运行结果如下:
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值