发送一段java 的DES加密和解密
/**
* 加密
*/
private static byte[] iv = {1, 2, 3, 4, 5, 6, 7, 8};
public static String encryptDES(String encryptString, String encryptKey) {
try {
IvParameterSpec zeroIv = new IvParameterSpec(iv);
SecretKeySpec key = new SecretKeySpec(encryptKey.getBytes(), "DES");
Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key, zeroIv);
byte[] encryptedData = cipher.doFinal(encryptString.getBytes());
return Base64.encode(encryptedData);
} catch (Exception e) {
e.printStackTrace();
return "";
}
}
/**
* 解密
*/
public static String decryptDES(String decryptString, String decryptKey) {
try {
byte[] byteMi = Base64.decode(decryptString);
IvParameterSpec zeroIv = new IvParameterSpec(iv);
SecretKeySpec key = new SecretKeySpec(decryptKey.getBytes(), "DES");
Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, key, zeroIv);
byte decryptedData[] = cipher.doFinal(byteMi);
return new String(decryptedData);
} catch (Exception e) {
e.printStackTrace();
return "";
}
}
现在的javascript解密库是用crypto-js
但是没找到能支持DES/CBC/PKCS5Padding的算法。怎么办
看了一下,
Crypto-js
是支持des-cbc
加密的。Pkcs5
是Pkcs7
在块大小为8时特殊情况,本质上是一样的。Crypto-js
默认padding是Pkcs7
,可以直接使用。给个例子:
回答你评论中的问题。
首先,你这里
des
加密出来的结果,是用base64
编码表示的,base64
编码里,合法字符范围是[A-Za-z0-9+=/]
,空格根本就不是合法字符,是不应该出现的。所以不是Cryptojs
的问题。那么到底是哪里出了问题呢,首先来看看你给的第一端密文:
可以看到
XXD@
后面出现了0a1f1f02
这一段,在utf-8编码下,0x0a
被解释为换行,其他的被解释为控制字符无法显示。解密过程正常,输出也正常,说明解密出来的就是原文(如果密文有问题,应该是报错,一点都解密不出来),至于为什么会包含这些奇怪的字符,就要问问你们后端怎么弄出来的这段了,是不是把非utf-8
编码的字符强行连接在一起了。那么这个空格又是如何出现的呢?我们把解密后的密文重新加密回去:
注意到这里出现了换行,这时因为
openssl
会调用base64
命令进行编码,为了兼容某些旧程序,会自动进行换行。之后在网络传输过程中或者你们后端做了替换或者你们的复制粘贴过程中,这个换行符变成了空格。从你给的第二段密文也可以看出,是同样的60个字符一个空格。这里的换行宽度和java的不一样,但是道理是一样的。所以,解决方案就是,在前端或者后端移除空白字符。