Java AES 加密 利用 Java 内置对象类完成字符串的 AES 加密

高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。


题外话:长矛和盾牌的斗争永远存在,近年已经有研究表明 AES 并非牢不可破,虽然 AES 城墙未跨,但已经被开了个孔,但未必代表 AES 不安全,因为要想真正攻破 AES 还是相当复杂的,也就是,就目前而言 AES 仍然安全。


以下加密代码基于 Java 内置的加密对象完成 AES 加密,使用静态Key,也可以很轻松的将 Key 改为动态输入,代码使用很简单:


/*
 * AES 加密
 * 传入原文字符串,获得密文
 * 传入密文,解密并得到原文。
 * key 静态,稍作调整,可以将 key 作为参数实时加密
 *  
 */
package cn.sharcom.library;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;

public class EncryptTools
{
  // 128 bit key
  private String key = "TE53DAH32R9VMHEP";
  // 16 bytes vector
  private String initVector = "ZEM84JFYEJDHMKG0";

  /**
   * 对原文加密
   * 
   * @param key
   * @param initVector
   * @param strSource
   * @return
   */
  private String encrypt(String key, String initVector, String strSource)
  {
    String strResult = null;
    try
    {
      IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"));
      SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");

      Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
      cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);

      byte[] encrypted = cipher.doFinal(strSource.getBytes());
      strResult = Base64.encodeBase64String(encrypted);
    }
    catch (Exception e)
    {
      e.printStackTrace();
      strResult = null;
    }

    return strResult;
  }

  /**
   * 对密文解密
   * 
   * @param key
   * @param initVector
   * @param encrypted
   * @return
   */
  private String decrypt(String key, String initVector, String encrypted)
  {
    try
    {
      IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"));
      SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");

      Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
      cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);

      byte[] original = cipher.doFinal(Base64.decodeBase64(encrypted));

      return new String(original);
    }
    catch (Exception ex)
    {
      ex.printStackTrace();
    }

    return null;
  }

  /**
   * AES 加密<br>
   * 传入需要加密的原文
   * 
   * @param strSource
   * @return
   */
  public String encrypt(String strText)
  {
    return encrypt(key, initVector, strText);
  }

  /**
   * AES 解密<br>
   * 输入密文
   * 
   * @param strCiphertext
   * @return
   */
  public String decrypt(String strCiphertext)
  {
    return decrypt(key, initVector, strCiphertext);
  }
}


测试代码:

  @Test
  public void testEncrypt()
  {
    // fail("Not yet implemented");

    // 创建加密对象
    EncryptTools encrypt = new EncryptTools();

    // 设置需要加密的原文
    String str = "Hello World";
    System.out.println(str);

    // 加密并输出密文
    String strEncrypt = encrypt.encrypt(str);
    System.out.println();

    // 解密密文并输出原文
    String strMessage = encrypt.decrypt(strEncrypt);
    System.out.println(strMessage);

  }


输出结果,而你看到的密文和这里的不一样,这是因为我们使用的 Key 并不相同的原因。

Hello World
fHo50bJylE1jnFb8+I7xKg==
Hello World


Q群讨论 236201801

.



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值