首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

那位指点下DES加密解密有关问题

2012-01-06 
那位指点下DES加密解密问题问题出在解密上demo加密完后返回[B@d80be3再解密返回不了demo字符串请教代码可

那位指点下DES加密解密问题
问题出在解密上   demo   加密完后返回[B@d80be3   再解密返回不了demo字符串
请教   代码可以直接运行

package   des;

import   java.security.SecureRandom;
import   javax.crypto.spec.DESKeySpec;
import   javax.crypto.KeyGenerator;
import   javax.crypto.SecretKeyFactory;
import   javax.crypto.SecretKey;
import   javax.crypto.Cipher;
import   java.security.NoSuchAlgorithmException;

public   class   TestDes   {
    /**
      *
      *   @return   DES算法密钥
      */
    public   static   byte[]   generateKey()   {
        try   {

            //   DES算法要求有一个可信任的随机数源
            SecureRandom   sr   =   new   SecureRandom();

            //   生成一个DES算法的KeyGenerator对象
            KeyGenerator   kg   =   KeyGenerator.getInstance( "DES ");
            kg.init(sr);

            //   生成密钥
            SecretKey   secretKey   =   kg.generateKey();

            //   获取密钥数据
            byte[]   key   =   secretKey.getEncoded();

            return   key;
        }
        catch   (NoSuchAlgorithmException   e)   {
            System.err.println( "DES算法,生成密钥出错! ");
            e.printStackTrace();
        }

        return   null;
    }

    /**
      *   加密函数
      *
      *   @param   data
      *                         加密数据
      *   @param   key
      *                         密钥
      *   @return   返回加密后的数据
      */
    public   static   byte[]   encrypt(byte[]   data,   byte[]   key)   {

        try   {

            //   DES算法要求有一个可信任的随机数源
            SecureRandom   sr   =   new   SecureRandom();

            //   从原始密钥数据创建DESKeySpec对象
            DESKeySpec   dks   =   new   DESKeySpec(key);

            //   创建一个密匙工厂,然后用它把DESKeySpec转换成
            //   一个SecretKey对象
            SecretKeyFactory   keyFactory   =   SecretKeyFactory.getInstance( "DES ");
            SecretKey   secretKey   =   keyFactory.generateSecret(dks);

            //   Cipher对象实际完成加密操作
            Cipher   cipher   =   Cipher.getInstance( "DES ");



            //   用密匙初始化Cipher对象
            cipher.init(Cipher.ENCRYPT_MODE,   secretKey);

            //   执行加密操作
            byte   encryptedData[]   =   cipher.doFinal(data);

            return   encryptedData;
        }
        catch   (Exception   e)   {
            System.err.println( "DES算法,加密数据出错! ");
            e.printStackTrace();
        }

        return   null;
    }

    /**
      *   解密函数
      *
      *   @param   data
      *                         解密数据
      *   @param   key
      *                         密钥
      *   @return   返回解密后的数据
      */
    public   static   byte[]   decrypt(byte[]   data,   byte[]   key)   {
        try   {
            //   DES算法要求有一个可信任的随机数源
            SecureRandom   sr   =   new   SecureRandom();

            //   byte   rawKeyData[]   =   /*   用某种方法获取原始密匙数据   */;

            //   从原始密匙数据创建一个DESKeySpec对象
            DESKeySpec   dks   =   new   DESKeySpec(key);

            //   创建一个密匙工厂,然后用它把DESKeySpec对象转换成
            //   一个SecretKey对象
            SecretKeyFactory   keyFactory   =   SecretKeyFactory.getInstance( "DES ");
            SecretKey   secretKey   =   keyFactory.generateSecret(dks);

            //   Cipher对象实际完成解密操作
            Cipher   cipher   =   Cipher.getInstance( "DES ");

            //   用密匙初始化Cipher对象
            cipher.init(Cipher.DECRYPT_MODE,   secretKey);

            //   现在,获取数据并解密
            //   byte   encryptedData[]   =   /*   获得经过加密的数据   */

            //   正式执行解密操作
            byte   decryptedData[]   =   cipher.doFinal(data);

            return   decryptedData;
        }
        catch   (Exception   e)   {
            System.err.println( "DES算法,解密出错。 ");
            e.printStackTrace();
        }

        return   null;
    }



    public   static   void   main(String[]   args)   {
        String   keyStr   =   "123AB78DE675AF ";
        TestDes   DES   =   new   TestDes();
        try   {
            byte[]   key   =   keyStr.getBytes();
            System.out.println( "key:   "   +   key);

            byte[]   data   =   DES.encrypt( "demo ".getBytes(),   key);
            System.out.println( "加密后的字符串:   "   +   data);
            //System.out.print( "key:   "+key);
            byte[]   data2   =   DES.decrypt(DES.encrypt( "demo ".getBytes(),   key),   key);
            System.out.println( "解密后的字符串:   "   +   data2);
            //System.out.println(new   String(DES.decrypt(data,   key)));
        }
        catch   (Exception   e)   {
            e.printStackTrace();
        }
    }

}


[解决办法]


System.out.println( "解密后的字符串: " + data2);
什么意思呢?
相当于
System.out.println( "解密后的字符串: " + data2.toString());

data2是byte[],本身是一个Object数组
它和new String(data2)不一样。

看看System.out.println( "解密后的字符串: " + new String(data2));

热点排行