DES加解密的时候遇到一个问题:C语言中不足八位填充的是‘\0’,我在Java中也是填的这个,但是加密后传给C程序解密失败,两边加密出来的内容不一致!!求教,怎么解决啊!!!C币用完了 求好心人
http://blog.csdn.net/xumaojun/article/details/17675905
C++
http://www.cnblogs.com/langtianya/p/3715975.html
Java
http://blog.csdn.net/sszgg2006/article/details/49148189
按照个解释,那你可以使用 空格 来填充。。
‘ ’
package com.nantian.des.test;
import javax.crypto.*;
import javax.crypto.spec.DESKeySpec;
import com.nantian.des.test.AbcConvertUtil;
import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.spec.InvalidKeySpecException;
public class DesEcbCompatiblePhpUtil {
/**
* 密钥算法
*/
private static final String ALGORITHM = "DES";
/**
* 加解密算法/工作模式/填充方式
*/
private static final String ALGORITHM_STR = "DES/ECB/NoPadding";
private static final String CHARSET = "GBK";
/**
* 填充内容
*/
private static final String PAD_STR = "\0";
public static void main(String[] args) throws Exception {
String clearText = "222222 ";
String key = "20653920";
System.out.println("明文:" + clearText + "\n密钥:" + key);
String encryptText = encrypt(clearText, key);
System.out.println("加密后:" + encryptText);
}
public static String encrypt(String souce, String key) {
try {
return encryptByDes(pkcs5Pad(souce), key);
} catch (Exception e) {
System.err.println("加密数据: {}异常,原因:{},{}"+ souce+ e.getMessage()+ e);
}
return "";
}
private static String encryptByDes(final String souce, final String key) throws InvalidKeyException,
NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException,
IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException {
// DES算法要求有一个可信任的随机数源
SecureRandom sr = new SecureRandom();
// 从原始密匙数据创建DESKeySpec对象
DESKeySpec dks = new DESKeySpec(key.getBytes(CHARSET));
// 创建一个密匙工厂,然后用它把DESKeySpec转换成 一个SecretKey对象
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM);
SecretKey key1 = keyFactory.generateSecret(dks);
// Cipher对象实际完成加密操作
Cipher cipher = Cipher.getInstance(ALGORITHM_STR);
// 用密匙初始化Cipher对象
cipher.init(Cipher.ENCRYPT_MODE, key1, sr);
// 现在,获取数据并加密
byte encryptedData[] = cipher.doFinal(souce.getBytes(CHARSET));
return AbcConvertUtil.bytesToHexString(encryptedData);
}
private static String pkcs5Pad(final String souce) throws UnsupportedEncodingException {
//密文和密钥的长度必须是8的倍数
if (0 == souce.length() % 8) {
return souce;
}
StringBuffer tmp = new StringBuffer(souce);
while (0 != tmp.length() % 8) {
tmp.append(PAD_STR);
}
return tmp.toString();
}
}
C语言的是用memset(temp,'\0',8)初始化,然后用memcpy()函数将要加密的字符串拷进去,不足八位后面自带了两个\0
C代码不能贴上来。。。。
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM);
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
跟别人的代码对比发现的差距。。本人C/C++