对称加密------AES

5 篇文章 0 订阅
3 篇文章 0 订阅

概念

AES加密算法即密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。

源码

package cn.silence.encrypt;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.security.SecureRandom;

/**
 * Created by Silence on 2017/12/19.
 */
public class AESCoder {

    /**
     * 定义加密方式为AES
     */
    private final static String KEY_AES = "AES";

    //保存的全局种子
    private static byte[] SEED = null;

    /**
     * 加密数据
     * @param data
     * @param password
     * @return
     * @throws Exception
     */
    public static byte[] encrypt(String data, String password) throws Exception {

        //密钥生成器,参数为算法名称,KeyGenerator包含五种算法:AES (128)、DES (56)、DESede (168)、HmacSHA1和HmacSHA256
        KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_AES);

        //根据SHA1PRNG算法生成伪随机数
        SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");

        //设置随机数生成所使用的种子
        secureRandom.setSeed(password.getBytes());

        //上面是将传入的paasword作为生成密钥的种子,当然也可以像如下这样,生成随机的种子,但是这个种子要跟解密时候的种子一直,
        //因此这里设置了全局变量,当然这么做并不适合分布式部署的场合,因此慎用
//        SEED = secureRandom.generateSeed(8);
//        secureRandom.setSeed(SEED);

        //初始化密钥生成器
        keyGenerator.init(128, secureRandom);

        //生成对称密钥
        SecretKey secretKey = keyGenerator.generateKey();

        //获取对称密钥字节数组
        byte[] encodeFormat = secretKey.getEncoded();

        //根据对称密钥字节数组生成AES密钥
        SecretKeySpec secretKeySpec = new SecretKeySpec(encodeFormat, KEY_AES);

        //对数据加密
        Cipher cipher = Cipher.getInstance(KEY_AES);

        cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);

        return cipher.doFinal(data.getBytes("UTF-8"));

    }

    public static byte[] decrypt(byte[] data, String password) throws Exception {

        //密钥生成器,参数为算法名称,KeyGenerator包含五种算法:AES (128)、DES (56)、DESede (168)、HmacSHA1和HmacSHA256
        KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_AES);

        //根据SHA1PRNG算法生成伪随机数
        SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");

        //设置随机数生成所使用的种子
        secureRandom.setSeed(password.getBytes());

        //同加密时对应的描述
//        secureRandom.setSeed(SEED);

        //初始化密钥生成器
        keyGenerator.init(128, secureRandom);

        //生成对称密钥
        SecretKey secretKey = keyGenerator.generateKey();

        //获取对称密钥字节数组
        byte[] encodeFormat = secretKey.getEncoded();

        //根据对称密钥字节数组生成AES密钥
        SecretKeySpec secretKeySpec = new SecretKeySpec(encodeFormat, KEY_AES);

        //对数据解密
        Cipher cipher = Cipher.getInstance(KEY_AES);

        cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);

        return cipher.doFinal(data);

    }

}

测试

package cn.silence.encrypt;

/**
 * Created by Silence on 2017/12/19.
 */
public class main {

    public static void main(String[] args) throws Exception {

        byte[] result = AESCoder.encrypt("测试", "123");

        System.out.println(new String(result));

        result = AESCoder.decrypt(result, "123");

        System.out.println(new String(result));

    }

}

总结

AES算法基于排列和置换运算。排列是对数据重新进行安排,置换是将一个数据单元替换为另一个。AES 使用几种不同的方法来执行排列和置换运算。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值