代码如下:
import java.io.UnsupportedEncodingException;import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.IvParameterSpec;public class DesDemo {
public static byte[] decryptByDES(byte[] bytE,byte[] bytKey) throws Exception{    
DESKeySpec desKS = new DESKeySpec(bytKey);    
SecretKeyFactory skf = SecretKeyFactory.getInstance("DES");    
SecretKey sk = skf.generateSecret(desKS);
Cipher cip = Cipher.getInstance("DES"); 
IvParameterSpec iv = new IvParameterSpec(bytKey);
cip.init(Cipher.DECRYPT_MODE,sk,iv);     
return cip.doFinal(bytE);  


public static byte[] encryptByDES(byte[] bytP,byte[] bytKey) throws Exception{    
DESKeySpec desKS = new DESKeySpec(bytKey);    
SecretKeyFactory skf = SecretKeyFactory.getInstance("DES");    
SecretKey sk = skf.generateSecret(desKS);    
Cipher cip = Cipher.getInstance("DES/ECB/PKCS5Padding"); 
cip.init(Cipher.ENCRYPT_MODE,sk);    
return cip.doFinal(bytP); 


public static void main(String[] args) throws UnsupportedEncodingException, Exception {
byte[] data="12345678".getBytes("utf-8");
byte[] key="87654321".getBytes("utf-8");
byte[] Master_Text=DesDemo.encryptByDES(data, key);
System.out.println(Master_Text.length);
}
}输入的结果是:16

解决方案 »

  1.   

    因为你用 PKCS5Padding 进行了填充。根据填充的规范,只要设定了填充,就必须使用,因此哪怕是 8 个字节的整数倍也需要增加填充,否则就没办法解密了。设定了填充模式,分组加密算法加密后的长度是:原文的字节数 / 8 * 8 + 8
      

  2.   

    明白了。谢谢。
    我现在遇到的问题是:
        c生成的密钥和密文,如何在java下解密?(c的密文只有8个字节)
      

  3.   

    C 语言上的 DES 是采用什么方式加密的?需要知道加密模式(比如 ECB、CBC、OFB 等)和填充模式(NoPadding, PKCS5Padding, ISO10126Padding 等)这两个非常重要。
      

  4.   

    用 DES 加密的话,若不采用填充模式,那原文的字节数必须是 8 的整数倍。
      

  5.   

    用Base64,说不定就是12字节!
      

  6.   

    c的不清楚,说是不足8字节的后面补空格。而且明文是8字节,密文也是8字节的。用java加密出来的字符串和c加密出来的字符串都一样,就是java后面多了8个填充的字符。请问下,有没有办法不让java增加这8个填充字符?
    PS:java的加密模式是EBC,填充模式不允许用NoPadding。我试过用CBC/NoPadding,但是加密的结果不是想要的结果。
      

  7.   

    我自己写了个DES类。问题总算解决了。呵呵