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

用C或delphi实现DES加密用JAVA不能解密,一个简单而又复杂的有关问题,

2012-02-04 
用C或delphi实现DES加密用JAVA不能解密,一个简单而又复杂的问题,高手请进!密钥:129**129明文:abcdc或delph

用C或delphi实现DES加密用JAVA不能解密,一个简单而又复杂的问题,高手请进!
密钥:129**129
明文:abcd
c或delphi的密文是一样的:CC500A00B887A418
Java的密文:9861945F94A2416F
这两个密文在各自的解密方法下都可以还原明文,就是不能互相还原,不知道问题在哪里??

附:

java的实现:
package   test;

/**
  *   <p> Title:   </p>
  *
  *   <p> Description:   </p>
  *
  *   <p> Copyright:   Copyright   (c)   2007 </p>
  *
  *   <p> Company:   </p>
  *
  *   @author   not   attributable
  *   @version   1.0
  */
import   java.security.*;
import   javax.crypto.Cipher;
import   javax.crypto.SecretKey;
import   javax.crypto.SecretKeyFactory;
import   javax.crypto.spec.DESKeySpec;

/**
  *   字符串工具集合
  *   @author   Liudong
  */
public   class   StringUtils   {

        private   static   final   String   PASSWORD_CRYPT_KEY   =   "128**128 ";
        private   final   static   String   DES   =   "DES ";

        /**
          *   加密
          *   @param   src   数据源
          *   @param   key   密钥,长度必须是8的倍数
          *   @return   返回加密后的数据
          *   @throws   Exception
          */
        public   static   byte[]   encrypt(byte[]   src,   byte[]   key)   throws   Exception   {
//DES算法要求有一个可信任的随机数源
                SecureRandom   sr   =   new   SecureRandom();
//   从原始密匙数据创建DESKeySpec对象
                DESKeySpec   dks   =   new   DESKeySpec(key);
//   创建一个密匙工厂,然后用它把DESKeySpec转换成
//   一个SecretKey对象
                SecretKeyFactory   keyFactory   =   SecretKeyFactory.getInstance(DES);
                SecretKey   securekey   =   keyFactory.generateSecret(dks);
//   Cipher对象实际完成加密操作
                Cipher   cipher   =   Cipher.getInstance(DES);
//   用密匙初始化Cipher对象
                cipher.init(Cipher.ENCRYPT_MODE,   securekey,   sr);
//   现在,获取数据并加密
//   正式执行加密操作
                return   cipher.doFinal(src);
        }

        /**
          *   解密
          *   @param   src   数据源
          *   @param   key   密钥,长度必须是8的倍数
          *   @return   返回解密后的原始数据
          *   @throws   Exception
          */
        public   static   byte[]   decrypt(byte[]   src,   byte[]   key)   throws   Exception   {
//   DES算法要求有一个可信任的随机数源


                SecureRandom   sr   =   new   SecureRandom();
//   从原始密匙数据创建一个DESKeySpec对象
                DESKeySpec   dks   =   new   DESKeySpec(key);
//   创建一个密匙工厂,然后用它把DESKeySpec对象转换成
//   一个SecretKey对象
                SecretKeyFactory   keyFactory   =   SecretKeyFactory.getInstance(DES);
                SecretKey   securekey   =   keyFactory.generateSecret(dks);
//   Cipher对象实际完成解密操作
                Cipher   cipher   =   Cipher.getInstance(DES);
//   用密匙初始化Cipher对象
                cipher.init(Cipher.DECRYPT_MODE,   securekey,   sr);
//   现在,获取数据并解密
//   正式执行解密操作
                return   cipher.doFinal(src);
        }

        /**
          *   密码解密
          *   @param   data
          *   @return
          *   @throws   Exception
          */
        public   final   static   String   decrypt(String   data)   {
                try   {
                        return   new   String(decrypt(hex2byte(data.getBytes()),
                                                                            PASSWORD_CRYPT_KEY.getBytes()));
                }   catch   (Exception   e)   {
                }
                return   null;
        }

        /**
          *   密码加密
          *   @param   password
          *   @return
          *   @throws   Exception
          */
        public   final   static   String   encrypt(String   password)   {
                try   {
                        return   byte2hex(encrypt(password.getBytes(),
                                                                        PASSWORD_CRYPT_KEY.getBytes()));
                }   catch   (Exception   e)   {
                }
                return   null;
        }
       


        /**  

                    *   二行制转字符串  

                    *   @param   b  

                    *   @return  

                    */  

                      public   static   String   byte2hex(byte[]   b)   {  

                                  String   hs   =   " ";  

                                  String   stmp   =   " ";  

                                  for   (int   n   =   0;   n   <   b.length;   n++)   {  
//                                           System.out.print(b[n]);
//                                           System.out.print( "@ ");
                                          stmp   =   (java.lang.Integer.toHexString(b[n]   &   0XFF));  
//                                           System.out.print(stmp);
//                                           System.out.print( "   ");
                                          if   (stmp.length()   ==   1)  

                                                  hs   =   hs   +   "0 "   +   stmp;  

                                          else  

                                                  hs   =   hs   +   stmp;  

                                  }  

                                  return   hs.toUpperCase();  

                        }  


                      public   static   byte[]   hex2byte(byte[]   b)   {  



                          if((b.length%2)!=0)  

                                throw   new   IllegalArgumentException( "长度不是偶数 ");  

                                  byte[]   b2   =   new   byte[b.length/2];  

                                  for   (int   n   =   0;   n   <   b.length;   n+=2)   {  

                                      String   item   =   new   String(b,n,2);  

                                      b2[n/2]   =   (byte)Integer.parseInt(item,16);  

                                  }  

                          return   b2;  
                }
              public   static   void   main(String[]   args)   {
                        String   es   =   "abcd ";
                        String   ds1=   StringUtils.encrypt(es);
                        System.out.println( "encrpt: "+   ds1);
                }
}

C的实现:


[解决办法]
算法不一样

java里面应该是用你输入的key再产生了一个key,然后用这个key加密
c里面的代码没有给出,我猜应该是直接用key加密的
而且用的des标准可能不是一样的
[解决办法]
DES应该是没有语言限制的
但是des加密有不同的模式~ecb、cbc

我觉得统一的des加密模式用c加密后 java可以实现解密

有人做过的吗?帮顶~
[解决办法]
private static final String PASSWORD_CRYPT_KEY = "128**128 ";

你这密解到底是129还是128?

热点排行
Bad Request.