/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JFUEncryptUtil
*   ソースファイル名：JFUEncryptUtil.java
*   作成者          ：富士通
*   日付            ：2017年04月20日
*＜機能概要＞
*   AES暗号化部品です。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v32.00      2017/04/20   FJ)岡井     【ANK-3158-00-00】訪販申込情報の検索・取得API作成
*
**********************************************************************/
package eo.web.webview.common;

import static com.fujitsu.futurity.web.x31.X31SWebLog.DEBUG_LOG;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;

/**
 * AES複号化部品です。
 * <br>
 * @author 富士通
 */
public class JFUEncryptUtil
{

	/** エンコード：UTF-8 */
	private static String UTF_8 = "UTF-8";
	/** 暗号化方法 */
	private static String ENC_WAY = "AES/CBC/PKCS5Padding";

	/**
	 * AES暗号化処理です。
	 * 
	 * <br>
	 * @param key 共通暗号化キー
	 * @param iv 初期化ベクトル
	 * @param val 暗号化する値
	 * @return 暗号化結果
	 * @throws Exception
	 */
	public static String encryptAES(String key, String iv, String val) throws Exception
	{
		if (JFUWebCommon.isNull(key) || JFUWebCommon.isNull(iv) || JFUWebCommon.isNull(val))
		{
			DEBUG_LOG.info("暗号化に必要な値が設定されていません。");
			return val;
		}

		String encVal = null;

		// バイトに変換(UTF-8)
		byte[] byteKey = key.getBytes(UTF_8);
		byte[] byteIv = iv.getBytes(UTF_8);
		byte[] byteVal = val.getBytes(UTF_8);

		// 暗号化キーと初期化ベクトルのオブジェクト生成
		SecretKeySpec secKey = new SecretKeySpec(byteKey, "AES");
		IvParameterSpec isParam = new IvParameterSpec(byteIv);

		// 暗号化方式：AES
		// 暗号利用モード：CBC
		// パディング方式：PKCS5Padding
		Cipher ch = Cipher.getInstance(ENC_WAY);

		// 初期化
		ch.init(Cipher.ENCRYPT_MODE, secKey, isParam);

		// 暗号化結果
		byte[] byteRes = ch.doFinal(byteVal);

		// Base64でエンコード
		encVal = Base64.encode(byteRes);

		DEBUG_LOG.info("暗号化結果：" + encVal);

		return encVal;
	}

	/**
	 * AES復号化処理です。
	 * 
	 * <br>
	 * @param key 共通暗号化キー
	 * @param iv 初期化ベクトル
	 * @param val 復号化する値
	 * @return 復号化結果
	 * @throws Exception
	 */
	public static String decryptAES(String key, String iv, String val) throws Exception
	{
		if (JFUWebCommon.isNull(key) || JFUWebCommon.isNull(iv) || JFUWebCommon.isNull(val))
		{
			return val;
		}

		String decVal = null;

		// バイトに変換(UTF-8) ※値はBase64でデコード
		byte[] byteVal = Base64.decode(val);
		byte[] byteKey = key.getBytes(UTF_8);
		byte[] byteIv = iv.getBytes(UTF_8);

		// 暗号化キーと初期化ベクトルのオブジェクト生成
		SecretKeySpec secKey = new SecretKeySpec(byteKey, "AES");
		IvParameterSpec isParam = new IvParameterSpec(byteIv);

		// 暗号化方式：AES
		// 暗号利用モード：CBC
		// パディング方式：PKCS5Padding
		Cipher ch = Cipher.getInstance(ENC_WAY);

		// 初期化
		ch.init(Cipher.DECRYPT_MODE, secKey, isParam);

		// 復号化結果
		byte[] byteRes = ch.doFinal(byteVal);

		decVal = new String(byteRes, UTF_8);
		return decVal;
	}
}
