Java原生方法实现 AES 算法示例

本文实例讲述了Java原生方法实现 AES 算法。分享给大家供大家参考,具体如下:

AES(Advanced Encryption Standard)高级加密标准,在密码学中又称 Rijndael 加密法,是美国联邦政府采用的一种区块加密标准 。 这个标准用来替代原先的 DES ,已经被多方分析且广为全世界所使用 。 现已成为对称密钥加密中最流行的算法之一 。

/**
 * AES 算法
 * <p/>
 * 算法采用加密模式:CBC;数据块:128;填充:PKCS5Padding
 * <p/>
 * key 与向量字符串的长度为 16 位
 *
 * @author Deniro Li (lisq037@163.com)
 *     2018/3/17
 */
public class AES {
  /**
   * 算法名称
   */
  public static final String NAME = "AES";
  /**
   * 加密模式:CBC;数据块:128;填充:PKCS5Padding
   */
  public final String MODE = "AES/CBC/PKCS5Padding";
  /**
   * KEY 与 向量字符串的长度
   */
  public static final int LENGTH = 16;
  /**
   * 加密用的 KEY
   */
  private String key;
  /**
   * 向量,用于增加加密强度
   */
  private String ivParameter;
  /**
   * @param key     加密用的 KEY
   * @param ivParameter 偏移量
   */
  public AES(String key, String ivParameter) {
    if (key == null || key.length() != LENGTH) {
      throw new AESException("KEY 不存在,或者长度不为 " + LENGTH);
    }
    if (ivParameter == null || ivParameter.length() != LENGTH) {
      throw new AESException("ivParameter 不存在,或者长度不为 " + LENGTH);
    }
    this.key = key;
    this.ivParameter = ivParameter;
  }
  /**
   * 加密
   *
   * @param s 要加密的字符串
   * @return 加密后的字符串
   */
  public String encode(String s) {
    String result;
    try {
      Cipher cipher = Cipher.getInstance(MODE);
      IvParameterSpec iv = new IvParameterSpec(ivParameter.getBytes());
      cipher.init(ENCRYPT_MODE, new SecretKeySpec(key.getBytes(), NAME), iv);
      byte[] bytes = cipher.doFinal(s.getBytes(ENCODING));
      result = new BASE64Encoder().encode(bytes);
    } catch (Exception e) {
      throw new AESException("加密", e);
    }
    return result;
  }
  /**
   * 解密
   *
   * @param s 待解密的字符串
   * @return 解密后的字符串
   */
  public String decode(String s) {
    try {
      SecretKeySpec keySpec = new SecretKeySpec(key.getBytes("ASCII"), NAME);
      Cipher cipher = Cipher.getInstance(MODE);
      IvParameterSpec iv = new IvParameterSpec(ivParameter.getBytes());
      cipher.init(Cipher.DECRYPT_MODE, keySpec, iv);
      return new String(cipher.doFinal(new BASE64Decoder().decodeBuffer(s)), ENCODING);
    } catch (Exception e) {
      throw new AESException("解密", e);
    }
  }
}

单元测试:

public class AESTest {
  AES aes;
  @Before
  public void init(){
    aes=new AES("12345abcdef67890","1234567890abcdef");
  }
  @Test
  public void testEncode() throws Exception {
    Assert.assertEquals("jANei3LBvnLCaZ2XddWHZw==", aes.encode("123456"));
  }
  @Test
  public void testDecode() throws Exception {
    Assert.assertEquals("123456", aes.decode("jANei3LBvnLCaZ2XddWHZw=="));
  }
}

PS:关于加密解密感兴趣的朋友还可以参考本站在线工具:

文字在线加密解密工具(包含AES、DES、RC4等):
http://tools.jb51.net/password/txt_encode

MD5在线加密工具:
http://tools.jb51.net/password/CreateMD5Password

在线散列/哈希算法加密工具:
http://tools.jb51.net/password/hash_encrypt

在线MD5/hash/SHA-1/SHA-2/SHA-256/SHA-512/SHA-3/RIPEMD-160加密工具:
http://tools.jb51.net/password/hash_md5_sha

在线sha1/sha224/sha256/sha384/sha512加密工具:
http://tools.jb51.net/password/sha_encode

