java如何使用AES加密详解编程语言

java如何使用AES加密详解编程语言

AES加密过程是在一个4×4的字节矩阵上运作,这个矩阵又称为“状态(state)”,其初值就是一个明文区块(矩阵中一个元素大小就是明文区块中的一个Byte)。(Rijndael加密法因支持更大的区块,其矩阵行数可视情况增加)加密时,各轮AES加密循环(除最后一轮外)均包含4个步骤:
AddRoundKey — 矩阵中的每一个字节都与该次轮秘钥(round key)做XOR运算;每个子密钥由密钥生成方案产生。
SubBytes — 通过个非线性的替换函数,用查找表的方式把每个字节替换成对应的字节。
ShiftRows — 将矩阵中的每个横列进行循环式移位。
MixColumns — 为了充分混合矩阵中各个直行的操作。这个步骤使用线性转换来混合每列的四个字节。

程序代码:

import java.security.InvalidAlgorithmParameterException;

import java.security.InvalidKeyException;

import java.security.NoSuchAlgorithmException;

import java.security.SecureRandom;

import java.security.spec.AlgorithmParameterSpec;

import javax.crypto.BadPaddingException;

import javax.crypto.Cipher;

import javax.crypto.IllegalBlockSizeException;

import javax.crypto.KeyGenerator;

import javax.crypto.NoSuchPaddingException;

import javax.crypto.SecretKey;

import javax.crypto.spec.IvParameterSpec;

/**

 * 通过AES算法对文本进行加密解密

 */

public class AESTest {

    private static byte[] keyValue = new byte[] {        //用户密钥

        22,25,-35,-45,25,98,-55,-45,10,35,-45,25,

        26,-95,25,-65,-78,-99,85,45,-62,10,-0,11,

        -35,48,-98,65,-32,14,-78,25,36,-56,-45,-45,

        12,15,-35,-75,15,-14,62,-25,33,-45,55,68,-88

    };

    private static byte[] iv = new byte[] {                //算法参数

        -12,35,-25,65,45,-87,95,-22,-15,45,55,-66,32,5-4,84,55

    };

    private static SecretKey key;                        //加密密钥

    private static AlgorithmParameterSpec paramSpec;    //算法参数

    private static Cipher ecipher;                        //加密算法

    

    static{        

        KeyGenerator kgen;

        try {

            //为指定算法生成一个密钥生成器对象。

            kgen = KeyGenerator.getInstance(“AES”);

            //使用用户提供的随机源初始化此密钥生成器,使其具有确定的密钥长度。

            kgen.init(128, new SecureRandom(keyValue));

            //使用KeyGenerator生成(对称)密钥。

            key = kgen.generateKey();

            //使用iv中的字节作为IV来构造一个 算法参数。

            paramSpec = new IvParameterSpec(iv);

            //生成一个实现指定转换的 Cipher 对象

            ecipher = Cipher.getInstance(“AES/CBC/PKCS5Padding”);        

        } catch (NoSuchAlgorithmException e) {

            e.printStackTrace();

        } catch (NoSuchPaddingException e) {

            e.printStackTrace();

        }

    }

    /**

     * 加密,使用指定数据源生成密钥,使用用户数据作为算法参数进行AES加密

     * @param msg 加密的数据

     * @return

     */

    public static String encrypt(String msg) {

        String str = “”;

        try {            

            //用密钥和一组算法参数初始化此 cipher

            ecipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);

            //加密并转换成16进制字符串

            str = asHex(ecipher.doFinal(msg.getBytes()));

        } catch (BadPaddingException e) {

            e.printStackTrace();

        } catch (InvalidKeyException e) {

            e.printStackTrace();

        } catch (InvalidAlgorithmParameterException e) {

            e.printStackTrace();

        } catch (IllegalBlockSizeException e) {

            e.printStackTrace();

        }

        return str;

    }

    

    /**

     * 解密,对生成的16进制的字符串进行解密

     * @param value 解密的数据

     * @return

     */

    public static String decrypt(String value) {

        try {

            ecipher.init(Cipher.DECRYPT_MODE, key, paramSpec);

            return new String(ecipher.doFinal(asBin(value)));

        } catch (BadPaddingException e) {

            e.printStackTrace();

        } catch (InvalidKeyException e) {

            e.printStackTrace();

        } catch (InvalidAlgorithmParameterException e) {

            e.printStackTrace();

        } catch (IllegalBlockSizeException e) {

            e.printStackTrace();

        }

        return “”;

    }

    /**

     * 将字节数组转换成16进制字符串

     * @param buf

     * @return

     */

    private static String asHex(byte buf[]) {

        StringBuffer strbuf = new StringBuffer(buf.length * 2);

        int i;

        for (i = 0; i < buf.length; i++) {

            if (((int) buf[i] & 0xff) < 0x10)//小于十前面补零

                strbuf.append(“0”);

            strbuf.append(Long.toString((int) buf[i] & 0xff, 16));

        }

        return strbuf.toString();

    }

    /**

     * 将16进制字符串转换成字节数组

     * @param src

     * @return

     */

    private static byte[] asBin(String src) {

        if (src.length() < 1)

            return null;

        byte[] encrypted = new byte[src.length() / 2];

        for (int i = 0; i < src.length() / 2; i++) {

            int high = Integer.parseInt(src.substring(i * 2, i * 2 + 1), 16);//取高位字节

            int low = Integer.parseInt(src.substring(i * 2 + 1, i * 2 + 2), 16);//取低位字节

            encrypted[i] = (byte) (high * 16 + low);

        }

        return encrypted;

    }

}

java如何使用AES加密详解编程语言

转载请注明来源网站:blog.ytso.com谢谢!

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/14765.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论