文档章节

AES 128加密解密共同处理类

荣耀与梦想
 荣耀与梦想
发布于 2014/06/17 14:42
字数 814
阅读 39
收藏 0
点赞 0
评论 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
iOS加密总结

加密一般分为 对称加密和非对称加密。 —、对称加密 对称密码学分成分组密码和序列密码(流密码)两部分,他们差异较大易于区分。 序列密码 序列密码单独加密每个位。它是通过将密钥序列中的每...

wesk痕
2016/11/20
54
0
3des 加密

有两句话是这么说的: 1)算法和数据结构就是编程的一个重要部分,你若失掉了算法和数据结构,你就把一切都失掉了。 2)编程就是算法和数据结构,算法和数据结构是编程的灵魂。 注意,这可不...

zhanghongjie0302
2017/07/30
0
0
AES加密解密

// // main.m // AES加密 // // Created by dc008 on 16/1/5. // Copyright © 2016年 lin. All rights reserved. // // AES和MD5相对比base64安全性更高 #import <Foundation/Foundation.h......

温暖c
2016/01/05
24
0
Golang加密系列之AES

Golang加密系列之AES Golang加密系列之RSA 这里我们只讨论使用aes加密算法,pkcs7padding,CBC模式模式进行加密。 加密代码: func Encrypt(plantText, key []byte) ([]byte, error) { block...

保护单身狗协会理事
2015/09/02
697
3
数据MD5+base64、AES+RSA加密原理

在服务器与终端设备进行HTTP通讯时,常常会被网络抓包、反编译(Android APK反编译工具)等技术得到HTTP通讯接口地址和参数。为了确保信息的安全,我们必须进行接口参数加密和解密。本文只讲...

朝雨晚风
2016/07/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

upstream sent too big header while reading...

nginx 报错:1736 upstream sent too big header while reading response header from upstream 1. 一般处理 location ~ \.php$ { #增加下面两句 fastcgi_buffer_size 128k; ......

dubox
13分钟前
0
0
Python解析配置文件模块:ConfigPhaser

import configparser as pa# [SectionA]# a = aa# b = bb# c = cc# [SectionB]# optionint = 1# optionfloat = 1.1# optionstring = string#https://www.cnblogs.com/a......

易野
20分钟前
0
0
Java基础——面向对象

声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。 Object的方法: clone() Object 克隆 to Strin...

凯哥学堂
21分钟前
0
0
rabbitmq学习记录(八)消息发布确认机制

RabbitMQ服务器崩了导致的消息数据丢失,已经持久化的消息数据我们可以通过消息持久化来预防。但是,如果消息从生产者发送到vhosts过程中出现了问题,持久化消息数据的方案就无效了。 Rabbit...

人觉非常君
26分钟前
0
0
毕业5年,我是怎么成为年薪30W的运维工程师

#转载# 我在大学读的是计算机专业,但大学毕业之后,进入到一家私企进行工作,工作的内容类似于网管,会经常的去修电脑,去做水晶头等内容。刚开始工作,也没想太多,最想的是丰富自己的工作...

Py爱好
33分钟前
1
0
大数据基础知识,大数据学习,涉及的知识点

一、什么是大数据 一种规模大到在获取、存储、管理、分析方面大大超出了传统数据库软件工具能力范围的数据集合,具有海量的数据规模、快速的数据流 转、多样的数据类型和价值密度低四大特征。...

董黎明
48分钟前
0
0
Linux CentOS 7上安装极点五笔

话说几天前在新买的惠普笔记本上成功地安装了Linux CentOS 7操作系统、Nvidia Quandro P600驱动程序及X Window,并在VMware下安装Red Hat教学环境,彻底跳出Windows的苦海,但仍然有一件事不...

大别阿郎
今天
16
0
2018年7月20日集群课程

一、集群介绍 集群,简单地说是指一组(若干个)相互独立的计算机,利用高速通信网络组成一个较大的计算机服务系统,每个集群节点(即集群中的每台计算机)都是运行各自服务的独立服务器。 ...

人在艹木中
今天
0
0
spark开发机中调试snappy

目的 在Idea中的点击运行,使spark可以直接读取snappy 自己编译hadoop,以支持snappy的压缩。 自己编译的目的就是要得到支持snappy文件读写的动态链接库。如果可以在网上下载,可以跳过自行编...

benny周
今天
0
0
centos7 安装docker

1,查看系统版本 cat /etc/redhat-release 2,安装gcc yum -y install gccyum -y install gcc-c++ 3,卸载旧版本 yum remove docker \ docker-client \ ......

暗中观察
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部