AES算法的Java实现,直接对String操作

8 篇文章 0 订阅
5 篇文章 0 订阅

问题:

    今天用Java写了一下AES算法,该算法完全对String进行操作,不需要在工具类之外对byte[]和String进行互转。大大方便了使用。


代码及注释:

AESUtil.java

package aes;

import java.security.Key; 
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;

public class AESUtil {
	/**
     * 密钥算法
     */
    public static final String KEY_ALGORITHM = "AES";
    /**
     * 加密/解密算法  /工作模式  /填充方式
     */
    public static final String CIPHER_ALGORITHM = "AES/ECB/PKCS5Padding";

    /**
     * 转换密钥
     * @param key 待密钥
     * @return 转换后的密钥
     * @throws Exception 抛出异常
     */
    private static Key toKey(byte[] key) throws Exception{
        //实例化AES密钥材料
        SecretKey secretKey = new SecretKeySpec(key, KEY_ALGORITHM);
        return secretKey;
    }

    /**
     * AES解密
     * @param data 待解密数据
     * @param key 密钥
     * @return 明文
     * @throws Exception 抛出异常
     */
    private static byte[] decrypy(byte[] data, byte[] key) throws Exception{
        //还原密钥
        Key k = toKey(key);
        Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
        //初始化,设置解密模式
        cipher.init(Cipher.DECRYPT_MODE, k);
        return cipher.doFinal(data);
    }

    /**
     * AES解密
     * @param data 密文
     * @param aesKey AES密钥
     * @return 明文
     * @throws Exception 抛出异常
     */
    public static String decrypt(String data, String aesKey) throws Exception{
        byte[] data_byets = Base64.decodeBase64(data);
        byte[] aesKey_bytes = Base64.decodeBase64(aesKey);
        byte[] result = decrypy(data_byets, aesKey_bytes);
        return new String(result);
        //return "hahaha";
    }

    /**
     * AES加密
     * @param data 待加密数据
     * @param key 密钥
     * @return 密文
     * @throws Exception 抛出异常
     */
    private static byte[] encrypy(byte[] data, byte[] key) throws Exception{
        Key k = toKey(key);
        Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
        //初始化,设置解密模式
        cipher.init(Cipher.ENCRYPT_MODE, k);
        return cipher.doFinal(data);
    }

    /**
     * AES加密
     * @param data 待加密数据
     * @param aesKey AES密钥
     * @return 密文
     * @throws Exception 抛出异常
     */
    public static String encrypt(String data, String aesKey) throws Exception{
        byte[] data_bytes = data.getBytes();
        byte[] aesKey_bytes = Base64.decodeBase64(aesKey);
        byte[] result = encrypy(data_bytes, aesKey_bytes);
        return Base64.encodeBase64String(result);
    }

    /**
     * 生成AES密钥
     * @return AES密钥
     * @throws Exception 抛出异常
     */
    public static String initKey() throws Exception{
        //实例化
        KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_ALGORITHM);
        //设置密钥长度
        keyGenerator.init(256);
        //生成密钥
        SecretKey secretKey = keyGenerator.generateKey();
        //获得密钥的二进制编码形式
        return Base64.encodeBase64String(secretKey.getEncoded());
    }
}


AES.java

package aes;

public class AES {
	public static void main(String[] args) throws Exception{
		// TODO Auto-generated method stub
        String data = "中华人民共和国";
        System.out.println("原文:\n" + data);
        String aesKey = AESUtil.initKey();
        System.out.println("AES密钥:\n" + aesKey);
        String encrypyStr = AESUtil.encrypt(data, aesKey);
        System.out.println("密文:\n" + encrypyStr);
        String decryptStr = AESUtil.decrypt(encrypyStr, aesKey);
        System.out.println("明文:\n" + decryptStr);
	}

}


运行结果:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值