黄昏的阳光
2018-01-08 13:46:00
记一次JAVA与.net交互DES(CBC模式)加密/解密
一:DES加密概念 | |
DES是一种对称加密(Data Encryption Standard)算法。 | |
DES算法一般有两个关键点,第一个是加密算法,第二个是数据补位。 | |
二:DES算法模式 | |
ECB模式 | |
CBC模式 | |
这里我就不去介绍两种模式了,想要了解的童鞋请自行google | |
由于.net默认采用的是CBC模式 所以以下示例代码都是针对CBC模式的。。(主要是公司都是.net开发 java人少说不上话 别个.net要怎么 就怎么 诶) | |
java示例代码: | |
``` | |
import sun.misc.BASE64Decoder; | |
import javax.crypto.Cipher; | |
import javax.crypto.SecretKey; | |
import javax.crypto.SecretKeyFactory; | |
import javax.crypto.spec.DESKeySpec; | |
import javax.crypto.spec.IvParameterSpec; | |
import java.security.SecureRandom; | |
import java.util.Base64; | |
/** | |
* <p>Description: DescUtil 与.net配合使用DES 加密/解密工具类 </p> | |
* <p>Copyright: Copyright (c) 2016 </p> | |
* <p>Company: @Melody</p> | |
* | |
* @author @Melody | |
* @version 1.0 | |
* @date 2018/1/5 | |
*/ | |
public class DescUtil { | |
private static String KEY = "melody88"; | |
private final static byte[] IV = new byte[] {0x12, 0x34, 0x56, 0x78, 0x63, 0x86, 0x99, 0x29}; | |
private static String ENCODE = "utf-8"; | |
private static String DES = "DES"; | |
public static void main(String[] args)throws Exception{ | |
String str = encrypt2("Aa123456"); | |
System.err.println("加密结果是:" + str); | |
System.err.println("解密结果是:" + decrypt(str)); | |
} | |
/** | |
* 加密字符串 | |
* @param src | |
* @return | |
* @throws Exception | |
*/ | |
public static String encrypt2(String src) throws Exception { | |
src = src.replaceAll("@", "="); | |
SecureRandom sr = new SecureRandom(); | |
DESKeySpec ks = new DESKeySpec(KEY.getBytes("UTF-8")); | |
SecretKeyFactory skf = SecretKeyFactory.getInstance("DES"); | |
SecretKey sk = skf.generateSecret(ks); | |
Cipher cip = Cipher.getInstance("DES/CBC/PKCS5Padding");//Cipher.getInstance("DES"); | |
IvParameterSpec iv2 = new IvParameterSpec(IV); | |
cip.init(Cipher.ENCRYPT_MODE, sk, iv2);//IV的方式 | |
//cip.init(Cipher.ENCRYPT_MODE, sk, sr);//没有传递IV | |
String dest = Base64.getEncoder().encodeToString(cip.doFinal(src.getBytes("UTF-8"))); | |
return dest.replaceAll("=", "@"); | |
} | |
/** | |
* 解密字符串 | |
* @param str | |
* @return | |
*/ | |
public static String decrypt(String str) { | |
try { | |
str = str.replaceAll("@", "="); | |
BASE64Decoder decoder = new BASE64Decoder(); | |
byte[] data = decoder.decodeBuffer(str); | |
// 从原始密匙数据创建一个DESKeySpec对象 | |
DESKeySpec dks = new DESKeySpec(KEY.getBytes("UTF-8")); | |
// 创建一个密匙工厂,然后用它把DESKeySpec对象转换成 | |
// 一个SecretKey对象 | |
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); | |
SecretKey secretKey = keyFactory.generateSecret(dks); | |
// .net DES 默认是CBC模式。。。。坑 | |
Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); | |
IvParameterSpec iv2 = new IvParameterSpec(IV); | |
// 用密匙初始化Cipher对象 | |
cipher.init(Cipher.DECRYPT_MODE, secretKey, iv2); | |
// 正式执行解密操作 | |
byte decryptedData[] = cipher.doFinal(data); | |
return new String(decryptedData); | |
} catch (Exception e) { | |
e.printStackTrace(); | |
} | |
return null; | |
} | |
} | |
``` | |
评论
最近浏览