有没有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)
/*
* 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)
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"); //重新显示明文
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>
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(); }
}
}