代码是在网上找的,在本地加密解密一点问题都没有。但是到了linux suse10环境下,加密就出现了问题,同样的明文加密后得到的竟然完全不一样,貌似每次都是随即产生的。JDK是1.6的。在线求解答。 
代码如下: 
package com; 
import java.security.Key; 
import java.security.SecureRandom; 
import javax.crypto.Cipher; 
import javax.crypto.KeyGenerator; import sun.misc.BASE64Decoder; 
import sun.misc.BASE64Encoder; /** 

* 使用DES加密与解密,可对byte[],String类型进行加密与解密 密文可使用String,byte[]存储. 

* 方法: void getKey(String strKey)从strKey的字条生成一个Key 

* String getEncString(String strMing)对strMing进行加密,返回String密文 String 
* getDesString(String strMi)对strMin进行解密,返回String明文 

* byte[] getEncCode(byte[] byteS)byte[]型的加密 byte[] getDesCode(byte[] 
* byteD)byte[]型的解密 
*/ public class DesEncrypt 

Key key; /** 
* 根据参数生成KEY 

* @param strKey 
*/ 
public void getKey(String strKey) 

try 

KeyGenerator _generator = KeyGenerator.getInstance("DES"); 
_generator.init(new SecureRandom(strKey.getBytes())); 
this.key = _generator.generateKey(); 
_generator = null; 

catch (Exception e) 

e.printStackTrace(); 

} /** 
* 加密String明文输入,String密文输出 

* @param strMing 
* @return 
*/ 
public String getEncString(String strMing) 

byte[] byteMi = null; 
byte[] byteMing = null; 
String strMi = ""; 
BASE64Encoder base64en = new BASE64Encoder(); 
try 

byteMing = strMing.getBytes("UTF8"); 
byteMi = this.getEncCode(byteMing); 
strMi = base64en.encode(byteMi); 

catch (Exception e) 

e.printStackTrace(); 

finally 

base64en = null; 
byteMing = null; 
byteMi = null; 

return strMi; 
} /** 
* 解密 以String密文输入,String明文输出 

* @param strMi 
* @return 
*/ 
public String getDesString(String strMi) 

BASE64Decoder base64De = new BASE64Decoder(); 
byte[] byteMing = null; 
byte[] byteMi = null; 
String strMing = ""; 
try 

byteMi = base64De.decodeBuffer(strMi); 
byteMing = this.getDesCode(byteMi); 
strMing = new String(byteMing, "UTF8"); 

catch (Exception e) 

e.printStackTrace(); 

finally 

base64De = null; 
byteMing = null; 
byteMi = null; 

return strMing; 
} /** 
* 加密以byte[]明文输入,byte[]密文输出 

* @param byteS 
* @return 
*/ 
private byte[] getEncCode(byte[] byteS) 

byte[] byteFina = null; 
Cipher cipher; 
try 

cipher = Cipher.getInstance("DES"); 
cipher.init(Cipher.ENCRYPT_MODE, key); 
byteFina = cipher.doFinal(byteS); 

catch (Exception e) 

e.printStackTrace(); 

finally 

cipher = null; 

return byteFina; 
} /** 
* 解密以byte[]密文输入,以byte[]明文输出 

* @param byteD 
* @return 
*/ 
private byte[] getDesCode(byte[] byteD) 

Cipher cipher; 
byte[] byteFina = null; 
try 

cipher = Cipher.getInstance("DES"); 
cipher.init(Cipher.DECRYPT_MODE, key); 
byteFina = cipher.doFinal(byteD); 

catch (Exception e) 

e.printStackTrace(); 

finally 

cipher = null; 

return byteFina; } public static void main(String[] args) 

DesEncrypt des = new DesEncrypt();// 实例化一个对像 
des.getKey("aadd");// 生成密匙 String strEnc1 = des.getEncString("钟汉康");// 加密字符串,返回String的密文 
String strEnc2 = des.getEncString("钟汉康"); 
System.out.println(strEnc1); 
System.out.println(strEnc2); String strDes = des.getDesString(strEnc1);// 把String 类型的密文解密 
System.out.println(strDes); } } 

解决方案 »

  1.   

    linux下是不支持中文的不知道楼主涉及到中文没有
      

  2.   

    加密就出现了问题,同样的明文加密后得到的竟然完全不一样,貌似每次都是随即产生的
    貌似,是什么意思?看看你的密文,到底是不是随机的?
    DES加密的密文是一致的,不可能随便变化!
    我看:你的key,是随机生成的,密文肯定随机生成!SecureRandom........
    KeyGenerator _generator = KeyGenerator.getInstance("DES"); 
    _generator.init(new SecureRandom(strKey.getBytes())); 
    this.key = _generator.generateKey(); 
    一般的DES的key是8位,IV向量也是8位,如果固定key和IV,密文不可能发生变化!
      

  3.   


    建议对输入的密文进行字符编码判断,转换为UTF-8
    对于字符编码,Linux和Windows的标准是有一点偏差的.
    UTF-8是在位数,好像前面几位后面几位的空值不同.
    所以生成byte不同,密文当然不同.http://zh.wikipedia.org/wiki/UTF-8
      

  4.   

    补充一点就是:在jdk1.42环境下,一点没有问题,但是切换到了1.6后就出来了此问题,明文中不含中文的。
      

  5.   

    不会吧,高版本JDK会比低版本兼容性差、、