更多关于java相关内容感兴趣的读者可查看本站专题:《Java数学运算技巧总结》、《Java数据结构与算法教程》、《Java字符与字符串操作技巧总结》、《Java操作DOM节点技巧总结》和《Java缓存操作技巧汇总》

希望本文所述对大家java程序设计有所帮助。

(0)

相关推荐

  • Java实现的AES256加密解密功能示例

    本文实例讲述了Java实现的AES256加密解密功能.分享给大家供大家参考,具体如下: 一.代码 package com.handler; import java.io.UnsupportedEncodingException; import java.security.Key; import java.security.Security; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.cry

  • JAVA实现caesar凯撒加密算法

    复制代码 代码如下: public class Caesar { public static final String SOURCE = "abcdefghijklmnopqrstuvwxyz"; public static final int LEN = SOURCE.length(); /**  * @param args  */ public static void main(String[] args) {     String result = caesarEncryptio

  • Java AES加密解密的简单实现方法

    废话不多说,直接上代码 package com.mstf.aes; import java.io.UnsupportedEncodingException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import javax.crypto.BadPaddingException; import

  • Java实现的对称加密算法AES定义与用法详解

    本文实例讲述了Java实现的对称加密算法AES定义与用法.分享给大家供大家参考,具体如下: 一 简介 1.AES是目前使用最多的对称加密算法. 2.AES的优势之一是至今尚未被破解. 3.AES通常用于移动通信系统加密以及基于SSH协议(SSH Client.SecrueCRT)的软件. 二 特点 1.高级的 2.DES替代者 三 AES的参数说明 四 代码实现 package com.imooc.security.aes; import java.security.Key; import ja

  • java实现的AES加密算法完整实例

    本文实例讲述了java实现的AES加密算法.分享给大家供大家参考,具体如下: import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import android.util.Base64; /** * @author vipin.cb , vipin.cb@experionglobal.com <br> * Sep 27, 2013

  • java实现的AES秘钥生成算法示例

    本文实例讲述了java实现的AES秘钥生成算法.分享给大家供大家参考,具体如下: import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; public class Test { public static void main(String[] args) { g

  • java基于AES对称加密算法实现的加密与解密功能示例

    本文实例讲述了java基于AES对称加密算法实现的加密与解密功能.分享给大家供大家参考,具体如下: package com.soufun.com; import java.io.UnsupportedEncodingException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import

  • Java使用AES加密和解密的实例详解

    Java使用AES加密和解密的实例详解 前言: AES的基本要求是,采用对称分组密码体制,密钥长度的最少支持为128.192.256,分组长度128位,算法应易于各种硬件和软件实现.1998年NIST开始AES第一轮分析.测试和征集,共产生了15个候选算法.1999年3月完成了第二轮AES2的分析.测试.2000年10月2日美国政府正式宣布选中比利时密码学家Joan Daemen 和 Vincent Rijmen 提出的一种密码算法RIJNDAEL 作为 AES. 在应用方面,尽管DES在安全上

  • Java实现AES加密算法的简单示例分享

    高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用. 大多数AES计算是在一个特别的有限域完成的. AES加密过程是在一个4×4的字节矩阵上运作,这个矩阵又称为"状态(state)",其初值就是一个明文区块(矩阵中一个元素大小就是明文区块中的一个Byte).(Rijndael加密法因支持更大的区块,其矩阵行

  • Java原生方法实现 AES 算法示例

    本文实例讲述了Java原生方法实现 AES 算法.分享给大家供大家参考,具体如下: AES(Advanced Encryption Standard)高级加密标准,在密码学中又称 Rijndael 加密法,是美国联邦政府采用的一种区块加密标准 . 这个标准用来替代原先的 DES ,已经被多方分析且广为全世界所使用 . 现已成为对称密钥加密中最流行的算法之一 . /** * AES 算法 * <p/> * 算法采用加密模式:CBC:数据块:128:填充:PKCS5Padding * <p/

  • java实现的统计字符算法示例

    本文实例讲述了java实现的统计字符算法.分享给大家供大家参考,具体如下: 统计字符: 概述:给定字符串,将它们进行分类,分别的去统计它们的个数及其字符 分类的有:字母 数字 中文 空格 等等 算法思路分析: 分别统计即可: 下面给出代码:(代码仅供参考) package javastudy; public class Testit6 { public static void main(String[] args) { String str = "...天2气 :[1] aA"; //

  • Java实现的快速查找算法示例

    本文实例讲述了Java实现的快速查找算法.分享给大家供大家参考,具体如下: 快速查找算法,可以根据想要找的是第几个大的数,每次循环都能固定下来一个数在数组完整排完序之后的位置,每次循环都能定一个数的位置,如果当前固定的数的位置和用户要找的第几个数匹配,则就直接返回.例如我要找第二大的数,如果循环一次固定的数的下标是1,那就是当前需要找的数. 代码如下: // 快速查找算法 public static int quickSelect(int[] arr, int selectIndex) { in

  • Java简单实现约瑟夫环算法示例

    本文实例讲述了Java简单实现约瑟夫环算法.分享给大家供大家参考,具体如下: 1.算法背景: 罗马人攻占了乔塔帕特,41人藏在一个山洞中躲过了这场浩劫.这41个人中,包括历史学家josephus和他的一个朋友.剩余的39个人为了表示不向罗马人屈服,决定集体自杀.大家决定了一个自杀方案,所有这41人围城一个圆圈,由第一个人开始顺时针报数,没报数为3的人就立刻自杀,然后由下一个人重新开始报数 仍然是每报数为3的人就立刻自杀,......,知道所有人都自杀死亡为止. 约瑟夫和他的朋友并不想自杀,于是约

  • Java实现的求逆矩阵算法示例

    本文实例讲述了Java实现的求逆矩阵算法.分享给大家供大家参考,具体如下: package demo; public class MatrixInverse { public static double Det(double [][]Matrix,int N)//计算n阶行列式(N=n-1) { int T0; int T1; int T2; double Num; int Cha; double [][] B; if(N>0) { Cha=0; B=new double[N][N]; Num=

  • Java实现的傅里叶变化算法示例

    本文实例讲述了Java实现的傅里叶变化算法.分享给大家供大家参考,具体如下: 用JAVA实现傅里叶变化 结果为复数形式 a+bi 废话不多说,实现代码如下,共两个class FFT.class 傅里叶变化功能实现代码 package fft.test; /************************************************************************* * Compilation: javac FFT.java Execution: java FF

  • java中方法递归的简单示例

    一.递归的思路 一个方法在执行时,调用自身被称为"递归". 递归相当于数学归纳法,有一个起始条件,有一个递推公式. 递归可以分为:单路递归和多路递归(如二叉树和斐波那契数列). 二.代码举例 1.n的阶乘 //n的阶乘 public static int fac(int num){ if(num == 1){ return 1; } return num * fac(num-1); } public static void main(String[] args) { int n = 5

  • Java实现双色球抽奖随机算法示例

    第一次写技术博客,写一下以前写的一个双色球抽奖随机算法. 原理如下: 1首先初始化一个待抽奖的数组nums,数组的长度k 2. 随机一个1-k之间的随机数,得到nums[k],这样得到第一个抽奖号,nums中剔除该号码,k--. 3. 重复步骤2,直到得到全部中奖号码 class myLuck { private int mTarget; List<Integer> mNums = new ArrayList<Integer>(); //摇奖池 ///从多少个数中产生多少个数 //

  • Java实现求子数组和的最大值算法示例

    本文实例讲述了Java实现求子数组和的最大值算法.分享给大家供大家参考,具体如下: 一般C和C++在算法实现中使用较多,下面我们通过java语言实现算法,更有亲切感. 题目: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值. 例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2, 因此输出为该子数组的和18. 实现代码: package arrDe

  • JAVA多种方法实现字符串反转

    本人自己思考+网络搜罗,分类整理了以下4类9种方法: A类:使用JAVA原生方法 -A1:使用StringBuffer的reverse方法 -A2:使用StringBuilder的reverse方法 B类:遍历字符串(字符数组)实现 -B1:将字符串转变为字符数组,遍历该数组的一半,依次将头尾开始对应的字符交换 -B2:逆向遍历s,正序拼接出一个新的字符串 -B3:正向遍历s,将取出的字符拼接形成中间字符串,将中间字符串拼接在下一个字符的后面 -B4:从首位两边同时遍历,交换首位下标位置的字符(

随机推荐