文档章节

AES 128加密解密共同处理类

荣耀与梦想
 荣耀与梦想
发布于 2014/06/17 14:42
字数 814
阅读 39
收藏 0
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
博文 5
码字总数 238
作品 0
日本
高级程序员
php7 openssl_decrypt AES的ECB与CBC加解密

php7.2版本用opensslencrypt代替mcryptencrypt,导致以往自己写的Aes加密类不能用。 这次项目客户端用的是 AES-128-ECB 加密,我用在线AES工具来测试,发现自己写的加解密方法得到的值不一样...

jichun
05/08
0
0
iOS 加密的3种方法

//需要导入 #import <CommonCrypto/CommonCryptor.h> ==============MD5加密============ NSString str = @"加密的内容"; //转换成C语言的字符串 const char cStr=[str UTF8String]; //MD5加......

wuc
2016/01/05
37
0
AES在线加密解密-附AES128,192,256,CBC,CFB,ECB,OFB,PCBC各种加密

一、AES在线加密解密:AES 128/192/256位CBC/CFB/ECB/OFB/PCBC在线加密解密|在线工具|在线助手|在线生成|在线制作 http://www.it399.com/aes 支持以下128,192,256数据块加密解密,CBC,CFB...

陈首映
05/22
0
0
关于Android下AES加密、解密的问题,求高手指点迷津,在线解密不出来的问题

本人的AES工具类代码如下,按照项目要求是:AES ECB模式密钥长度128bit 不偏移 无补码 加密结果编码方式为十六进制, 但是加密出来的密文在线解密:http://www.seacha.com/tools/aes.html 总...

Neo_D
2015/03/16
2.3K
3
用openssl对文件加密及解密

Openssl是一个开源的用以实现SSL协议的产品,它主要包括了三个部分:密码算法库、应用程序、SSL协议库。Openssl实现了SSL协议所需要的大多数算法。 下面我将单介绍使用Openssl进行文件的对称...

独钓渔
2014/07/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

sourcetree 离线免注册登录安装教程

Sourcetree是一个优秀的git可视化管理工具,深受开发者喜爱Sourcetree官网,但是在安装时需要谷歌账户登录,需要翻qiang才可以,此一点一直被人们所诟病。今天本教程就为大家提供离线免登陆安...

QQZZFT
14分钟前
1
0
使用 PostgreSQL 解决一个实际的统计分析问题

使用 PostgreSQL 解决一个实际的统计分析问题作者:老农民(刘启华)Email: 46715422@qq.com 之前有个朋友扔给我一个奇葩需求,他们公司之前做了一批问卷调查,全部都是统一格式的excel...

新疆老农民
17分钟前
1
0
TypeScript基础入门之高级类型的映射类型

转发 TypeScript基础入门之高级类型的映射类型 高级类型 映射类型 一个常见的任务是将一个已知的类型每个属性都变为可选的: interface PersonPartial {    name?: string;    age?...

durban
32分钟前
1
0
Dubbo源码分析(6):Dubbo内核实现之基于SPI思想Dubbo内核实现

SPI接口定义 定义了@SPI注解 package com.alibaba.dubbo.common.extension; import java.lang.annotation.Documented;import java.lang.annotation.ElementType;import java.lang.an......

郑加威
33分钟前
1
0
RxJS的另外四种实现方式(后记)—— 同时实现管道和链式编程

目录 RxJS的另外四种实现方式(序) RxJS的另外四种实现方式(一)——代码最小的库 RxJS的另外四种实现方式(二)——代码最小的库(续) RxJS的另外四种实现方式(三)——性能最高的库 Rx...

一个灰
36分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部