16 对称加密之AES加解密

该博客展示了如何在Java中实现AES和DES加密解密。提供了详细的代码示例,包括加密和解密方法,以及密钥的生成。演示了使用`Cipher`类和`SecretKeySpec`进行加解密操作,并通过`HexUtils`转换字节到16进制字符串或反之。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import com.yutu.pwd.util.HexUtils;
import org.junit.jupiter.api.Test;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;

/**
 * Aes加密
 */
public class AESTest {
    private static final String UTF8 = StandardCharsets.UTF_8.name();

    //加密算法名称
    private static final String ALGORITHM = "AES";
    //AES默认的长度只有16,24,32
    private static final String KEY = "12345678abcdefgh";

    @Test
    public void S() throws Exception{
        String str = "小汪学java";
        //DES加密
        String encrypt = encrypt(str);
        System.out.println("16进制 + Aes 加密后的字符串: " + encrypt);
        System.out.println("------------------------");
        String decrypt = decrypt(encrypt);
        System.out.println("16进制 + Aes 解密后的字符串: " + decrypt);
    }

    /**
     * des加密
     * @param text 待加密的内容
     * @return
     */
    private String encrypt(String text) throws Exception{
        Cipher cipher = getCipher(Cipher.ENCRYPT_MODE, KEY);
        //加密
        byte[] encodedBytes = cipher.doFinal(text.getBytes(UTF8));
        return HexUtils.covertBytes2HexStr(encodedBytes);
    }

    /**
     * 解密
     * @param encodedStr 加密后的字符串
     * @return
     * @throws Exception
     */
    private String decrypt(String encodedStr) throws Exception{
        byte[] bytes = HexUtils.convertHex2Bytes(encodedStr);
        Cipher cipher = Cipher.getInstance(ALGORITHM);
        SecretKey secretKey = new SecretKeySpec(KEY.getBytes(UTF8), ALGORITHM);
        cipher.init(Cipher.DECRYPT_MODE,secretKey);//解密模式
        //获取解码后的字节数组
        byte[] decryptBytes = cipher.doFinal(bytes);
        return new String(decryptBytes,UTF8);
    }

    /**
     * 获取Cipher对象
     * @param type  加解密模式
     * @param seed  密钥key
     * @return
     */
    private Cipher getCipher(int type,String seed) throws Exception{
        Cipher cipher = Cipher.getInstance(ALGORITHM);
        SecretKey secretKey = new SecretKeySpec(seed.getBytes(UTF8), ALGORITHM);
        cipher.init(type,secretKey);//解密模式
        return cipher;
    }
}

在这里插入图片描述
顺带也优化得了Des算法加解密,des的密钥长度位8位.

import org.apache.commons.codec.binary.Base64;
import org.junit.jupiter.api.Test;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;

/**
 * des加密
 */
public class DesTest {
    private static final String UTF8 = StandardCharsets.UTF_8.name();

    //加密算法名称
    private static final String ALGORITHM = "DES";
    private static final String KEY = "12345678";

    @Test
    public void S() throws Exception{
        String str = "小汪学java";
        //DES加密
        String encrypt = encrypt(str);
        System.out.println("base + des 加密后的字符串: " + encrypt);
        System.out.println("------------------------");
        String decrypt = decrypt(encrypt);
        System.out.println("base + des 解密后的字符串: " + decrypt);
    }

    /**
     * des加密
     * @param text 待加密的内容
     * @return
     */
    private String encrypt(String text) throws Exception{
        Cipher cipher = getCipher(Cipher.ENCRYPT_MODE, KEY);
        //加密
        byte[] encodedBytes = cipher.doFinal(text.getBytes(UTF8));
        //展示加密的字节数组,可以使用base64,也可以转为16进制字符串
        return Base64.encodeBase64String(encodedBytes);
    }

    /**
     * 解密
     * @param encodedStr 加密后的字符串
     * @return
     * @throws Exception
     */
    private String decrypt(String encodedStr) throws Exception{
        Cipher cipher = getCipher(Cipher.DECRYPT_MODE, KEY);//解密模式
        //获取解码后的字节数组
        byte[] decryptBytes = cipher.doFinal(Base64.decodeBase64(encodedStr.getBytes(UTF8)));
        return new String(decryptBytes,UTF8);
    }

    /**
     * 获取Cipher对象
     * @param type  加解密模式
     * @param seed  密钥key
     * @return
     */
    private Cipher getCipher(int type,String seed) throws Exception{
        Cipher cipher = Cipher.getInstance(ALGORITHM);
        SecretKey secretKey = new SecretKeySpec(seed.getBytes(UTF8), ALGORITHM);
        cipher.init(type,secretKey);//解密模式
        return cipher;
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值