AES 对称加解密

1.生成AES Key

  /**
     *  AES根据密码生成Key
     * @param password
     * @return
     */
    public static Key createKey(String password) {
        // 构造密码生成器,指定为AES算法
        try {
            KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
            // 生成128位的随机源
            keyGenerator.init(128, new SecureRandom(password.getBytes()));
            // 产生原始对称秘钥
            SecretKey secretKey = keyGenerator.generateKey();
            // 获得原始对称秘钥的字节数组
            byte[] encodedBytes = secretKey.getEncoded();
            // Key转换,根据字节数组生成AES秘钥
            return new SecretKeySpec(encodedBytes, "AES");
        } catch (Exception e) {
            LOG.error("generate key fail");
        }
        return null;
    }

2.AES加密(ECB模式)

    /**
     *  AES加密操作,使用ECB模式
     * @param contents
     * @param password
     * @return
     */
    public static String encryptAES(String contents, String password) throws Exception {
        // 创建密码器
        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
        // 初始化为加密密码器
        cipher.init(Cipher.ENCRYPT_MODE, createKey(password));
        // 加密
        byte[] encryptBytes = cipher.doFinal(contents.getBytes("UTF-8"));
        return byte2Hex(encryptBytes);
    }

3.AES解密

    /**
     *  AES解密操作
     * @param encryptCode
     * @param password
     * @return
     */
    public static String decryptAES(String encryptCode, String password) throws Exception {
        // 创建密码器
        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
        // 初始化为解密密码器
        cipher.init(Cipher.DECRYPT_MODE, createKey(password));
        // 解密
        byte[] decryptBytes = cipher.doFinal(hex2Byte(encryptCode));
        return new String(decryptBytes, "UTF-8");
    }

----------------------------------

工具方法

    /**
     *  将byte[]数组转换成16进制字符。一个byte生成两个字符,长度对应1:2
     * @param bytes,输入byte[]数组
     * @return 16进制字符
     */
    public static String byte2Hex(byte[] bytes) {
        if (bytes == null) {
            return null;
        }
        StringBuilder builder = new StringBuilder();
        // 遍历byte[]数组,将每个byte数字转换成16进制字符,再拼接起来成字符串
        for (int i = 0; i < bytes.length; i++) {
            // 每个byte转换成16进制字符时,bytes[i] & 0xff如果高位是0,输出将会去掉,所以+0x100(在更高位加1),再截取后两位字符
            builder.append(Integer.toString((bytes[i] & 0xff) + 0x100, 16).substring(1));
        }
        return builder.toString();
    }

    /**
     *  将16进制字符转换成byte[]数组。与byte2Hex功能相反。
     * @param string 16进制字符串
     * @return byte[]数组
     */
    public static byte[] hex2Byte(String string) {
        if (string == null || string.length() < 1) {
            return null;
        }
        // 因为一个byte生成两个字符,长度对应1:2,所以byte[]数组长度是字符串长度一半
        byte[] bytes = new byte[string.length() / 2];
        // 遍历byte[]数组,遍历次数是字符串长度一半
        for (int i = 0; i < string.length() / 2; i++) {
            // 截取没两个字符的前一个,将其转为int数值
            int high = Integer.parseInt(string.substring(i * 2, i * 2 + 1), 16);
            // 截取没两个字符的后一个,将其转为int数值
            int low = Integer.parseInt(string.substring(i * 2 + 1, i * 2 + 2), 16);
            // 高位字符对应的int值*16+低位的int值,强转成byte数值即可
            // 如dd,高位13*16+低位13=221(强转成byte二进制11011101,对应十进制-35)
            bytes[i] = (byte) (high * 16 + low);
        }
        return bytes;
    }

原文地址:https://www.cnblogs.com/hello4world/p/12215967.html

时间: 2024-10-10 05:16:39

AES 对称加解密的相关文章

php des 对称加解密类

<?php header("Content-Type: text/html;charset=utf-8"); /** * des 对称加解密 */ class des { private $key = ''; private $cipher = MCRYPT_DES; //加解密算法 private $modes = MCRYPT_MODE_ECB; //算法模式 private $iv = ''; //初始化向量 /** * 密钥 */ public function __co

加解密算法一:散列算法、对称加解密

.Net中的加解密操作所涉及的对象都在命名空间System.Security.Cryptography下,所以应先在程序中添加using System.Security.Cryptography. 1.散列算法: 用来产生一些数据片段(例如消息或会话项)的散列值的算法.好的散列算法具有在输入数据中的更改可以更改结果散列值中每个比特的特性:因此,散列对于检测在诸如消息等大型信息对象中的任何变化很有用.此外,好的散列算法使得构造两个独立的有相同散列的输入不能通过计算方法实现. 典型的散列算法包括 M

DES对称加解密、AES RijndaelManaged加解密、Base64加密解密、MD5加密等操作辅助类 EncodeHelper

/// <summary> /// 使用默认加密 /// </summary> /// <param name="strText"></param> /// <returns></returns> public static string DesEncrypt(string strText) /// <summary> /// 使用默认解密 /// </summary> /// <pa

对称加解密算法解析

一.概述 cryptosystem密码学系统分为私钥系统及公钥系统. 私钥系统:指加解密双方事先做了私有信息约定,采用对称密钥算法: 公钥系统:指发送方用公开凭证对数据进行加密后传输,接收方使用私有凭证进行解密,采用非对称密钥算法: 对称加密分类 流加密(stream cipher),加密和解密双方使用相同伪随机加密数据流,一般都是逐位异或或者随机置换数据内容,常见的流加密算法如RC4. 分组加密加密(block cipher),也叫块加密,将明文分成多个等长的模块(block),使用确定的算法

JAVA AES文件加解密

AES加解密算法,代码如下: /** * Created by hua on 2017/6/30. */ import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; public class AESUtil1 { //初始化向量,aes 16位 private static final String IV = "abcdefghijk1m

基于AES对称加密解密的代码块

提供此代码方便自己以后直接查询用,也可以方便其他朋友直接拿来用. 1 import javax.crypto.Cipher; 2 import javax.crypto.spec.IvParameterSpec; 3 import javax.crypto.spec.SecretKeySpec; 4 import sun.misc.BASE64Decoder; 5 import sun.misc.BASE64Encoder; 6 /** 7 * <p>标题: 对称加密解密AES</p&g

AES算法加解密纯C语言实现

文件清单: AES算法实现:aes.c,aes.h AES算法CBC模式加解密封装:aes_util.c,aes_util.h BASE64编解码实现:base64.c,base64.h AES算法测试:aes_util_test.c aes.c: /********************************************************************* * Filename: aes.c * Author: Brad Conte (brad AT bradco

C#调用Crypto++库AES ECB加解密

本文章使用上一篇<C#调用C++类库例子>的项目代码作为Demo.本文中,C#将调用C++的Crypto++库,实现AES和ECB加解密. 一.下载Crypto 1.进入Crypto的官网下载openssl.网址是: https://www.cryptopp.com/. 2.点击“DownLoad”,选择最新的可下载的版本即可.此时我下载的是cryptopp820.zip,如下图所示的. 3.解压 cryptopp820.zip. 4.打开cryptopp820文件夹中的cryptest.sl

java 对称加解密

对称加密 1.特点 加密密钥与解密密钥相同 2.分类 2.1 DES 2.2 3DES 2.3 AES 2.4 PBE 3.各种加密示例 3.1 DES import java.security.Key; import java.security.Security; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import javax.crypto.Sec