/*
* Copyright 2002-2007 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.suren.autotest.web.framework.util;
import java.io.ByteArrayOutputStream;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
/**
* 实现加解密
* @author suren
* @date 2015年11月24日 下午5:04:05
*/
public class Encryptor
{
private SecretKey key;
private Cipher cipher;
private byte[] cipherByte;
public static final String ALG_DES = "DES";
private static Encryptor encryptor;
private Encryptor(){}
private Encryptor(String algorithm, String keyStr) throws NoSuchAlgorithmException, NoSuchPaddingException
{
key = getSecretKey(keyStr, ALG_DES);
cipher = Cipher.getInstance(algorithm);
}
public static Encryptor getInstance(String algorithm, String secretKey) throws NoSuchAlgorithmException, NoSuchPaddingException
{
if(encryptor == null)
{
if(StringUtils.isBlank(secretKey))
{
secretKey = "http://surenpi.com";
}
encryptor = new Encryptor(algorithm, secretKey);
}
return encryptor;
}
public byte[] encrypt(String str) throws InvalidKeyException, IllegalBlockSizeException, BadPaddingException
{
cipher.init(Cipher.ENCRYPT_MODE, key);
cipherByte = cipher.doFinal(str.getBytes());
return cipherByte;
}
public String encryptStr(String str) throws InvalidKeyException, IllegalBlockSizeException, BadPaddingException
{
byte[] encryptArray = encrypt(str);
StringBuffer strBuf = new StringBuffer();
for(byte e : encryptArray)
{
strBuf.append(intToChar((e >> 4) & 0x0f));
strBuf.append(intToChar(e & 0x0f));
}
return strBuf.toString();
}
public byte[] decrypt(byte[] buf) throws InvalidKeyException, IllegalBlockSizeException, BadPaddingException
{
cipher.init(Cipher.DECRYPT_MODE, key);
cipherByte = cipher.doFinal(buf);
return cipherByte;
}
public String decryptStr(byte[] buf) throws InvalidKeyException, IllegalBlockSizeException, BadPaddingException
{
return new String(decrypt(buf));
}
/**
* decrypt string
* @see #encryptStr(String)
* @param encryptStr
* @return
* @throws InvalidKeyException
* @throws IllegalBlockSizeException
* @throws BadPaddingException
* @throws NullPointerException if encryptStr is null
*/
public String decryptStr(String encryptStr) throws InvalidKeyException, IllegalBlockSizeException, BadPaddingException
{
if(encryptStr == null)
{
throw new NullPointerException();
}
encryptStr = encryptStr.toUpperCase();
ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
int len = encryptStr.length();
for(int i = 0; i < len; i += 2)
{
int b = ((charToByte(encryptStr.charAt(i)) << 4) & 0xff) | charToByte(encryptStr.charAt(i + 1));
byteOut.write(b);
}
return decryptStr(byteOut.toByteArray());
}
private byte charToByte(char c)
{
return (byte) "0123456789ABCDEF".indexOf(c);
}
private char intToChar(int b)
{
return "0123456789ABCDEF".charAt(b);
}
public void clean()
{
cipherByte = null;
}
public static SecretKey getSecretKey(String desKey, String algorithm)
{
if(StringUtils.isBlank(desKey))
{
throw new IllegalArgumentException("密钥不能为空。");
}
return getSecretKey(Base64.decodeBase64(desKey), algorithm);
}
/**
* 将密钥字符串转换为密钥实例对象
*
* @param desKey 密钥
* @param algorithm 加密算法名称,支持的算法: {@link #DES}、 {@link #DESEDE}、{@link #AES}、
* {@link #BLOWFISH}、{@link #RC2}、 {@link #RC4}
* @return 密钥实例
*/
public static SecretKey getSecretKey(byte[] desKey, String algorithm)
{
if(ALG_DES.equalsIgnoreCase(algorithm))
{
try
{
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(algorithm);
DESKeySpec dks = new DESKeySpec(desKey);
return keyFactory.generateSecret(dks);
}
catch (NoSuchAlgorithmException e)
{
throw new RuntimeException(e.getCause());
}
catch (Exception e)
{
throw new IllegalArgumentException("将密钥字符串转换为密钥实例对象失败。", e);
}
}
return new SecretKeySpec(desKey, algorithm);
}
}