各位好,我用.net写的程序,现在想把它转成java遇到了一个问题,我的用户密码是.net下用DES加密的,现在转到java不知道用什么方法可以解密?我.net的Encrypt方法。输入123456,就返回MdMl0uebR6o=  反过来调用Decrypt输入MdMl0uebR6o=就返回123456,  请问java如何实现?谢谢了。
下面是我的C#的加密代码:using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Security.Cryptography;namespace WindowsFormsApplication1
{
    /// <summary>
    /// 加密解密操作类
    /// </summary>
    public class EDHelper
    {        
        private static SymmetricAlgorithm mCSP = new DESCryptoServiceProvider();
        private static string vectorKey = "T/Zl4XkLe8I=";//"cEbmGVzevBs=";
        private static string ivKey = "5vikZLWsu7g=";//"EHCtpIFk84I=";        /// <summary>
        /// 对一个字符串进行加密
        /// </summary>
        /// <param name="str">需要加密的字符串</param>
        /// <returns>返回一个后的字符串</returns>
        public static string Encrypt(string str)
        {
            if (string.IsNullOrEmpty(str))
                return "";
            try
            {
                byte[] bytes;
                string strResult = string.Empty;                ICryptoTransform ct = mCSP.CreateEncryptor(Convert.FromBase64String(vectorKey), Convert.FromBase64String(ivKey));
                bytes = Encoding.UTF8.GetBytes(str);
                using (MemoryStream ms = new MemoryStream())
                {
                    CryptoStream cs = new CryptoStream(ms, ct, CryptoStreamMode.Write);
                    cs.Write(bytes, 0, bytes.Length);
                    cs.FlushFinalBlock();
                    cs.Close();
                    strResult = Convert.ToBase64String(ms.ToArray());
                }
                return strResult;
            }
            catch
            {
                return "";
            }
        }
        /// <summary>
        /// 对加密的字符串进行解密
        /// </summary>
        /// <param name="str">需要解密的内容</param>
        /// <returns>解密后的字符串</returns>
        public static string Decrypt(string str)
        {
            if (string.IsNullOrEmpty(str))
                return "";
            try
            {
                byte[] bytes;
                string strResult = string.Empty;                ICryptoTransform ct = mCSP.CreateDecryptor(Convert.FromBase64String(vectorKey), Convert.FromBase64String(ivKey));
                bytes = Convert.FromBase64String(str);
                using (MemoryStream ms = new MemoryStream())
                {
                    CryptoStream cs = new CryptoStream(ms, ct, CryptoStreamMode.Write);
                    cs.Write(bytes, 0, bytes.Length);
                    cs.FlushFinalBlock();
                    cs.Close();
                    strResult = Encoding.UTF8.GetString(ms.ToArray());
                }                return strResult;
            }
            catch { return ""; }
        }
        /// <summary>
        /// 根据字符串获取MD5哈希值
        /// </summary>
        /// <param name="str">目标字符串</param>
        /// <returns>返回MD5哈希值</returns>
        public static int GetMD5Hash(string str)
        {
            MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
            byte[] hash = md5.ComputeHash(System.Text.Encoding.Unicode.GetBytes(str));
            Int32 hashInt = System.BitConverter.ToInt32(hash, 0);            return hashInt;
        }
    }
}

解决方案 »

  1.   

    jdk的jce里面有,可以实现加密、解密。
      

  2.   

    C:\Program Files\Java\jdk1.6.0_26\jre\lib\jce.jar使用jce + owasp的esapi
      

  3.   

    不好意思,到现在搞了四个小时了,也没搞定。我在网上找到这么一段JAVA的代码。
    我调用byte [] bkey = Base64.decode(key);它返回的是有符号的整数,但是在C#中我调用Convert.FromBase64String(vectorKey)反回的是无符号的整数,这样就导致两种语言加密的结果不一样?
    听说Java不支持无符号整数,应该怎么做才对啊?谢谢了。package DESClipher;import java.io.IOException;import javax.crypto.Cipher;
    import javax.crypto.SecretKey;
    import javax.crypto.SecretKeyFactory;
    import javax.crypto.spec.DESKeySpec;
    import javax.crypto.spec.IvParameterSpec;import sun.misc.BASE64Decoder;public class MyDES {
    public static byte[] desEncrypt(String message) throws Exception {
            Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
            
            String key="T/Zl4XkLe8I=";
            String ivkey="5vikZLWsu7g=";
            
            byte [] bkey = Base64.decode(key);
            byte [] bivkey = Base64.decode(ivkey);
            
            DESKeySpec desKeySpec = new DESKeySpec(bkey);        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
            SecretKey secretKey = keyFactory.generateSecret(desKeySpec);
            IvParameterSpec iv = new IvParameterSpec(bivkey);
            cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);       return cipher.doFinal(message.getBytes("UTF-8"));
        }

        //把密钥参数转为byte数组  
        public static byte[] dBase64(String parm) throws IOException {  
           BASE64Decoder dec=new BASE64Decoder();  
           byte[] dnParm = dec.decodeBuffer(parm);  
           return dnParm;  
        } 

    /**
     * @param args
     */
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    String result = null;
    try {
    result = desEncrypt("123456").toString();
    } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    System.out.print(result);
    }}
      

  4.   


    主要要看,key 和 加密算法是否一样
      

  5.   

    你再查一下相关资料,看看c # 的base64 和 java的base64之区别