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-128-CBC是一种对称密钥加密算法,其中AES代表高级加密标准(Advanced Encryption Standard),128表示使用128位的密钥长度,CBC表示密码分组链接模式(Cipher Block Chaining)。 在AES-128-CBC中,数据被分为固定长度的块,并使用128位的密钥进行加密和解密。加密时,每个数据块会与前一个加密的数据块进行异或操作,以增加安全性。初始块由初始化向量(IV)指定,IV必须是随机且不可预测的。 AES-128-CBC具有以下特点: 1. 强大的安全性:采用128位的密钥长度和CBC模式,可提供较高的安全性,抵御当前常用的攻击手段。 2. 快速的加解密速度:AES算法基于矩阵运算,可以通过硬件优化和并行计算进行加速,实现快速的加解密操作。 3. 可逆性:加密和解密操作使用相同的密钥,可以实现数据的可逆转换,保证数据的完整性和可读性。 4. 简单易用:Java提供了内置的加密库,使得在Java中使用AES-128-CBC算法变得简单方便。 然而,AES-128-CBC也存在一些不足之处: 1. 密钥管理:由于使用对称密钥,需要使用者妥善管理密钥的生成、传输和保存,以保证密钥的安全性。 2. 块长度有限:AES-128-CBC只能处理固定长度的数据块,如果数据长度不是块长度的整数倍,需要进行填充或截断操作。 3. CBC模式下的性能损耗:由于每个数据块都需要依赖前一个数据块的加密结果,导致加解密操作无法并行处理,可能造成一定的性能损耗。 总的来说,AES-128-CBC是一种安全性较高、速度较快的对称密钥加密算法,适用于Java环境下的数据加密和解密需求。使用时需要注意密钥管理和数据块长度限制等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值