java封装AES加密算法

在实际coding中会经常遇到往数据库存入密码时加密,URL传参时的加密,由此简单封装了下java中的AES加密算法。

0、import类

import java.security.SecureRandom;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

import org.apache.axis.encoding.Base64; //非必须

1、加密接口

    /**
     * 加密
     * @param content 待加密内容
     * @param password  加密密钥
     * @return
     */
    public static byte[] encrypt(String content, String password) {
        try {
            KeyGenerator kgen = KeyGenerator.getInstance("AES");
            kgen.init(128, new SecureRandom(password.getBytes()));
            SecretKey secretKey = kgen.generateKey();
            byte[] enCodeFormat = secretKey.getEncoded();
            SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
            Cipher cipher = Cipher.getInstance("AES");
            byte[] byteContent = content.getBytes("utf-8");
            cipher.init(Cipher.ENCRYPT_MODE, key);
            byte[] result = cipher.doFinal(byteContent);
            return result;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

2、解密接口

    /**解密
     * @param content  待解密内容
     * @param password 解密密钥
     * @return
     */
    public static byte[] decrypt(byte[] content, String password) {
        try {
            KeyGenerator kgen = KeyGenerator.getInstance("AES");
            kgen.init(128, new SecureRandom(password.getBytes()));
            SecretKey secretKey = kgen.generateKey();
            byte[] enCodeFormat = secretKey.getEncoded();
            SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
            Cipher cipher = Cipher.getInstance("AES");
            cipher.init(Cipher.DECRYPT_MODE, key);
            byte[] result = cipher.doFinal(content);
            return result;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

3、编解码函数(非必须)

    //编码函数
    public static String encode(String content, String key) throws Exception {
        byte[] encrypt = encrypt(content, key);
        return Base64.encode(encrypt);
    }
    //解码函数
    public static String decode(String encode, String key) throws Exception {
        byte[] encrypt = Base64.decode(encode);
        byte[] content = decrypt(encrypt, key);
        return new String(content);
    }

4、测试

    //0-正常使用
    public static void main(String[] args) throws Exception{
        String content = "holybin";
        String password = "12345678";

        System.out.println("加密前1:" + content);
        byte[] encryptResult1 = encrypt(content, password); //普通加密
        byte[] decryptResult1 = decrypt(encryptResult1,password);   //普通解密
        System.out.println("解密后1:" + new String(decryptResult1));

        System.out.println("\n加密前2:" + content);
        String encryptResult2 = encode(content, password);  //先编码再加密
        System.out.println("加密后2:" + encryptResult2);
        String decryptResult2 = decode(encryptResult2, password);   //先解码再解密
        System.out.println("解密后2:" + decryptResult2);
    }

结果如下:

5、问题与思考

(1)普通加密后将得到的byte数组直接转化为字符串用于输出,或者普通解密时从字符串转换为byte数组用于传参会发生什么?

    //1-先测试加密
    public static void main(String[] args) throws Exception{
        String content = "holybin";
        String password = "12345678";

        System.out.println("加密前1:" + content);
        byte[] encryptResult1 = encrypt(content, password); //普通加密
        System.out.println("加密后1:" + encryptResult1);
        System.out.println("加密后1:" + new String(encryptResult1));
        byte[] decryptResult1 = decrypt(encryptResult1,password);   //普通解密
        System.out.println("解密后1:" + new String(decryptResult1));
    }

结果1:

这里将加密后的byte数组直接转化成String输出,出现乱码。

    //2-再测试解密
    public static void main(String[] args) throws Exception{
        String content = "holybin";
        String password = "12345678";

        System.out.println("加密前1:" + content);
        byte[] encryptResult1 = encrypt(content, password); //普通加密
        String strEncryptResult1 = new String(encryptResult1,"UTF-8");
        //System.out.println("加密后1:" + strEncryptResult1);
        byte[] decryptResult1 = decrypt(strEncryptResult1.getBytes("UTF-8"),password);  //普通解密
        System.out.println("解密后1:" + new String(decryptResult1));
    }

结果2:

这里从加密后的String提取bytes数组用于解密,出现报错

原因:主要是因为加密后的byte数组是不能强制转换成字符串的,加密过的字符串也不能直接提取bytes数组用于解密,解决方法有两个:一是像上面测试的例子一样先加密再编码,或先解码再解密(参考:4、测试);二是采用十六进制和二进制的相互转化函数(参考:下面的第(2)点)。

(2)十六进制和二进制相互转化函数

    // 二进制转十六进制
    public static String parseByte2HexStr(byte buf[]) {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < buf.length; i++) {
            String hex = Integer.toHexString(buf[i] & 0xFF);
            if (hex.length() == 1) {
                hex = ‘0‘ + hex;
            }
            sb.append(hex.toUpperCase());
        }
        return sb.toString();
    }

    // 十六进制转二进制
    public static byte[] parseHexStr2Byte(String hexStr) {
        if (hexStr.length() < 1)
            return null;
        byte[] result = new byte[hexStr.length() / 2];
        for (int i = 0; i < hexStr.length() / 2; i++) {
            int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);
            int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2),
                    16);
            result[i] = (byte) (high * 16 + low);
        }
        return result;
    }

