有没有java实现的DES加密解密源码,急,密钥不要自动生成的,要我指定的,我抄了个样例,但是不知道加密出来对不对,但不能解密,如下:
/*
 * Created on 2005-6-7
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
package com.linkwise.ericsson.util;import java.security.*;import javax.crypto.*;
import javax.crypto.spec.*;import java.io.*;
public class DES {
/**
   * DES 加密算法
   * @param data 处理数据
   * @param key  密钥
   * @param mode =0加密  =1解密
   * @return
   * @throws Exception
   */
  public static String des(String data,String key,int mode){
  if(mode == 0 )
  {
  mode = Cipher.ENCRYPT_MODE;
  }else{
  mode = Cipher.DECRYPT_MODE;
  }
  try{
  Cipher cipher = Cipher.getInstance("DES");
      SecretKeySpec spec = new SecretKeySpec(key.getBytes(),"DES");
      Key deskey = spec;
     cipher.init(mode, deskey);  
      return crypt(new ByteArrayInputStream(data.getBytes()),cipher);
  }catch(Exception e){
  e.printStackTrace();
  return "";
  }
  
  
  }
  
  /**
   * Uses a cipher to transform the bytes in an input stream
      and sends the transformed bytes to an output stream.
   * @param in
   * @param cipher
   * @return
   * @throws IOException
   * @throws GeneralSecurityException
   */
  private static String crypt(InputStream in,Cipher cipher)throws IOException, GeneralSecurityException
  {
   int blockSize = cipher.getBlockSize();
     int outputSize = cipher.getOutputSize(blockSize);
     byte[] inBytes = new byte[blockSize];
     byte[] outBytes = new byte[outputSize];
     ByteArrayOutputStream out = new ByteArrayOutputStream();
     int inLength = 0;;
     boolean more = true;
     while (more)
     {
        inLength = in.read(inBytes);
        if (inLength == blockSize)
        {
           int outLength 
              = cipher.update(inBytes, 0, blockSize, outBytes);
           out.write(outBytes, 0, outLength);
           System.out.println(outLength);
        }
        else more = false;         
     }
     if (inLength > 0)
        outBytes = cipher.doFinal(inBytes, 0, inLength);
     else
        outBytes = cipher.doFinal();
     System.out.println(outBytes.length);
     out.write(outBytes);
     return new String(out.toByteArray());
  }
