AES 128加密解密共同处理类
AES 128加密解密共同处理类
荣耀与梦想 发表于3年前
AES 128加密解密共同处理类
  • 发表于 3年前
  • 阅读 32
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

package jp.hub.agk.core.encrypt;


public class EncryptConst {
 //暗号化方式
    public static final String KEY_ALGORITHM = "AES";
    //CBC初期ベクトル取得値
    public static final String IV = "1a0d2nc4a5ln0s0x";
    //鍵長
    public static final int KEY_SIZE = 128;
    //アルゴリズム値
    public static final String CIPHER_ALGORITHM = "AES/CBC/PKCS5Padding";
    //コード
    public static final String CHAR_SET_UTF8 = "UTF-8";
    //ランダムシード
    public static final String RANDOM_SEED = "SHA1PRNG";
    //暗号化用キーのパスワード
    public static final String PASS = "1234567890123456";
    //暗号化用キー設定ファイル
    public static final String PATH = "/WEB-INF/encrypt_setting.txt";
    //空文字
    public static final String EMPTY_STRING = "";


    public static final String SPLITER = "=";
    public static final String CONFIG_KEY = "password";
}

 
 
 
 

  
  
package jp.hub.agk.core.encrypt;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.security.SecureRandom;


import javax.crypto.Cipher;
import javax.crypto.CipherInputStream;
import javax.crypto.CipherOutputStream;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;


import jp.hub.agk.core.SystemConfBean;
import jp.hub.agk.core.setting.CustomizeSetting;


import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;


/**
 * 暗号化・復号化用共通部品
 * @author admin
 *
 */
public class EncryptUtil {


    private static Log log = LogFactory.getLog(EncryptUtil.class);


 /**
 * 暗号化<br/>
 * 暗号化した文字列を返却する
 * @param content - 暗号対象文字列
 * @return エラーの場合nullを返却する
 */
 public static String encryptToString(String content) {
 //TODO レビュー待ちのため、一時に無効化する
 if (!CustomizeSetting.ENCRYPT_FLG) {
 return content;
 }
 try {
 if (content == null) {
 return null;
 }
 byte[] bytes = content.getBytes(EncryptConst.CHAR_SET_UTF8);
 String encryptString = encryptToString(bytes);
 return encryptString;
 } catch (Exception e) {
 log.error(e.getMessage());
 return null;
 }
 }


 /**
 * 暗号化<br/>
 * 暗号化した文字列を返却する
 * @param bytes - 暗号化するbyteストリーム
 * @return エラーの場合nullを返却する
 */
 public static String encryptToString(byte[] bytes) {
 //TODO レビュー待ちのため、一時に無効化する
 if (!CustomizeSetting.ENCRYPT_FLG) {
 return null;
 }
 try {
 if (bytes == null) {
 return null;
 }
 IvParameterSpec ivSpec = new IvParameterSpec(EncryptConst.IV.getBytes(EncryptConst.CHAR_SET_UTF8));
 Cipher cipher = Cipher.getInstance(EncryptConst.CIPHER_ALGORITHM, "SunJCE");
 cipher.init(Cipher.ENCRYPT_MODE, genKey(), ivSpec);
 byte[] resultByte = cipher.doFinal(bytes);
 String resultStr = parseByte2HexStr(resultByte);
 return resultStr;
 } catch (Exception e) {
 log.error(e.getMessage());
 return null;
 }
 }


 /**
 * 復号化<br>
 * 対象文字列の複号化を行い文字列を返却する
 * @param content - 複合化対象文字列
 * @return エラーの場合nullを返却する
 */
 public static String decryptToString(String content) {
 //TODO レビュー待ちのため、一時に無効化する
 if (!CustomizeSetting.ENCRYPT_FLG) {
 return content;
 }
 try {
 if (content == null) {
 return null;
 }
 byte[] bytes = parseHexStr2Byte(content);
 String decryptString = decryptToString(bytes);
 return decryptString;
 } catch (Exception e) {
 log.error(e.getMessage());
 return null;
 }
 }