使用示例:

    // 3-测试转化函数
    public static void main(String[] args) throws Exception {
        String content = "holybin";
        String password = "12345678";
        //加密
        System.out.println("加密前1:" + content);
        byte[] encryptResult = encrypt(content, password);  // 普通加密
        String strEncryptResult = parseByte2HexStr(encryptResult);
        System.out.println("加密后1:" + strEncryptResult);
        //解密
        byte[] byteDecryptResult = parseHexStr2Byte(strEncryptResult);
        byte[] decryptResult = decrypt(byteDecryptResult, password);    // 普通解密
        System.out.println("解密后1:" + new String(decryptResult));
    }

结果:

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-25 11:05:30

java封装AES加密算法的相关文章

PHP android ios相互兼容的AES加密算法

APP项目用户密码传输一直没有用HTTPS,考虑到用户的隐私暂时先用AES对密码加密,以后也可以用于手机端与服务端加密交互. PHP的免费版phpAES项目,手机端解码各种不对. 好不容易找了PHP ANDROID IOS,相互加解密正常的AES加密算法代码. PHP的AES加密算法: [codesyntax lang=”php”] <?php class MCrypt { private $hex_iv = '00000000000000000000000000000000'; # conve

【转】PHP android ios相互兼容的AES加密算法

APP项目用户密码传输一直没有用HTTPS,考虑到用户的隐私暂时先用AES对密码加密,以后也可以用于手机端与服务端加密交互. PHP的免费版phpAES项目,手机端解码各种不对. 好不容易找了PHP ANDROID IOS,相互加解密正常的AES加密算法代码. PHP的AES加密算法: <?php class MCrypt { private $hex_iv = '00000000000000000000000000000000'; # converted JAVA byte code in t

Java 加密 AES 对称加密算法

题目链接:https://oj.leetcode.com/problems/set-matrix-zeroes/ Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place. 一个个找肯定会超时,我们可以分别用一个行向量和一个列向量进行维护.这样O(m*n) 能出来 class Solution { public: void setZeroes(vector<vector

AES 加密算法的原理详解

AES 加密算法的原理详解 本教程摘选自 https://blog.csdn.net/qq_28205153/article/details/55798628 的原理部分. AES简介 高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法(微信小程序加密传输就是用这个加密算法的).对称加密算法也就是加密和解密用相同的密钥,具体的加密流程如下图: 下面简单介绍下各个部分的作用与意义: 明文P 没有经过加密的数据. 密钥K 用来加密明文的密码,在对称

Android AES加密算法及事实上现

昨天老大叫我看看android加密算法.于是网上找了找,找到了AES加密算法.(当然还有MD5,BASE64什么的http://snowolf.iteye.com/blog/379860这篇文章列举了非常多,可是基本都是j2se平台的,android平台不一定支持,可是AES算法Android是自带了包的,从官方的http://developer.android.com/reference/javax/crypto/Cipher.html能够看到.) AES加密算法是什么?大家能够自己去goog

iOS,Android,.NET通用AES加密算法

原文:iOS,Android,.NET通用AES加密算法 这两天为移动App开发API,结果实现加密验证时碰到一大坑.这里不得不吐槽下又臭又硬的iOS,Windows Server无法解密出正确的结果,Android则可以,后来使用了通用的AES256加密算法才最终搞定. 搞服务器端小伙伴没有接触过iOS,所以也没料到过这种情形.他使用了AES128 with IV的加密算法,Android端可以顺利通过加密验证. 但是iOS端使用AES128算法后出现问题,虽然可以在本地加密解密,但是无法被服

AES 加密算法 跨语言

aes加密算法 delphi .java.c# .网页在线工具 4个相同 AES/ECB/PKCS5Padding 与网页在线工具加密结果相同 http://tool.chacuo.net/cryptblowfish package tt; import java.io.UnsupportedEncodingException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmExcept

Android AES加密算法,现在实际上

昨天,老板让我来看看android加密算法.于是在网上找了找,发现AES加密算法.(当然,MD5,BASE64什么http://snowolf.iteye.com/blog/379860这篇文章列举了非常多.可是基本都是j2se平台的.android平台不一定支持,可是AES算法Android是自带了包的,从官方的http://developer.android.com/reference/javax/crypto/Cipher.html能够看到. ) AES加密算法是什么?大家能够自己去goo

Android AES加密算法及其实现

找到了AES加密算法.(当然还有MD5,BASE64什么的http://snowolf.iteye.com/blog/379860这篇文章列举了很多,但是基本都是j2se平台的,android平台不一定支持,但是AES算法Android是自带了包的,从官方的http://developer.android.com/reference/javax/crypto/Cipher.html可以看到.) AES加密算法是什么?大家可以自己去google,专家级程序员写好包,工程人员会用就行了. 这个例子其