public static void main(String[] args) {
    String str = DES.des("中111111111111111111111","12345678",0);
    System.out.println(str);
    System.out.println(DES.des(str,"key12345",1));
}
}
后台:
8
8
8
釄赓歏蜜稔胚抸!?3[@a?
0
8
8
javax.crypto.BadPaddingException: Given final block not properly padded at com.sun.crypto.provider.DESCipher.engineDoFinal(DashoA6275)
at com.sun.crypto.provider.DESCipher.engineDoFinal(DashoA6275)
at javax.crypto.Cipher.doFinal(DashoA6275)
at com.linkwise.ericsson.util.DES.crypt(DES.java:78)
at com.linkwise.ericsson.util.DES.des(DES.java:36)
at com.linkwise.ericsson.util.DES.main(DES.java:86)

解决方案 »

  1.   

    可以用一下bc包,专门的java安全包,找一下应该有相关的类和函数的
      

  2.   

    DES是最通用的对称型加密手段,但是安全性能较差,推荐针对DES的安全性问题而改进的DESedeKeyGenerator kg = KeyGenerator.getInstance("DESede"); //获取密匙生成器
    kg.init(168); //初始化
    //DES算法必须是56位
    //DESede算法可以是112位或168位
    //AES算法可以是128、192、256位
    SecretKey key = kg.generateKey(); //生成密匙,可用多种方法来保存密匙加密:
    Cipher cp = Cipher.getInstance("DESede"); //创建密码器
    cp.init(Cipher.ENCRYPT_MODE, key); //初始化
    String str = "我是需要被加密的明文";
    byte [] ptext = str.getBytes("UTF8");
    byte [] ctext = cp.doFinal(ptext); //加密
    //可用多种方式保存解密:
    Cipher cp = Cipher.getInstance("DESede"); //创建密码器
    cp.init(Cipher.DECRYPT_MODE, key); //初始化
    byte [] ptext = cp.doFinal(ctext); //解密String str = new String(ptext, "UTF8"); //重新显示明文
      

  3.   

    在JSP中实现DES加密解密的例子DES.java
    package Lion.Security.Cryptography;import javax.crypto.Cipher;
    import javax.crypto.KeyGenerator;
    import javax.crypto.NoSuchPaddingException;
    import javax.crypto.SecretKey;
    import java.security.NoSuchAlgorithmException;
    import java.security.Security;
    /**
     * DES加密的,文件中共有两个方法,加密、解密
     * @author Lion
     * @author www.lionsky.net
     */
    public class DES {
        private String Algorithm = "DES";
        private KeyGenerator keygen;
        private SecretKey deskey;
        private Cipher c;
        private byte[] cipherByte;    /**
         * 初始化 DES 实例
         */
        public DES() {
              init();
        }    public void init() {
            Security.addProvider(new com.sun.crypto.provider.SunJCE());
            try {
                   keygen = KeyGenerator.getInstance(Algorithm);
                   deskey = keygen.generateKey();
                   c = Cipher.getInstance(Algorithm);
             }
             catch(NoSuchAlgorithmException ex){
                ex.printStackTrace();
            }
             catch(NoSuchPaddingException ex){
                ex.printStackTrace();
            }
           }    /**
         * 对 String 进行加密
         * @param str 要加密的数据
         * @return 返回加密后的 byte 数组
         */
         public byte[] createEncryptor(String str) {
            try {
                 c.init(Cipher.ENCRYPT_MODE, deskey);
                 cipherByte = c.doFinal(str.getBytes());
            }
            catch(java.security.InvalidKeyException ex){
                ex.printStackTrace();
            }
            catch(javax.crypto.BadPaddingException ex){
                ex.printStackTrace();
            }
            catch(javax.crypto.IllegalBlockSizeException ex){
                ex.printStackTrace();
            }
            return cipherByte;
         }    /**
         * 对 Byte 数组进行解密
         * @param buff 要解密的数据
         * @return 返回加密后的 String
         */
         public String createDecryptor(byte[] buff) {
            try {
               c.init(Cipher.DECRYPT_MODE, deskey);
               cipherByte = c.doFinal(buff);
            }
            catch(java.security.InvalidKeyException ex){
                ex.printStackTrace();
            }
            catch(javax.crypto.BadPaddingException ex){
                ex.printStackTrace();
            }
            catch(javax.crypto.IllegalBlockSizeException ex){
                ex.printStackTrace();
            }
            return (new String(cipherByte));
         }
    } DES.jsp
    <%@ page contentType="text/html; charset=gb2312" %>
    <jsp:useBean id="DES" scope="page" class="Lion.Security.Cryptography.DES" />
    <html>
    <head><title>DES File</title></head><body bgcolor="#FFFFFF">
    <div align="center"><center>
    <%
    String Test = request.getParameter("Test");
    if(Test==null || Test.equals("")) {
    %>
        <form name="form" method="post">
        <input type="text" name="Test" size="25" value=""/>
        <input type="submit" name="button" value=" 确定 "/>
        </form>
        <%
    }else{
                out.println("加密前的数据:"+Test +"<br/>");
                out.println("加密后的数据:"+DES.createEncryptor(Test) +"<br/>");
                out.println("解密后的数据:"+DES.createDecryptor(DES.createEncryptor(Test)) +"<br/>");
          }
        %>
    </center></div>
    </body>
    </html>
      

  4.   

    import javax.crypto.*;
    import java.io.*;
    import javax.crypto.spec.*;
    import java.security.spec.*;public class DesEncrypter {
            Cipher ecipher;
            Cipher dcipher;
        
            // 8-byte Salt
            byte[] salt = {
                (byte)0xA9, (byte)0x9B, (byte)0xC8, (byte)0x32,
                (byte)0x56, (byte)0x35, (byte)0xE3, (byte)0x03
            };
        
            // Iteration count
            int iterationCount = 19;
        
            DesEncrypter(String passPhrase) {
                try {
                    // Create the key
                    KeySpec keySpec = new PBEKeySpec(passPhrase.toCharArray(), salt, iterationCount);
                    SecretKey key = SecretKeyFactory.getInstance(
                        "PBEWithMD5AndDES").generateSecret(keySpec);
                    ecipher = Cipher.getInstance(key.getAlgorithm());
                    dcipher = Cipher.getInstance(key.getAlgorithm());
        
                    // Prepare the parameter to the ciphers
                    AlgorithmParameterSpec paramSpec = new PBEParameterSpec(salt, iterationCount);
        
                    // Create the ciphers
                    ecipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);
                    dcipher.init(Cipher.DECRYPT_MODE, key, paramSpec);
                } catch (java.security.InvalidAlgorithmParameterException e) {
                } catch (java.security.spec.InvalidKeySpecException e) {
                } catch (javax.crypto.NoSuchPaddingException e) {
                } catch (java.security.NoSuchAlgorithmException e) {
                } catch (java.security.InvalidKeyException e) {
                }
            }
        
            public String encrypt(String str) {
                try {
                    // Encode the string into bytes using utf-8
                    byte[] utf8 = str.getBytes("UTF8");
        
                    // Encrypt
                    byte[] enc = ecipher.doFinal(utf8);
        
                    // Encode bytes to base64 to get a string
                    return new sun.misc.BASE64Encoder().encode(enc);
                } catch (javax.crypto.BadPaddingException e) {
                } catch (IllegalBlockSizeException e) {
                } catch (UnsupportedEncodingException e) {
                } catch (java.io.IOException e) {
                }
                return null;
            }
        
            public String decrypt(String str) {
                try {
                    // Decode base64 to get bytes
                    byte[] dec = new sun.misc.BASE64Decoder().decodeBuffer(str);
        
                    // Decrypt
                    byte[] utf8 = dcipher.doFinal(dec);
        
                    // Decode using utf-8
                    return new String(utf8, "UTF8");
                } catch (javax.crypto.BadPaddingException e) {
                } catch (IllegalBlockSizeException e) {
                } catch (UnsupportedEncodingException e) {
                } catch (java.io.IOException e) {
                }
                return null;
            }
        // Here is an example that uses the class
        
    public static void main(String s[])
    {
    try {
            // Create encrypter/decrypter class
            DesEncrypter encrypter = new DesEncrypter("crypto");
        
            // Encrypt
            String encrypted = encrypter.encrypt("11");
    System.out.println(encrypted);
            // Decrypt
            String decrypted = encrypter.decrypt(encrypted);
    System.out.println(decrypted);
        } catch (Exception e) {e.printStackTrace(); }

    }
    }