 /**
 * 復号化<br>
 * 対象文字列の複号化を行い文字列を返却する
 * @param bytes
 * @return エラーの場合nullを返却する
 */
 public static String decryptToString(byte[] bytes) {
 //TODO レビュー待ちのため、一時に無効化する
 if (!CustomizeSetting.ENCRYPT_FLG) {
 return null;
 }
 try {
 if (bytes == null) {
 return null;
 }
 IvParameterSpec ivSpec = new IvParameterSpec(EncryptConst.IV.getBytes(EncryptConst.CHAR_SET_UTF8));
 Cipher cipher = Cipher.getInstance(EncryptConst.CIPHER_ALGORITHM, "SunJCE");
 cipher.init(Cipher.DECRYPT_MODE, genKey(), ivSpec);
 byte[] result = cipher.doFinal(bytes);
 String decryptString = new String(result, EncryptConst.CHAR_SET_UTF8);
 return decryptString;
 } catch (Exception e) {
 log.error(e.getMessage());
 return null;
 }
 }


 /**
 * AES暗号化用キー生成
 * @return
 */
 private static SecretKeySpec genKey(){
 byte[] enCodeFormat = {0};
 try {
 SystemConfBean confBean = SystemConfBean.getInstance();
 String password = confBean.getEncryptPassword();
 KeyGenerator kgen = KeyGenerator.getInstance(EncryptConst.KEY_ALGORITHM);
 SecureRandom secureRandom = SecureRandom.getInstance(EncryptConst.RANDOM_SEED);
 secureRandom.setSeed(password.getBytes());
 kgen.init(EncryptConst.KEY_SIZE, secureRandom);
 SecretKey secretKey = kgen.generateKey();
 enCodeFormat = secretKey.getEncoded();
 } catch (Exception e) {
 log.error(e.getMessage());
 }
 return new SecretKeySpec(enCodeFormat, EncryptConst.KEY_ALGORITHM);
 }


 /**
 * ファイルを読み込んで、復号化して、書き込む
 * @param File
 * @throws Exception
 */
 public static void writeDecrycptFile(File infile, File outFile) throws Exception{
 IvParameterSpec ivSpec = new IvParameterSpec(EncryptConst.IV.getBytes(EncryptConst.CHAR_SET_UTF8));
 Cipher cipher = Cipher.getInstance(EncryptConst.CIPHER_ALGORITHM, "SunJCE");
 cipher.init(Cipher.DECRYPT_MODE, genKey(), ivSpec);
 byte[] buffer = new byte[8192];
 CipherInputStream cin = new CipherInputStream(new FileInputStream(infile), cipher);
 FileOutputStream fos = new FileOutputStream(outFile);
        int read = cin.read(buffer);
        while(read != -1){
        	fos.write(buffer, 0, read);
            read = cin.read(buffer);
        }
        cin.close();
        fos.close();
 }


 /**
 * ファイルを読み込んで、暗号化して、書き込む
 * @param File
 * @throws Exception
 */
 public static void writeEncrycptFile(File infile, File outFile) throws Exception{
 IvParameterSpec ivSpec = new IvParameterSpec(EncryptConst.IV.getBytes(EncryptConst.CHAR_SET_UTF8));
 Cipher cipher = Cipher.getInstance(EncryptConst.CIPHER_ALGORITHM, "SunJCE");
 cipher.init(Cipher.ENCRYPT_MODE, genKey(), ivSpec);
 FileInputStream cin = new FileInputStream(infile);
 CipherOutputStream fos = new CipherOutputStream(new FileOutputStream(outFile), cipher);
        byte[] buffer = new byte[8192];
        int read = cin.read(buffer);
        while(read != -1){
        	fos.write(buffer, 0, read);
            read = cin.read(buffer);
        }
        cin.close();
        fos.close();
 }


 /**
 * 二進数から十六進数に変換
 * @param buf
 * @return
 */
 private 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();
 }


 /**
 * 十六進数から二進数に変換
 * @param hexStr
 * @return
 */
 private 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;
 }
}
共有 人打赏支持
粉丝 0
博文 4
码字总数 238
×
荣耀与梦想
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: