android ios DES加密获得结果不一致
接手个项目,让登录的时候进行DES加密,服务端同事直接扔过来个DES3.java文件
public class DES3 {
//密码
private static final String PASSWORD_CRYPT_KEY = "***";
//偏移量
private static final String IV = "***";
public DES3() {
}
/**
* 加密
*
* @param message 密钥,长度必须是8的倍数
* @return 返回加密后的数据
* @throws Exception
*/
public static String encrypt(String message) throws Exception {
Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
DESKeySpec desKeySpec = new DESKeySpec(PASSWORD_CRYPT_KEY.getBytes(StandardCharsets.UTF_8));
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey secretKey = keyFactory.generateSecret(desKeySpec);
IvParameterSpec iv = new IvParameterSpec(IV.getBytes(StandardCharsets.UTF_8));
cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);
byte[] b = cipher.doFinal(message.getBytes(StandardCharsets.UTF_8));
BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode(b);
}
/**
* 解密
*
* @param message 密钥,长度必须是8的倍数
* @return 返回解密后的原始数据
* @throws Exception
*/
public static String decrypt(String message) throws Exception {
BASE64Decoder decoder = new BASE64Decoder();
byte[] bytesrc = decoder.decodeBuffer(message);
Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
DESKeySpec desKeySpec = new DESKeySpec(PASSWORD_CRYPT_KEY.getBytes(StandardCharsets.UTF_8));
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey secretKey = keyFactory.generateSecret(desKeySpec);
IvParameterSpec iv = new IvParameterSpec(IV.getBytes(StandardCharsets.UTF_8));
cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);
byte[] retByte = cipher.doFinal(bytesrc);
return new String(retByte);
}
public static void main(String[] args) throws Exception {
//加密
System.out.println("字符串加密:" + DES3.encrypt("oss-test2"));
//解密
System.out.println("字符串解密:" + DES3.decrypt("K3DVsW0MCBjbZZKd/YUh8A=="));
}
}
好高兴啊好高兴,android直接就能用,运行结果和main测试结果一致。
整ios,搜了一大圈,下了好几个三方,计算出来的结果都和java不一样。
在秘钥和偏移量一致的情况下,算出的结果不同,不科学啊。
细看加密源码,发现基本配置都差不多,无非就是配置CCCrypt有区别,比如JKEncrypt的配置:
ccStatus = CCCrypt(kCCEncrypt,
kCCAlgorithm3DES, //3DES
kCCOptionECBMode|kCCOptionPKCS7Padding, //设置模式
vkey, //key
kCCKeySize3DES,
vinitVec, //偏移量,这里不用,设置为nil;不用的话,必须为nil,不可以为@“”
vplainText,
plainTextBufferSize,
(void *)bufferPtr,
bufferPtrSize,
&movedBytes);
配置的都是3DES加密的方式。我又回去看DES3.java,发现里面配置的是DES加密,不是3DES加密,可能被文件名给骗了。
于是把JKEncrypt配置改成DES加密试试:
ccStatus = CCCrypt(kCCDecrypt,
kCCAlgorithmDES,
kCCOptionPKCS7Padding,
vkey,
kCCKeySizeDES,
vinitVec,
vplainText,
plainTextBufferSize,
(void *)bufferPtr,
bufferPtrSize,
&movedBytes);
计算出来的结果也是:”K3DVsW0MCBjbZZKd/YUh8A==”。
完美!!!
“你笑起来真好看,像春天的花一样~~~~~~~”