AES 加密、解密(全国建筑资质企业数据爬取)

内容: 使用Java中Cipher工具类进行AES加密,并将加密后的byte数组转换成16进制字符串。(也可以转换成base64字符串)

加密过程:
1.数组扩容(需要是16的倍数)

  1. 加密得到byte数组

  2. 遍历byte数组,对byte字节进行补码成正十进制数值

  3. 十进制数值转换成十六进制数值

  4. 十六进制数值如果只有一位需要在前面追加0补充。 这是为了解密时十六进制进行转换成10进制。

解密过程:
1.十六进制字符串转换成byte数组时需要每两个字符进行, 因为前面加密时进行了补0.

2.进行10进制换算 第一位是进1的,所以要乘以16 然后加上第二位。如果是0的话,乘的时候也是0,所以这是为什么加密的时候要在前面加0(还有一个是为了两两换算).

  1. 十进制进行byte转换, java会自动反转和加密时的byte数组对应起来 4. 拿到原加密数组后进行解密并返回字符串
package com.curtao.company.qualify.crawler.service.jianzhu;

import sun.misc.BASE64Decoder;

import javax.crypto.*;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Arrays;

/**
 * <p>全国建筑资质加密解密测试</p>
 *
 * @author fengjianhao@curtao.com
 * @date 2021/3/1 10:32
 */
public class DecryptTest {
    private static final IvParameterSpec IV_PARAMETER_SPEC = new IvParameterSpec("0000000000000000".getBytes());

    public static void main(String[] args) {
        String str="95780ba0943730051dccb5fe3918f9fe9f9c759baf71007abbbc84deedcdd81cf58832bbc54e50a84c41faa2c40030710f9dcd7c6d7c8c59d5ec869f8d20495c96d9c5cefdb18e82f51bc97e693fe3f430b6cf3fd8efcd3bf65a9a39a26879b7bc99e962b91bd71a76338147699dbc3164789837dc64110c4086caac56339364b1d99464b808aaea5ef660f9d665f31d8a3e56fb4989d53ef51b651408ae82d97e3ee5010f43bbe9c52cf2979cb8dd1b9d6441f2342e05e20e602668340ba20e127ec9ad4ddb42224588a8a924c42c83fa73232dd022ed604d5f478bb722b3b01d00aa01534f643b9e8f8a53d67e08500d20abcb3a5d3f0b9886958b85ed66cd0d9a8bf18a6068ace42537851f1e1d1aba71d76af69f715ab11aa005a48d1ef164ed15dc2ff49f611087de6643e8ba9ce12beed705d01fa9043d8c9d672d64ad808cbd0b16495e1bf3a20c5880567fe8d7a03709230f50bccdd81b1b74689782793feb4dd2d7cd98866c752793880b92e65d29ed53d62f919637922bad0a8c775b43665471fbf90570bbb7a2457aa06feca88f8e7c6a090801eeba020385307e068051e28eb544f07d9e87bca8c391b731fcc728b0d739bf5a016a48c67c03df484346f9caf90c34ba6922921cd9176a314ef3ffc21f3e95c7093d2166f9900755d20e04879c4013974d2e2eed38298785e210dbec56125ecc073303a82ac3e955bd092cdc7730588fe6d1d5f1f97c4258fe0318fd53228c40fc479fa35f7829c19ac8be9371d48b4bae6122c7ffadb86d451de31feb1c6aae750e1cb396bff3ed9d8634a8fd0a9d5bb16431476d4823fadb8b962c79a4127bb6d1499222fe149be9aea15ad30dd71b17bbe650325d6a95c4f30662e8f44e6b610682fbbdbc08f3756c3dc22dfe5d929f24f9a2da6eded92e1a452bdb64c82cbdcf960028b877f7d533e7c3e97df71f112fc37d533a8e93a8efc016497ae160b40253c11d55b08988c1450730633b44149d9acb871d7ba24b8b34355b493b8a2a6e297f44d8e0e0198f9daef734c80e4002211d1b6b7db104b6ce7ed960ff9ce479bd55ed9608867a7660a73b4b87ea211dbefb0ae476e9635a0868e68ae8f5b875c5916c8a875880ed01ef23e94215decf4aaf95cec0b6640635577174721babe623b9c6ace96c378e4166547bed4a31ff26b03c16769091a2393d0a7e064b6f88ab020cca84bd52db40d9178f313faa9a71029d7cfc5515fcf7e58b68b4241907a1d89855e7819f51e7c5da0b46ebfed8c91cb94795987295eab7a8e9d8fe32914df062968769d21741d30f4ec9dd22e493474cc3f176f2e0bc0f2e1419f242f589700c2c046232d87be2dbf1fddf6879f904012c57d8f149caaf9c895c7d66a674202e8029cf25164ea16c387ef579e16e77f39672db77bfaaa9322ec633d6955e842cc6254bf56c80b021bc350b0542ef15fceda74c1ed506e4ca0e0ab4e0ed28062a59caa1744d44efd4d4916b1ca3d9fe08d847b1bcfc730ed3db579943244cc44a087ec06723106fa0799810f877c3003e33d3134e7a543ba110f37bd42faa7f1ae2e9c5f7a636569d20261c0c035cc216a88775be67025207a3442c9d554189397b98babe2f889eed9ff0140781de6f9fe0a3ad567e63d2799767314b25ef3674d6a1b73141f162f4a04c1048df1b22f8503c8eb1c1c66a952574a7304c3cb8b13df7226da173ca76e78cc8f6c3582d35c5f865d630fa8b3cf1e25c623bfea32baa65a5e69d37f315077b7106d7c1eafc8539658df93c0b77c8c456a2f889dc685ce0dac2067b308308de3dd4c9a48b122276500a471357ae13ab6262a518754b1313359d229737b3378f04f6227b996924dd36e2dc21bb17f1aa2bda5654020ba4ade20c80fd37ece9db13c5b75cc8d814c1683868f82a949c753b29ad9fe9a3c8bb6647c47e7da389125ed73a628ccc77f0f1141d6a20a563b8a3da99bb7f422ba959c58eefa7963b49cc61bc24c0638ef935dd5415deacb3b447055cb52188f85d769e6740c1d147fbc4fffff0dd26a1e790c3553c38ac7e790185c9adf9e7a4b3dfd9dcd6b1cd8e1b0ab6bb869aca8e1a66c0781a28c8a44976b4b4c8a872bc68eb37c9df8ff8d5152a00a2c9bbf62c6de113dbe251c2cd1411d2e737b2532147bdc4726bf7e554483d2a99df85ecff9535b212730a8315731e92bcc1f9499b94a384814d379ed64039e2ad0792b073b7612b160c76424902b82dbae81f51c96c021a683d6ae70bf2f250cb1b9e8f69b29d650d100a64a5fd3f8da3e07a152845e44adc75f4cbef042afca349f2c2aa53fd98cc63cd9a57b063a9a2e9600caaa550c649737a0fc7d50484be9ceeee8e224e7b73c80f6eb427ae5080e5639f21240c8714c66509a23e91bcecacfbef17055ecbddf247121222301ecd9d2fd52505";
        String pass="jo8j9wGw%6HbxfFn";
        String decode = decryptByHexString(str, pass);




    }
    /**
     *  加密成十六进制字符串
     *
     *  <p>
     *     使用AES加密,并将Cipher加密后的byte数组转换成16进制字符串
     *  </p>
     *
     * @author Cr
     * @date 2020-03-22
     * */
    public static String encryptIntoHexString(String data, String key){
        try {
            Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
            cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key.getBytes(), "AES"), IV_PARAMETER_SPEC);
            return bytesConvertHexString(cipher.doFinal(Arrays.copyOf(data.getBytes(), 16 * ((data.getBytes().length / 16) + 1))));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 将加密后的十六进制字符串进行解密
     *
     * @author Cr
     * @date 2020-03-22
     *
     * **/
    public static String decryptByHexString(String data, String key){
        try {
            Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
            cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(key.getBytes(), "AES"), IV_PARAMETER_SPEC);
            return new String(cipher.doFinal(hexStringConvertBytes(data.toLowerCase())),"UTF-8");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }


