AES算法

Posted wangpengpeng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AES算法相关的知识,希望对你有一定的参考价值。

AES128Bit ECB加解密算法:

public static String Encrypt(String data,String key) throws Exception{
  byte[] raw = HexUtils.hexStr2ByteArr(key);
  SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
  Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");// "算法/模式/补码方式"
  cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
  byte[] inData = HexUtils.hexStr2ByteArr(data);
  byte[] outData = cipher.doFinal(inData);
  return HexUtils.byteArr2HexStr(outData);     
}

/**
     * 16进制字符串转字节数组,单字节(双字符)转单字节
     * 
     * @param data
     * @return
     */
    public static byte[] hexStr2ByteArr(String data) {
        if (data == null || data.equals("")) {
            return null;
        }
        data = data.toUpperCase();
        int length = data.length() / 2;
        char[] hexChars = data.toCharArray();
        byte[] d = new byte[length];
        for (int i = 0; i < length; i++) {
            int pos = i * 2;
            d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1]));
        }
        return d;
        // 另一种写法
        // public static byte[] hexStrToByteArr(String data) {
        // if ((data == null) || (data.length() < 2))
        // return null;
        // int len = data.length() / 2;
        // byte[] buffer = new byte[len];
        // for (int i = 0; i < len; i++) {
        // buffer[i] = (byte) Integer.parseInt(data.substring(i * 2, i * 2 + 2),
        // 16);
        // }
        // return buffer;
        // }
    }
public static String byteArr2HexStr(byte[] data) {
        String hs = "";
        String stmp = "";
        for (int n = 0; n < data.length; n++) {
            stmp = (Integer.toHexString(data[n] & 0XFF));
            if (stmp.length() == 1)
                hs = hs + "0" + stmp + "";
            else
                hs = hs + stmp + "";
        }
        return hs.toUpperCase();
    }
/**
     * AES128bit ECB解密
     * 
     * @param data
     *            16进制数据,16字节整数倍
     * @param key
     *            16进制数据,16字节
     * @return
     * @throws Exception
     */
    public static String Decrypt(String data, String key) throws Exception {
        if (data.length() % 32 != 0) {
            System.out.println("数据不是16字节整数倍");
            return null;
        }

        if (key.length() != 32) {
            System.out.print("Key长度不是16字节");
            return null;
        }

        byte[] raw = HexUtils.hexStr2ByteArr(key);
        SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
        Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");// "算法/模式/补码方式"
        cipher.init(Cipher.DECRYPT_MODE, skeySpec);
        byte[] inData = HexUtils.hexStr2ByteArr(data);
        byte[] outData = cipher.doFinal(inData);
        return HexUtils.byteArr2HexStr(outData);
    }

 

以上是关于AES算法的主要内容,如果未能解决你的问题,请参考以下文章

aes算法填充方式

aes算法步骤

正确使用AES对称加密

php与java通用AES加密解密算法

正确使用AES对称加密

浅析加密算法六AES密码