欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

对称**密码体系 --- AES

程序员文章站 2024-03-14 14:46:58
...
    /**
     * 方法描述:一重解密
     *
     * @param keySeed 字节数组类型的**种子的字节
     * @param decryptData 字节数组类型的待解密的数据
     * @return 返回解密结果
     */
    public byte[] decrypt(byte[] keySeed,byte[] decryptData){
        return encryptOrDecrypt(Cipher.DECRYPT_MODE, keySeed, decryptData);
    }

    /**
     * 方法描述:一重加密
     *
     * @param keySeed 字节数组类型的**种子的字节
     * @param encryptData 字节数组类型的待加密的数据
     * @return 返回加密结果
     */
    public byte[] encrypt(byte[] keySeed,byte[] encryptData){
        return encryptOrDecrypt(Cipher.ENCRYPT_MODE, keySeed, encryptData);
    }


    /**
     * 方法描述:AES加密和解密的核心工具
     *
     * @param keySeed 字节数组类型的**种子的字节
     * @param encryptData 字节数组类型的待加密或解密的数据
     * @param encryptOrDecrypt 有两个可选值 Cipher.ENCRYPT_MODE(加密)
     *                         和 Cipher.DECRYPT_MODE(解密)
     * @return 返回AES加密或解密结果
     */
    private byte[] encryptOrDecrypt(int encryptOrDecrypt, byte[] keySeed,
                                    byte[] encryptData){
        if (keySeed != null && encryptData != null &&
                (encryptOrDecrypt == Cipher.ENCRYPT_MODE ||
                        encryptOrDecrypt == Cipher.DECRYPT_MODE )){
            SecretKeySpec secretKeySpec = generateKey(keySeed);
            if (secretKeySpec != null){
                try {
                    // 根据参数创建对应算法的 加密解密工具对象
                    Cipher cipher = Cipher.getInstance("AES");
                    // 初始化加密解密工具
                    // 参数一决定了工具是加密还是解密
                    cipher.init(encryptOrDecrypt,secretKeySpec);
                    // 开始加密或解密
                    return cipher.doFinal(encryptData);
                } catch (NoSuchAlgorithmException e) {
                    e.printStackTrace(); // 加密解密工具对象 创建失败
                } catch (NoSuchPaddingException e) {
                    e.printStackTrace(); // 加密解密工具对象 创建失败
                } catch (InvalidKeyException e) {
                    e.printStackTrace(); // 加密解密工具对象 初始化失败
                } catch (BadPaddingException e) {
                    e.printStackTrace(); // 加密解密工具运行失败
                } catch (IllegalBlockSizeException e) {
                    e.printStackTrace(); // 加密解密工具运行失败
                }
            }
        }
        return null;
    }


    /**
     * 方法描述:根据**种子生成对应的**
     *
     * @param keySeed 字节数组类型的**种子的字节
     * @return 用于AES加密解密的**对象
     */
    private SecretKeySpec generateKey(byte[] keySeed){
        if (keySeed !=null) {
            try {
                // 创建 **生成器
                KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");

                // 创建 **种子的随机数对象
                SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
                secureRandom.setSeed(keySeed);

                // 利用 **种子的随机数对象 初始化出一个可以生成128位**的**生成器
                keyGenerator.init(128, secureRandom);

                // 生成**
                SecretKey secretKey = keyGenerator.generateKey();

                // 将刚生成的**转为AES专用的**
                return new SecretKeySpec(secretKey.getEncoded(), "AES");

            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace(); // **生成器 创建失败
            }
        }
        return null;
    }

相关标签: AES