• AES加密工具类(对称加密算法)


     import java.nio.charset.Charset;

    import java.security.Key;

    import javax.crypto.Cipher;
    import javax.crypto.KeyGenerator;
    import javax.crypto.SecretKey;
    import javax.crypto.spec.SecretKeySpec;

    import com.jfinal.log.Log;

    /**
    * AES安全编码组件
    *
    * 高级数据加密标准---AES:由于DES的问题所以产生了AES,像是DES的升级,密钥建立时间短,灵敏性好,内存要求低,被广泛应用
    *
    * 说明:
    *
    * 对于java.security.InvalidKeyException: Illegal key size or default
    * parameters异常, 去掉这种限制需要下载Java Cryptography Extension (JCE) Unlimited Strength
    * Jurisdiction Policy Files, 下载包的readme.txt
    * 有安装说明。就是替换${java_home}/jre/lib/security/
    * 下面的local_policy.jar和US_export_policy.jar
    */
    public abstract class ToolAES {

    @SuppressWarnings("unused")
    private static final Log log = Log.getLog(ToolAES.class);

    /**
    * 密钥算法
    */
    public static final String KEY_ALGORITHM = "AES";

    /**
    * 加密/解密算法 / 工作模式 / 填充方式 Java 6支持PKCS5Padding填充方式 Bouncy
    * Castle支持PKCS7Padding填充方式
    */
    public static final String CIPHER_ALGORITHM = "AES/ECB/PKCS5Padding";

    /**
    * 转换密钥
    *
    * @param key
    * 二进制密钥
    * @return Key 密钥
    * @throws Exception
    */
    private static Key toKey(byte[] key) throws Exception {
    // 实例化AES密钥材料
    SecretKey secretKey = new SecretKeySpec(key, KEY_ALGORITHM);

    return secretKey;
    }

    /**
    * 解密
    *
    * @param data
    * 待解密数据
    * @param key
    * 密钥
    * @return byte[] 解密数据
    * @throws Exception
    */
    public static byte[] decrypt(byte[] data, byte[] key) throws Exception {
    // 还原密钥
    Key k = toKey(key);

    /*
    * 实例化 使用PKCS7Padding填充方式,按如下方式实现 Cipher.getInstance(CIPHER_ALGORITHM, "BC");
    */
    Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);

    // 初始化,设置为解密模式
    cipher.init(Cipher.DECRYPT_MODE, k);

    // 执行操作
    return cipher.doFinal(data);
    }

    /**
    * 加密
    *
    * @param data
    * 待加密数据
    * @param key
    * 密钥
    * @return byte[] 加密数据
    * @throws Exception
    */
    public static byte[] encrypt(byte[] data, byte[] key) throws Exception {
    // 还原密钥
    Key k = toKey(key);

    /*
    * 实例化 使用PKCS7Padding填充方式,按如下方式实现 Cipher.getInstance(CIPHER_ALGORITHM,
    * "BC");
    */
    Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);

    // 初始化,设置为加密模式
    cipher.init(Cipher.ENCRYPT_MODE, k);

    // 执行操作
    return cipher.doFinal(data);
    }

    /**
    * 生成密钥 <br>
    *
    * @return byte[] 二进制密钥
    * @throws Exception
    */
    public static byte[] initKey() throws Exception {
    // 实例化
    KeyGenerator kg = KeyGenerator.getInstance(KEY_ALGORITHM);

    /*
    * AES 要求密钥长度为 128位、192位或 256位
    */
    // kg.init(256);
    kg.init(128);

    // 生成秘密密钥
    SecretKey secretKey = kg.generateKey();

    // 获得密钥的二进制编码形式
    return secretKey.getEncoded();
    }


    public static void main(String[] args) {
    try {
    byte[] publicKey = initKey();
    String dataStr = "今天的天气很好";
    // byte[] beforData = dataStr.getBytes("UTF-8");
    byte[] beforData = dataStr.getBytes();
    log.info(new String(beforData));
    byte[] afterData = encrypt(beforData, publicKey);
    log.info(new String(afterData));

    byte[] deData = decrypt(afterData, publicKey);
    log.info(new String(deData));

    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    }

  • 相关阅读:
    Subsequence
    【模板】AC自动机(加强版)
    1563: hzwer的跳跳棋(hop)
    P2469 [SDOI2010]星际竞速
    P2746 [USACO5.3]校园网Network of Schools
    Blocks
    Training little cats
    Period
    UVA-3942 Remember the Word
    初学线段树(poj3264+poj2777)
  • 原文地址:https://www.cnblogs.com/YuyuanNo1/p/10270886.html
Copyright © 2020-2023  润新知