parent
ad525e82b3
commit
c634bd69c1
@ -1,148 +1,173 @@ |
||||
package com.hai.common.security; |
||||
|
||||
import java.io.*; |
||||
import java.security.Key; |
||||
import java.security.SecureRandom; |
||||
import java.security.Security; |
||||
|
||||
import javax.crypto.Cipher; |
||||
import javax.crypto.KeyGenerator; |
||||
import javax.crypto.SecretKey; |
||||
import javax.crypto.SecretKeyFactory; |
||||
import javax.crypto.*; |
||||
import javax.crypto.spec.DESKeySpec; |
||||
import javax.crypto.spec.IvParameterSpec; |
||||
|
||||
import org.apache.commons.codec.binary.Base64; |
||||
import java.util.Base64; |
||||
import org.bouncycastle.jce.provider.BouncyCastleProvider; |
||||
public class DESUtil { |
||||
|
||||
/** |
||||
* DES安全编码组件 |
||||
* |
||||
* @author wbw |
||||
* @version 1.0 |
||||
*/ |
||||
public abstract class DESUtil { |
||||
static{ |
||||
Security.insertProviderAt(new BouncyCastleProvider(), 1); |
||||
} |
||||
/** |
||||
* 密钥算法 <br> |
||||
* Java 6 只支持56bit密钥 <br> |
||||
* Bouncy Castle 支持64bit密钥 |
||||
* 偏移变量,固定占8位字节 |
||||
*/ |
||||
public static final String KEY_ALGORITHM = "DES"; |
||||
|
||||
private final static String IV_PARAMETER = "12345678"; |
||||
/** |
||||
* 密钥算法 |
||||
*/ |
||||
private static final String ALGORITHM = "DES"; |
||||
/** |
||||
* 加密/解密算法 / 工作模式 / 填充方式 |
||||
* 加密/解密算法-工作模式-填充模式 |
||||
*/ |
||||
public static final String CIPHER_ALGORITHM = "DES/ECB/PKCS5PADDING"; |
||||
private static final String CIPHER_ALGORITHM = "DES/CBC/PKCS5Padding"; |
||||
/** |
||||
* 默认编码 |
||||
*/ |
||||
private static final String CHARSET = "utf-8"; |
||||
|
||||
/** |
||||
* 转换密钥 |
||||
* 生成key |
||||
* |
||||
* @param key |
||||
* 二进制密钥 |
||||
* @return Key 密钥 |
||||
* @param password |
||||
* @return |
||||
* @throws Exception |
||||
*/ |
||||
private static Key toKey(byte[] key) throws Exception { |
||||
|
||||
// 实例化DES密钥材料
|
||||
DESKeySpec dks = new DESKeySpec(key); |
||||
|
||||
// 实例化秘密密钥工厂
|
||||
SecretKeyFactory keyFactory = SecretKeyFactory |
||||
.getInstance(KEY_ALGORITHM); |
||||
|
||||
// 生成秘密密钥
|
||||
SecretKey secretKey = keyFactory.generateSecret(dks); |
||||
|
||||
return secretKey; |
||||
private static Key generateKey(String password) throws Exception { |
||||
DESKeySpec dks = new DESKeySpec(password.getBytes(CHARSET)); |
||||
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM); |
||||
return keyFactory.generateSecret(dks); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* 解密 |
||||
* DES加密字符串 |
||||
* |
||||
* @param data |
||||
* 待解密数据 |
||||
* @param key |
||||
* 密钥 |
||||
* @return byte[] 解密数据 |
||||
* @throws Exception |
||||
* @param password 加密密码,长度不能够小于8位 |
||||
* @param data 待加密字符串 |
||||
* @return 加密后内容 |
||||
*/ |
||||
public static byte[] decrypt(byte[] data, byte[] key) throws Exception { |
||||
|
||||
// 还原密钥
|
||||
Key k = toKey(key); |
||||
|
||||
// 实例化
|
||||
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); |
||||
|
||||
// 初始化,设置为解密模式
|
||||
cipher.init(Cipher.DECRYPT_MODE, k); |
||||
|
||||
// 执行操作
|
||||
return cipher.doFinal(data); |
||||
public static String encrypt(String password, String data) { |
||||
if (password== null || password.length() < 8) { |
||||
throw new RuntimeException("加密失败,key不能小于8位"); |
||||
} |
||||
if (data == null) |
||||
return null; |
||||
try { |
||||
Key secretKey = generateKey(password); |
||||
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); |
||||
IvParameterSpec iv = new IvParameterSpec(IV_PARAMETER.getBytes(CHARSET)); |
||||
cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv); |
||||
byte[] bytes = cipher.doFinal(data.getBytes(CHARSET)); |
||||
|
||||
//JDK1.8及以上可直接使用Base64,JDK1.7及以下可以使用BASE64Encoder
|
||||
//Android平台可以使用android.util.Base64
|
||||
return new String(Base64.getEncoder().encode(bytes)); |
||||
|
||||
} catch (Exception e) { |
||||
e.printStackTrace(); |
||||
return data; |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 加密 |
||||
* DES解密字符串 |
||||
* |
||||
* @param data |
||||
* 待加密数据 |
||||
* @param key |
||||
* 密钥 |
||||
* @return byte[] 加密数据 |
||||
* @throws Exception |
||||
* @param password 解密密码,长度不能够小于8位 |
||||
* @param data 待解密字符串 |
||||
* @return 解密后内容 |
||||
*/ |
||||
public static byte[] encrypt(byte[] data, byte[] key) throws Exception { |
||||
|
||||
// 还原密钥
|
||||
Key k = toKey(key); |
||||
|
||||
// 实例化
|
||||
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); |
||||
|
||||
// 初始化,设置为加密模式
|
||||
cipher.init(Cipher.ENCRYPT_MODE, k); |
||||
|
||||
// 执行操作
|
||||
return cipher.doFinal(data); |
||||
public static String decrypt(String password, String data) { |
||||
if (password== null || password.length() < 8) { |
||||
throw new RuntimeException("加密失败,key不能小于8位"); |
||||
} |
||||
if (data == null) |
||||
return null; |
||||
try { |
||||
Key secretKey = generateKey(password); |
||||
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); |
||||
IvParameterSpec iv = new IvParameterSpec(IV_PARAMETER.getBytes(CHARSET)); |
||||
cipher.init(Cipher.DECRYPT_MODE, secretKey, iv); |
||||
return new String(cipher.doFinal(Base64.getDecoder().decode(data.getBytes(CHARSET))), CHARSET); |
||||
} catch (Exception e) { |
||||
e.printStackTrace(); |
||||
return data; |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 生成密钥 <br> |
||||
* Java 6 只支持56bit密钥 <br> |
||||
* Bouncy Castle 支持64bit密钥 <br> |
||||
* DES加密文件 |
||||
* |
||||
* @return byte[] 二进制密钥 |
||||
* @throws Exception |
||||
* @param srcFile 待加密的文件 |
||||
* @param destFile 加密后存放的文件路径 |
||||
* @return 加密后的文件路径 |
||||
*/ |
||||
public static byte[] initKey() throws Exception { |
||||
|
||||
/* |
||||
* 实例化密钥生成器 |
||||
* |
||||
* 若要使用64bit密钥注意替换 将下述代码中的KeyGenerator.getInstance(CIPHER_ALGORITHM); |
||||
* 替换为KeyGenerator.getInstance(CIPHER_ALGORITHM, "BC"); |
||||
*/ |
||||
KeyGenerator kg = KeyGenerator.getInstance(KEY_ALGORITHM); |
||||
|
||||
/* |
||||
* 初始化密钥生成器 若要使用64bit密钥注意替换 将下述代码kg.init(56); 替换为kg.init(64); |
||||
*/ |
||||
kg.init(56, new SecureRandom()); |
||||
/* public static String encryptFile(String password, String srcFile, String destFile) { |
||||
|
||||
if (password== null || password.length() < 8) { |
||||
throw new RuntimeException("加密失败,key不能小于8位"); |
||||
} |
||||
try { |
||||
IvParameterSpec iv = new IvParameterSpec(IV_PARAMETER.getBytes(CHARSET)); |
||||
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); |
||||
cipher.init(Cipher.ENCRYPT_MODE, generateKey(key), iv); |
||||
InputStream is = new FileInputStream(srcFile); |
||||
OutputStream out = new FileOutputStream(destFile); |
||||
CipherInputStream cis = new CipherInputStream(is, cipher); |
||||
byte[] buffer = new byte[1024]; |
||||
int r; |
||||
while ((r = cis.read(buffer)) > 0) { |
||||
out.write(buffer, 0, r); |
||||
} |
||||
cis.close(); |
||||
is.close(); |
||||
out.close(); |
||||
return destFile; |
||||
} catch (Exception ex) { |
||||
ex.printStackTrace(); |
||||
} |
||||
return null; |
||||
}*/ |
||||
|
||||
// 生成秘密密钥
|
||||
SecretKey secretKey = kg.generateKey(); |
||||
|
||||
// 获得密钥的二进制编码形式
|
||||
return secretKey.getEncoded(); |
||||
} |
||||
|
||||
public static byte[] initKey(String seed) throws Exception { |
||||
KeyGenerator kg = KeyGenerator.getInstance(KEY_ALGORITHM); |
||||
SecureRandom secureRandom = new SecureRandom(new Base64().decode(seed)); |
||||
kg.init(secureRandom); |
||||
SecretKey secretKey = kg.generateKey(); |
||||
return secretKey.getEncoded(); |
||||
} |
||||
} |
||||
/** |
||||
* DES解密文件 |
||||
* |
||||
* @param srcFile 已加密的文件 |
||||
* @param destFile 解密后存放的文件路径 |
||||
* @return 解密后的文件路径 |
||||
*/ |
||||
/* public static String decryptFile(String password, String srcFile, String destFile) { |
||||
if (password== null || password.length() < 8) { |
||||
throw new RuntimeException("加密失败,key不能小于8位"); |
||||
} |
||||
try { |
||||
File file = new File(destFile); |
||||
if (!file.exists()) { |
||||
file.getParentFile().mkdirs(); |
||||
file.createNewFile(); |
||||
} |
||||
IvParameterSpec iv = new IvParameterSpec(IV_PARAMETER.getBytes(CHARSET)); |
||||
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); |
||||
cipher.init(Cipher.DECRYPT_MODE, generateKey(key), iv); |
||||
InputStream is = new FileInputStream(srcFile); |
||||
OutputStream out = new FileOutputStream(destFile); |
||||
CipherOutputStream cos = new CipherOutputStream(out, cipher); |
||||
byte[] buffer = new byte[1024]; |
||||
int r; |
||||
while ((r = is.read(buffer)) >= 0) { |
||||
cos.write(buffer, 0, r); |
||||
} |
||||
cos.close(); |
||||
is.close(); |
||||
out.close(); |
||||
return destFile; |
||||
} catch (Exception ex) { |
||||
ex.printStackTrace(); |
||||
} |
||||
return null; |
||||
}*/ |
||||
} |
||||
|
Loading…
Reference in new issue