    /**
     *  byte数组转换成十六进制字符串
     *
     *  <p>
     *      先对每个byte数值补码成十进制,
     *      然后在将十进制转换成对应的十六进制.
     *      如果单次转换, 十六进制只有一位时, 将在前面追加0变成两位.
     *  </p>
     *
     * @author Cr
     * @date 2020-03-22
     * */
    private static String bytesConvertHexString(byte [] data){
        StringBuffer result = new StringBuffer();
        String hexString = "";
        for (byte b : data) {
            // 补码成正十进制后转换成16进制
            hexString = Integer.toHexString(b & 255);
            result.append(hexString.length() == 1 ? "0" + hexString : hexString);
        }
        return result.toString().toUpperCase();
    }

    /**
     * 十六进制字符串转换成byte数组
     *
     *  <p>
     *      在加密时, 十六进制数值和byte字节的对应关系 是:  2个十六进制数值对应  1个byte字节  (2: 1)
     *      所以byte数组的长度应该是十六进制字符串的一半, 并且在转换时
     *      应是两个十六进制数值转换成一个byte字节  (2个2个十六进制数值进行转换)
     *     这也是为什么可以*2的原因, 例如: 0, 2, 4, 6, 8, 10, 12 依次遍历
     *  </p>
     *
     * @author Cr
     * @date 2020-04-22
     * */
    private static byte [] hexStringConvertBytes(String data){
        int length = data.length() / 2;
        byte [] result = new byte[length];
        for (int i = 0; i < length; i++) {
            int first = Integer.parseInt(data.substring(i * 2, i * 2 + 1), 16);
            int second = Integer.parseInt(data.substring(i * 2 + 1, i * 2 + 2), 16);
            result[i] = (byte) (first * 16 + second);
        }
        return result;
    }
}

仅为自己学习使用,如有侵权请联系作者删除 qq:2352312262

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值