parent
ad525e82b3
commit
c634bd69c1
@ -1,148 +1,173 @@ |
|||||||
package com.hai.common.security; |
package com.hai.common.security; |
||||||
|
|
||||||
|
import java.io.*; |
||||||
import java.security.Key; |
import java.security.Key; |
||||||
import java.security.SecureRandom; |
import java.security.SecureRandom; |
||||||
import java.security.Security; |
import java.security.Security; |
||||||
|
|
||||||
import javax.crypto.Cipher; |
import javax.crypto.*; |
||||||
import javax.crypto.KeyGenerator; |
|
||||||
import javax.crypto.SecretKey; |
|
||||||
import javax.crypto.SecretKeyFactory; |
|
||||||
import javax.crypto.spec.DESKeySpec; |
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; |
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> |
* 偏移变量,固定占8位字节 |
||||||
* Java 6 只支持56bit密钥 <br> |
|
||||||
* Bouncy Castle 支持64bit密钥 |
|
||||||
*/ |
*/ |
||||||
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 |
* @param password |
||||||
* 二进制密钥 |
* @return |
||||||
* @return Key 密钥 |
|
||||||
* @throws Exception |
* @throws Exception |
||||||
*/ |
*/ |
||||||
private static Key toKey(byte[] key) throws Exception { |
private static Key generateKey(String password) throws Exception { |
||||||
|
DESKeySpec dks = new DESKeySpec(password.getBytes(CHARSET)); |
||||||
// 实例化DES密钥材料
|
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM); |
||||||
DESKeySpec dks = new DESKeySpec(key); |
return keyFactory.generateSecret(dks); |
||||||
|
|
||||||
// 实例化秘密密钥工厂
|
|
||||||
SecretKeyFactory keyFactory = SecretKeyFactory |
|
||||||
.getInstance(KEY_ALGORITHM); |
|
||||||
|
|
||||||
// 生成秘密密钥
|
|
||||||
SecretKey secretKey = keyFactory.generateSecret(dks); |
|
||||||
|
|
||||||
return secretKey; |
|
||||||
} |
} |
||||||
|
|
||||||
|
|
||||||
/** |
/** |
||||||
* 解密 |
* DES加密字符串 |
||||||
* |
* |
||||||
* @param data |
* @param password 加密密码,长度不能够小于8位 |
||||||
* 待解密数据 |
* @param data 待加密字符串 |
||||||
* @param key |
* @return 加密后内容 |
||||||
* 密钥 |
|
||||||
* @return byte[] 解密数据 |
|
||||||
* @throws Exception |
|
||||||
*/ |
*/ |
||||||
public static byte[] decrypt(byte[] data, byte[] key) throws Exception { |
public static String encrypt(String password, String data) { |
||||||
|
if (password== null || password.length() < 8) { |
||||||
// 还原密钥
|
throw new RuntimeException("加密失败,key不能小于8位"); |
||||||
Key k = toKey(key); |
} |
||||||
|
if (data == null) |
||||||
// 实例化
|
return null; |
||||||
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); |
try { |
||||||
|
Key secretKey = generateKey(password); |
||||||
// 初始化,设置为解密模式
|
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); |
||||||
cipher.init(Cipher.DECRYPT_MODE, k); |
IvParameterSpec iv = new IvParameterSpec(IV_PARAMETER.getBytes(CHARSET)); |
||||||
|
cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv); |
||||||
// 执行操作
|
byte[] bytes = cipher.doFinal(data.getBytes(CHARSET)); |
||||||
return cipher.doFinal(data); |
|
||||||
|
//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 password 解密密码,长度不能够小于8位 |
||||||
* 待加密数据 |
* @param data 待解密字符串 |
||||||
* @param key |
* @return 解密后内容 |
||||||
* 密钥 |
|
||||||
* @return byte[] 加密数据 |
|
||||||
* @throws Exception |
|
||||||
*/ |
*/ |
||||||
public static byte[] encrypt(byte[] data, byte[] key) throws Exception { |
public static String decrypt(String password, String data) { |
||||||
|
if (password== null || password.length() < 8) { |
||||||
// 还原密钥
|
throw new RuntimeException("加密失败,key不能小于8位"); |
||||||
Key k = toKey(key); |
} |
||||||
|
if (data == null) |
||||||
// 实例化
|
return null; |
||||||
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); |
try { |
||||||
|
Key secretKey = generateKey(password); |
||||||
// 初始化,设置为加密模式
|
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); |
||||||
cipher.init(Cipher.ENCRYPT_MODE, k); |
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); |
||||||
return cipher.doFinal(data); |
} catch (Exception e) { |
||||||
|
e.printStackTrace(); |
||||||
|
return data; |
||||||
|
} |
||||||
} |
} |
||||||
|
|
||||||
/** |
/** |
||||||
* 生成密钥 <br> |
* DES加密文件 |
||||||
* Java 6 只支持56bit密钥 <br> |
|
||||||
* Bouncy Castle 支持64bit密钥 <br> |
|
||||||
* |
* |
||||||
* @return byte[] 二进制密钥 |
* @param srcFile 待加密的文件 |
||||||
* @throws Exception |
* @param destFile 加密后存放的文件路径 |
||||||
|
* @return 加密后的文件路径 |
||||||
*/ |
*/ |
||||||
public static byte[] initKey() throws Exception { |
/* public static String encryptFile(String password, String srcFile, String destFile) { |
||||||
|
|
||||||
/* |
if (password== null || password.length() < 8) { |
||||||
* 实例化密钥生成器 |
throw new RuntimeException("加密失败,key不能小于8位"); |
||||||
* |
} |
||||||
* 若要使用64bit密钥注意替换 将下述代码中的KeyGenerator.getInstance(CIPHER_ALGORITHM); |
try { |
||||||
* 替换为KeyGenerator.getInstance(CIPHER_ALGORITHM, "BC"); |
IvParameterSpec iv = new IvParameterSpec(IV_PARAMETER.getBytes(CHARSET)); |
||||||
*/ |
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); |
||||||
KeyGenerator kg = KeyGenerator.getInstance(KEY_ALGORITHM); |
cipher.init(Cipher.ENCRYPT_MODE, generateKey(key), iv); |
||||||
|
InputStream is = new FileInputStream(srcFile); |
||||||
/* |
OutputStream out = new FileOutputStream(destFile); |
||||||
* 初始化密钥生成器 若要使用64bit密钥注意替换 将下述代码kg.init(56); 替换为kg.init(64); |
CipherInputStream cis = new CipherInputStream(is, cipher); |
||||||
*/ |
byte[] buffer = new byte[1024]; |
||||||
kg.init(56, new SecureRandom()); |
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(); |
* DES解密文件 |
||||||
|
* |
||||||
// 获得密钥的二进制编码形式
|
* @param srcFile 已加密的文件 |
||||||
return secretKey.getEncoded(); |
* @param destFile 解密后存放的文件路径 |
||||||
} |
* @return 解密后的文件路径 |
||||||
|
*/ |
||||||
public static byte[] initKey(String seed) throws Exception { |
/* public static String decryptFile(String password, String srcFile, String destFile) { |
||||||
KeyGenerator kg = KeyGenerator.getInstance(KEY_ALGORITHM); |
if (password== null || password.length() < 8) { |
||||||
SecureRandom secureRandom = new SecureRandom(new Base64().decode(seed)); |
throw new RuntimeException("加密失败,key不能小于8位"); |
||||||
kg.init(secureRandom); |
} |
||||||
SecretKey secretKey = kg.generateKey(); |
try { |
||||||
return secretKey.getEncoded(); |
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