AES AES-CBC-128

AES共有ECB、CBC、CFB、OFB、CTR五种模式


AES-128-CBC可以自己定义“密钥”和“偏移量“;

1、AES-CBC-128

public class RiskUtil {

    public static String certify(JSONObject json,String RISK_CONTROL_KEY,String IV,String DEFAULT_ENCODING,String AES,String PADDING) {

        json.put("name", UnicodeUtils.native2ascii(json.get("name")+""));
        String jsonStr = json.toString();
        jsonStr = jsonStr.replace("\\\\", "\\");
        String encryptData = encrypt(jsonStr, RISK_CONTROL_KEY,IV,DEFAULT_ENCODING,AES,PADDING);
        System.out.println("encryptData="+encryptData);
        return encryptData;

    }
    private static String encrypt(String code, String key,String Iv,String DEFAULT_ENCODING,String AES,String PADDING) {
        code = padding(code);
        try {
            return new Base64()
                    .encodeToString(encrypt(code.getBytes(DEFAULT_ENCODING),
                            key.getBytes(DEFAULT_ENCODING),Iv.getBytes(DEFAULT_ENCODING),AES,PADDING));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    private static byte[] encrypt(byte[] code, byte[] key,byte[] Iv,String AES,String PADDING) throws Exception {
        SecretKeySpec keySpec = new SecretKeySpec(key, AES);
        Cipher cipher = Cipher.getInstance(PADDING);// "算法/模式/补码方式"
        // 使用CBC模式,需要一个向量iv,可增加加密算法的强度
        IvParameterSpec iv = new IvParameterSpec(Iv);
        cipher.init(Cipher.ENCRYPT_MODE, keySpec, iv);
        return cipher.doFinal(code);
    }

    public static String decrypt(String data, String key,String IV,String DEFAULT_ENCODING,String AES,String PADDING) {
        data = padding(data);
        try {
            return new String(decrypt(data.getBytes(DEFAULT_ENCODING), key.getBytes(DEFAULT_ENCODING),
                    IV.getBytes(DEFAULT_ENCODING),DEFAULT_ENCODING,AES,PADDING));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    private static byte[] decrypt(byte[] src, byte[] key,byte[] Iv,String DEFAULT_ENCODING,String AES,String PADDING) throws Exception {
        SecretKeySpec keySpec = new SecretKeySpec(key, AES);
        Cipher cipher = Cipher.getInstance(PADDING);
        IvParameterSpec iv = new IvParameterSpec(Iv);
        cipher.init(Cipher.DECRYPT_MODE, keySpec, iv);
        byte[] _src = new Base64().decode(src);
        return cipher.doFinal(_src);
    }

    private static String padding(String code) {
        for (int i = 0; i < code.length(); i++) {
            code += " ";
            if (code.length() % 16 == 0) {
                break;
            }
        }
        return code;
    }
    public static void main(String[] args) {

        final String AES = "AES";
        final String PADDING = "AES/CBC/NoPadding";// "算法/模式/补码方式"
        final String DEFAULT_ENCODING = "utf-8";
        final String IV = "1234567812345678";
        // 身份认证
        final String RISK_CONTROL_URL = "http://fengkong.haodai.com/api/data/index";
        final String RISK_CONTROL_KEY = "UMorc6ecjMgKANVLaoO4VUP7T8DxRdgv";
        final String RISK_CONTROL_ID = "00000000-0";
        Request request = JsonUtil.fromJson("{'type':'202','name':'小米','idcard':'110105198307077715'}", Request.class);
        JSONObject jo = JSONObject.fromObject(JsonUtil.toJson(request));
        RiskUtil rt = new RiskUtil();
        System.out.println("encryptData="+rt.certify(jo,RISK_CONTROL_KEY,IV,DEFAULT_ENCODING,AES,PADDING));
        //JSONObject jo2 = JSONObject.fromObject(rt.certify(jo,RISK_CONTROL_KEY,IV,DEFAULT_ENCODING,AES,PADDING));
        //System.out.println("加密编码后:" +decrypt(jo2.get("data")+"",RISK_CONTROL_KEY));
    }
}

2、 中文编码转换

public class UnicodeUtils {
    public static String native2ascii(String code) {
        char[] chars = code.toCharArray();
        int charValue = 0;
        String result = "";
        for(int i = 0; i < chars.length; i++){
            charValue = (int) code.charAt(i);
            if (charValue <= 256) {
                // result += "& "+Integer.toHexString(charValue)+";";
                result += "\\"+Integer.toHexString(charValue);
            }else{
                // result += "&#x"+Integer.toHexString(charValue)+";";
                result += "\\u"+Integer.toHexString(charValue);
            }
        }
        return result;
    }

    public static String ascii2native(String code) {
        char aChar;
        int len = code.length();
        StringBuffer outBuffer = new StringBuffer(len);
        for (int x = 0; x < len;) {
            aChar = code.charAt(x++);
            if (aChar == '\\') {
                aChar = code.charAt(x++);
                if (aChar == 'u') {
                    // Read the xxxx
                    int value = 0;
                    for (int i = 0; i < 4; i++) {
                        aChar = code.charAt(x++);
                        switch (aChar) {
                            case '0':
                            case '1':
                            case '2':
                            case '3':
                            case '4':
                            case '5':
                            case '6':
                            case '7':
                            case '8':
                            case '9':
                                value = (value << 4) + aChar - '0';
                                break;
                            case 'a':
                            case 'b':
                            case 'c':
                            case 'd':
                            case 'e':
                            case 'f':
                                value = (value << 4) + 10 + aChar - 'a';
                                break;
                            case 'A':
                            case 'B':
                            case 'C':
                            case 'D':
                            case 'E':
                            case 'F':
                                value = (value << 4) + 10 + aChar - 'A';
                                break;
                            default:
                                throw new IllegalArgumentException(
                                        "Malformed   \\uxxxx   encoding.");
                        }
                    }
                    outBuffer.append((char) value);
                } else {
                    if (aChar == 't')
                        aChar = '\t';
                    else if (aChar == 'r')
                        aChar = '\r';
                    else if (aChar == 'n')
                        aChar = '\n';
                    else if (aChar == 'f')
                        aChar = '\f';
                    outBuffer.append(aChar);
                }
            } else
                outBuffer.append(aChar);

        }
        return outBuffer.toString();
    }

    public static void main(String[] args) {
        String result = native2ascii("中国");
        String _result = ascii2native(result);
        System.out.println(result);
        System.out.println(_result);
    }

}




你可能感兴趣的:(aes,AES-CBC-128)