1. 程式人生 > >java AES 128 位加密解密演算法

java AES 128 位加密解密演算法

最近在做app後臺的伺服器,使用到AES加密解密演算法,無奈網上的都不符合要求,於是自己借鑑著寫了一個AES加密解密工具。

金鑰長度問題

預設 Java 中僅支援 128 位金鑰,當使用 256 位金鑰的時候,會報告金鑰長度錯誤
Invalid AES key length

下載之後,解壓後,可以看到其中包含兩個包:

local_policy.jar

US_export_policy.jar

看一下你的 JRE 環境,將 JRE 環境中 lib\lib\security 中的同名包替換掉。

廢話不多說,上程式碼

import java.io.UnsupportedEncodingException;
import
java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; import org.apache.commons.codec.binary.Base64; /** * 演算法工具 * @author Babylon [email protected]
* @date 2014-8-15 上午8:41:49 */
public class AlgorithmUtil { public final static String ENCODING = "UTF-8"; /**將二進位制轉換成16進位制 * @param buf * @return */ public static String parseByte2HexStr(byte buf[]) { StringBuffer sb = new StringBuffer(); for
(int i = 0; i < buf.length; i++) { String hex = Integer.toHexString(buf[i] & 0xFF); if (hex.length() == 1) { hex = '0' + hex; } sb.append(hex.toUpperCase()); } return sb.toString(); } /**將16進位制轉換為二進位制 * @param hexStr * @return */ public static byte[] parseHexStr2Byte(String hexStr) { if (hexStr.length() < 1) return null; byte[] result = new byte[hexStr.length()/2]; for (int i = 0;i< hexStr.length()/2; i++) { int high = Integer.parseInt(hexStr.substring(i*2, i*2+1), 16); int low = Integer.parseInt(hexStr.substring(i*2+1, i*2+2), 16); result[i] = (byte) (high * 16 + low); } return result; } /** * 生成金鑰 * 自動生成base64 編碼後的AES128位金鑰 * @throws NoSuchAlgorithmException * @throws UnsupportedEncodingException */ public static String getAESKey() throws Exception { KeyGenerator kg = KeyGenerator.getInstance("AES"); kg.init(128);//要生成多少位,只需要修改這裡即可128, 192或256 SecretKey sk = kg.generateKey(); byte[] b = sk.getEncoded(); return parseByte2HexStr(b); } /** * AES 加密 * @param base64Key base64編碼後的 AES key * @param text 待加密的字串 * @return 加密後的byte[] 陣列 * @throws Exception */ public static byte[] getAESEncode(String base64Key, String text) throws Exception{ byte[] key = parseHexStr2Byte(base64Key); SecretKeySpec sKeySpec = new SecretKeySpec(key, "AES"); Cipher cipher = Cipher.getInstance("AES"); cipher.init(Cipher.ENCRYPT_MODE, sKeySpec); byte[] bjiamihou = cipher.doFinal(text.getBytes(ENCODING)); return bjiamihou; } /** * AES解密 * @param base64Key base64編碼後的 AES key * @param text 待解密的字串 * @return 解密後的byte[] 陣列 * @throws Exception */ public static byte[] getAESDecode(String base64Key, byte[] text) throws Exception{ byte[] key = parseHexStr2Byte(base64Key); SecretKeySpec sKeySpec = new SecretKeySpec(key, "AES"); Cipher cipher = Cipher.getInstance("AES"); cipher.init(Cipher.DECRYPT_MODE, sKeySpec); byte[] bjiemihou = cipher.doFinal(text); return bjiemihou; } }

測試


import com.util.AlgorithmUtil;

/**
 * 演算法測試
 * 
 * @author babylon
 * 2016年5月16日
 */
public class AlgorithmTest {

    public static void main(String[] args) {
        try {
            String hexKey = new AlgorithmUtil().getAESKey();
            System.out.println("16進位制祕鑰:"+hexKey);
            byte[] encoded = AlgorithmUtil.getAESEncode(hexKey, "我要把你嘿嘿嘿");
            // 注意,這裡的encoded是不能強轉成string型別字串的
            byte[] decoded = AlgorithmUtil.getAESDecode(hexKey, encoded);
            System.out.println(new String(decoded, "UTF-8"));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

相關推薦

java AES 128 加密解密演算法

最近在做app後臺的伺服器,使用到AES加密解密演算法,無奈網上的都不符合要求,於是自己借鑑著寫了一個AES加密解密工具。 金鑰長度問題 預設 Java 中僅支援 128 位金鑰,當使用 256 位金鑰的時候,會報告金鑰長度錯誤 Invalid AES

php AES cbc模式 pkcs7 128加密解密

PHP AES CBC模式PKCS7 128位加密 加密: $key = '1234567812345678'; $iv = '1234567890123456';

微信AES-128-CBC加密解密

brush sha 解密 method pre tcl int cipher ++ [TestClass] public class UnitTest1 { [TestMethod] public void TestMeth

python AES-16加密解密功能實現

從網上搜了很多這種python AES相關內容,但是大部分都是需要自己除錯修改半天才能使用,有的甚至埋下很多坑,費時費力,我這邊根據專案需求,也需要弄一套AES-16位加密和解密API 我用的python加密元件是Crypto,很好用,可以從網上下載最新的庫,我用的比較穩

PHP和Java AES 128 ECB 加解密(PKCS5Padding)

php 和 java 使用 AES128/ECB/PKCS5Padding對稱加解密,簽名使用 HmacSHA256,附帶 php 和 java 程式碼,均為 DEMO 版本,測試通過,實際使用請根據自己專案修改。 最近做專案涉及到一丟丟的安全問題,需

java使用AES加密解密 AES-128-ECB加密

http://www.cnblogs.com/chen-lhx/p/5817161.html *************************************************** import javax.crypto.Cipher; import jav

java.. C# 使用AES加密互解 采用AES-128-ECB加密模式

convert odi summary for number als name apache base java需要下載外部包, commons codec.jar 1.6 較新的JAVA版本把Base64的方法改成靜態方法,可能會寫成Base64.encodeToStr

golang常用加密解密演算法總結(AES、DES、RSA、Sha1MD5)

在專案開發過程中,當操作一些使用者的隱私資訊,諸如密碼、帳戶金鑰等資料時,往往需要加密後可以在網上傳輸。這時,需要一些高效地、簡單易用的加密演算法加密資料,然後把加密後的資料存入資料庫或進行其他操作;當需要讀取資料時,把加密後的資料取出來,再通過演算法解密。 關於加密解密 當前我們專案中常用

java實現AES的簡單加密解密

AESUtil package com.zhuyun.aes; import java.io.IOException; import javax.crypto.Cipher; import ja

Java實現DES加密解密演算法

import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFact

Java使用Hutool實現AES、DES加密解密

介紹 AES和DES同屬對稱加密演算法,資料發信方將明文(原始資料)和加密金鑰一起經過特殊加密演算法處理後,使其變成複雜的加密密文傳送出去。收信方收到密文後,若想解讀原文,則需要使用加密用過的金鑰及相同演算法的逆演算法對密文進行解密,才能使其恢復成可讀明文。在

nodejs中aes-128-cbc加密解密

和java程式進行互動的時候,java那邊使用AES 128位填充模式:AES/CBC/PKCS5Padding加密方法,在nodejs中採用對應的aes-128-cbc加密方法就能對應上,因為有使用向量(iv),所以nodejs中要用createCiphe

java 常用加密解密演算法彙總(一)

http://blog.csdn.net/chenbing81/article/details/51914151 http://www.cnblogs.com/crazylqy/p/4816587.html

C#/JAVA/PHP 互通DES加解密演算法(ECB模式支援8)

import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingE

JAVA AES文件加解密

輸出 byte stat spa urn code for cat substring AES加解密算法,代碼如下: /** * Created by hua on 2017/6/30. */ import javax.crypto.Cipher; import j

java文本文件加密解密

file you location ble jbutton getpath ini cati absolute 原文:http://www.open-open.com/code/view/1420031154765 import java.awt.*; impor

C# Java間進行RSA加密解密交互

exc add 交互 長度限制 orm keys 什麽 highlight arr 引用:http://blog.csdn.net/dslinmy/article/details/37362661 這裏,講一下RSA算法加解密在C#和Java之間交互的問題,這兩天糾結了很久

SM4加密算法實現Java和C#相互加密解密

.net ++ println ffffff 預處理 AS 思路 load prop SM4加密算法實現Java和C#相互加密解密 近期由於項目需要使用SM4對數據進行加密,然後傳給Java後臺,Java後臺使用的也是SM4的加密算法但是就是解密不正確,經過一步步調

DES64加密解密

aps object ret click tle 需要 crypt 加密 AS 需要引入System.Security.Cryptography命名空間 private static byte[] DESKey = new byte[] { 11, 23, 93, 10

golang實現aes-cbc-256加密解密過程記錄

generic 返回 hint pie follow strong pri hms 加密解密 我為什麽吃撐了要實現go的aes-cbc-256加密解密功能? 之前的項目是用php實現的,現在準備用go重構,需要用到這個功能,這麽常用的功能上網一搜一大把現成例子,於是基於g