溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

使用Java怎么實現(xiàn)一個AES 算法

發(fā)布時間:2021-04-14 17:49:12 來源:億速云 閱讀:178 作者:Leah 欄目:編程語言

這篇文章給大家介紹使用Java怎么實現(xiàn)一個AES 算法,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

AES(Advanced Encryption Standard)高級加密標(biāo)準(zhǔn),在密碼學(xué)中又稱 Rijndael 加密法,是美國聯(lián)邦政府采用的一種區(qū)塊加密標(biāo)準(zhǔn) 。 這個標(biāo)準(zhǔn)用來替代原先的 DES ,已經(jīng)被多方分析且廣為全世界所使用 。 現(xiàn)已成為對稱密鑰加密中最流行的算法之一 。

/**
 * AES 算法
 * <p/>
 * 算法采用加密模式:CBC;數(shù)據(jù)塊:128;填充:PKCS5Padding
 * <p/>
 * key 與向量字符串的長度為 16 位
 *
 * @author Deniro Li (lisq037@163.com)
 *     2018/3/17
 */
public class AES {
  /**
   * 算法名稱
   */
  public static final String NAME = "AES";
  /**
   * 加密模式:CBC;數(shù)據(jù)塊:128;填充:PKCS5Padding
   */
  public final String MODE = "AES/CBC/PKCS5Padding";
  /**
   * KEY 與 向量字符串的長度
   */
  public static final int LENGTH = 16;
  /**
   * 加密用的 KEY
   */
  private String key;
  /**
   * 向量,用于增加加密強(qiáng)度
   */
  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=="));
  }
}

關(guān)于使用Java怎么實現(xiàn)一個AES 算法就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI