以下是JAVA的源代码,小弟想转到C#上实现,但尝试多日一直无进展。是否有哪位大侠能够出手相助,万分感谢。PS:加密结果,可见程序后部的演示。//07
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.PBEParameterSpec;//09
import java.security.MessageDigest;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.IvParameterSpec;//BASE64
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;public class pubwin2009
{ // key1 姓名身份证加解密 07/09 
 public static String Rcode(String message,int type)throws Exception
    {
//String Key="123!@#qweQWE/.,?><abc"; //07
String Key="q1!2@3#we>WacE/.Q,?<b"; //09
byte _fldint[] = { -87, -101, -56, 50, 86, 53, -29, 3};
byte bytesrc[]; 
if (type==1)
bytesrc =message.getBytes("UTF8");
else
bytesrc =(new BASE64Decoder()).decodeBuffer(message);
PBEParameterSpec pbeparameterspec = new PBEParameterSpec(_fldint,19);
PBEKeySpec pbekeyspec = new PBEKeySpec(Key.toCharArray());
SecretKeyFactory secretkeyfactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES");
javax.crypto.SecretKey secretkey = secretkeyfactory.generateSecret(pbekeyspec);
Cipher cipher = Cipher.getInstance("PBEWithMD5AndDES");
cipher.init(type, secretkey, pbeparameterspec);
byte[] retByte = cipher.doFinal(bytesrc); 
if (type==1)
return new BASE64Encoder().encode(retByte);
else
return new String(retByte,"UTF8");
   
    }
//09会员密码 db.properties 加解密
    public static String decrypt(String message,int type) throws Exception {   
String keye = "hi%$so78"; //MD5
String keyb = "12up56^&"; //IvParameterSpec
byte bytesrc[]; 
if (type==1)
bytesrc =message.getBytes();
else
bytesrc =(new BASE64Decoder()).decodeBuffer(message);
MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update(keye.getBytes());
DESKeySpec desKeySpec = new DESKeySpec(md5.digest()); 
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");      
SecretKey secretKey = keyFactory.generateSecret(desKeySpec);   
IvParameterSpec iv  = new IvParameterSpec(keyb.getBytes("UTF-8"));
Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");  
cipher.init(type, secretKey, iv);         
byte[] retByte = cipher.doFinal(bytesrc); 
if (type==1)
return new BASE64Encoder().encode(retByte);
else
return new String(retByte);
    } 

    public static void main(String args[]) throws Exception 
    {
System.out.println( "\n姓名身份证加密:这是一个测试 -> " +Rcode("这是一个测试",1));
System.out.println( "姓名身份证解密:09IdjpQQAPgniEaO/skp9gy8+LkD42fZ -> " +Rcode("09IdjpQQAPgniEaO/skp9gy8+LkD42fZ",2)+"\n"); System.out.println( "09会员密码加解:123456 -> " +decrypt("123456",1));
System.out.println( "09会员密码解密:OEnU8DEcgsE= -> " +decrypt("OEnU8DEcgsE=",2)); System.exit(0);
}}

解决方案 »

  1.   

    PBES1 Password-Based Encryption (PBE)
    http://www.example-code.com/csharp/crypt2_pbes1.asp
    这个可以用吗?
      

  2.   

    Emulating PBEWithMD5AndDES Encryption under .NET
    http://www.codeproject.com/Articles/16450/Emulating-PBEWithMD5AndDES-Encryption-under-NET
    这篇更多胃口
      

  3.   

    using System.Security.Cryptography;
    using    System.IO;  
    using    System.Text; ///MD5加密
      public string MD5Encrypt(string    pToEncrypt,  string    sKey)
        {  
         DESCryptoServiceProvider    des  =  new    DESCryptoServiceProvider();  
       byte[]    inputByteArray  =    Encoding.Default.GetBytes(pToEncrypt);  
         des.Key  =    ASCIIEncoding.ASCII.GetBytes(sKey);  
         des.IV  =    ASCIIEncoding.ASCII.GetBytes(sKey);  
         MemoryStream    ms  =  new    MemoryStream();  
         CryptoStream    cs  =  new    CryptoStream(ms,    des.CreateEncryptor(),CryptoStreamMode.Write);  
         cs.Write(inputByteArray,  0,    inputByteArray.Length);  
         cs.FlushFinalBlock();  
         StringBuilder    ret  =  new    StringBuilder();  
       foreach(byte    b  in    ms.ToArray())  
         {  
          ret.AppendFormat("{0:X2}",    b);  
         }  
         ret.ToString();  
       return    ret.ToString();  
        }  ///MD5解密
      public string MD5Decrypt(string    pToDecrypt,  string    sKey)
        { 
         DESCryptoServiceProvider    des  =  new    DESCryptoServiceProvider();     byte[]    inputByteArray  =  new  byte[pToDecrypt.Length  /  2];  
       for(int    x  =  0;    x  <    pToDecrypt.Length  /  2;    x++)  
         {  
        int    i  =    (Convert.ToInt32(pToDecrypt.Substring(x  *  2,  2),  16));  
          inputByteArray[x]  =    (byte)i;  
         }       des.Key  =    ASCIIEncoding.ASCII.GetBytes(sKey);  
         des.IV  =    ASCIIEncoding.ASCII.GetBytes(sKey);  
         MemoryStream    ms  =  new    MemoryStream();  
         CryptoStream    cs  =  new    CryptoStream(ms,    des.CreateDecryptor(),CryptoStreamMode.Write);  
         cs.Write(inputByteArray,  0,    inputByteArray.Length);  
         cs.FlushFinalBlock();       StringBuilder    ret  =  new    StringBuilder();  
                 
       return    System.Text.Encoding.Default.GetString(ms.ToArray());  
        }
    -------------------------------------------------------------------------------
      

  4.   

    using System;
    using System.Text;
    using System.Globalization;
    using System.Security.Cryptography;
    class DES
    {
    // 创建Key
    public string GenerateKey()
    {
    DESCryptoServiceProvider desCrypto = (DESCryptoServiceProvider)DESCryptoServiceProvider.Create();
    return ASCIIEncoding.ASCII.GetString(desCrypto.Key);
    }
    // 加密字符串
    public string EncryptString(string sInputString, string sKey)
    {
    byte [] data = Encoding.UTF8.GetBytes(sInputString);
    DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
    DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
    DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
    ICryptoTransform desencrypt = DES.CreateEncryptor();
    byte [] result = desencrypt.TransformFinalBlock(data, 0, data.Length);
    return BitConverter.ToString(result);
    }
    // 解密字符串
    public string DecryptString(string sInputString, string sKey)
    {
    string [] sInput = sInputString.Split("-".ToCharArray());
    byte [] data = new byte[sInput.Length];
    for(int i = 0; i < sInput.Length; i++)
    {
    data[i] = byte.Parse(sInput[i], NumberStyles.HexNumber);
    }
    DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
    DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
    DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
    ICryptoTransform desencrypt = DES.CreateDecryptor();
    byte [] result = desencrypt.TransformFinalBlock(data, 0, data.Length);
    return Encoding.UTF8.GetString(result);
    }
    }
    class Test
    {
    static void Main()
    {
    DES des = new DES();
    string key = des.GenerateKey();
    string s0 = "中国软件 - csdn.net";
    string s1 = des.EncryptString(s0, key);
    string s2 = des.DecryptString(s1, key);
    Console.WriteLine("原串: [{0}]", s0);
    Console.WriteLine("加密: [{0}]", s1);
    Console.WriteLine("解密: [{0}]", s2);
    }
    }
    /* 程序输出:
    原串: [源码的世界-xxx]
    加密: [E8-30-D0-F2-2F-66-52-14-45-9A-DC-C5-85-E7-62-9B-AD-B7-82-CF-A8-0A-59-77]
    解密: [源码的世界-xxx]
    */
    xxx  是我的名字省略了。
      

  5.   


    这篇我早先看过,但对应着把几个KEY填入后,得到的结果却不一样。感觉主要原来还是对加密的原理不了解。但目前项目比较急,也无法细细专研这个了。不知道能否有哪个了解PEB加密的朋友,能帮解决一下。谢谢了。分数加到300分。一、http://topic.csdn.net/u/20120212/20/077d891b-d861-417d-8df0-aa973eb46bbf.html二、http://topic.csdn.net/u/20120214/23/bdc9f555-30c9-4534-bca6-e6b69000a4fe.html三、http://topic.csdn.net/u/20120214/23/85f15b10-3786-4c16-a175-d7269196260a.html谢谢。
      

  6.   


    身份证加密解密已经解决,请jshi123进来接分。
    另密码加密与解密和问题是否也能帮解决一下,我另加100分。谢谢了。
    功能是JAVA源码中的“decrypt”函数。输入字串:123456
    输出字串:OEnU8DEcgsE=
      

  7.   

    第二个方法就是普通的DES加解密 static void Main(string[] args)
    {
    Console.WriteLine("09会员密码加解:123456 -> " + decrypt("123456", 1));
    Console.WriteLine("09会员密码解密:OEnU8DEcgsE= -> " + decrypt("OEnU8DEcgsE=", 2));
    } public static String decrypt(String message, int type)
    {
    String key = "hi%$so78";  //密码
    string iv = "12up56^&"; // 初始向量 DES des = new DESCryptoServiceProvider();
    des.Mode = CipherMode.CBC;
    des.Padding = PaddingMode.PKCS7;
    byte[] md5 = MD5.Create().ComputeHash(Encoding.UTF8.GetBytes(key));
    des.Key = md5.Take(8).ToArray();
    des.IV = Encoding.UTF8.GetBytes(iv); if (type == 1)
    {
    byte[] bytes = Encoding.UTF8.GetBytes(message);
    byte[] result = des.CreateEncryptor().TransformFinalBlock(bytes, 0, bytes.Length);
    return Convert.ToBase64String(result);
    }
    else
    {
    byte[] bytes = Convert.FromBase64String(message);
    byte[] result = des.CreateDecryptor().TransformFinalBlock(bytes, 0, bytes.Length);
    return Encoding.UTF8.GetString(result);
    }
    }
      

  8.   

    楼主您好!我也遇到了和您同样的问题,能否指点一二?谢谢![email protected]