加到300分,求在JAVA下的“PBEWithMD5AndDES”加密算法,到C#下如何实现?(三)
加到300分
输入字串:这是一个测试
输出字串:09IdjpQQAPgniEaO/skp9gy8+LkD42fZ
输入字串:123456
输出字串:OEnU8DEcgsE=
以下是JAVA的源代码,想求一下在C#使用哪种函数能实现同样的加密算法。
一、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
三、本帖
--------------------编程问答-------------------- 是我来错了吗?这里是.ner非技术区啊 --------------------编程问答-------------------- MD5加密?
//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);
}
}
System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(this.pwd.Text.Trim(), "MD5");--------------------编程问答-------------------- 帮顶. --------------------编程问答-------------------- md5加密 --------------------编程问答--------------------
如果是MD5,就不来劳烦各位了。
这个加密算法是可逆的,从这一点上就可以知道不是MD5了。
不过还是谢谢你的回答。
--------------------编程问答--------------------
身份证加密解密已经解决,请jshi123进来接分。
另密码加密与解密和问题是否也能帮解决一下,我另加100分。谢谢了。
功能是JAVA源码中的“decrypt”函数。
输入字串:123456
输出字串:OEnU8DEcgsE=
--------------------编程问答--------------------
using System;--------------------编程问答-------------------- 楼上的答案不太对呢。
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography;
namespace m5
{
public class MD5Class
{
#region MD5加密解密
//使用下边的加密规则字符串
//??b???W
static string key = "??b???W";
public MD5Class()
{
}
// 创建KEY
public string GenerateKey()
{
System.Security.Cryptography.DESCryptoServiceProvider desCrypto = (System.Security.Cryptography.DESCryptoServiceProvider)System.Security.Cryptography.DESCryptoServiceProvider.Create();
return ASCIIEncoding.ASCII.GetString(desCrypto.Key);
}
// MD5加密
//pToEncrypt为要加密的字符串
public string MD5Encrypt(string pToEncrypt)
{
string sKey = key;
System.Security.Cryptography.DESCryptoServiceProvider des = new System.Security.Cryptography.DESCryptoServiceProvider();
byte[] inputByteArray = System.Text.Encoding.Default.GetBytes(pToEncrypt);
des.Key = System.Text.ASCIIEncoding.ASCII.GetBytes(sKey);
des.IV = System.Text.ASCIIEncoding.ASCII.GetBytes(sKey);
System.IO.MemoryStream ms = new System.IO.MemoryStream();
System.Security.Cryptography.CryptoStream cs = new System.Security.Cryptography.CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
System.Text.StringBuilder ret = new System.Text.StringBuilder();
foreach (byte b in ms.ToArray())
{
ret.AppendFormat("{0:X2}", b);
}
ret.ToString();
return ret.ToString();
}
// MD5解密
//pToDecrypt为要解密的字符串
public string MD5Decrypt(string pToDecrypt)
{
string sKey = key;
System.Security.Cryptography.DESCryptoServiceProvider des = new System.Security.Cryptography.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 = System.Text.ASCIIEncoding.ASCII.GetBytes(sKey);
des.IV = System.Text.ASCIIEncoding.ASCII.GetBytes(sKey);
System.IO.MemoryStream ms = new System.IO.MemoryStream();
System.Security.Cryptography.CryptoStream cs = new System.Security.Cryptography.CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
System.Text.StringBuilder ret = new System.Text.StringBuilder();
return System.Text.Encoding.Default.GetString(ms.ToArray());
}
#endregion
}
}
正确答案jshi123已经给了,请这位朋友进来接分。
下面朋友就不用再回复了。谢谢支持。
--------------------编程问答-------------------- 这里发言,表示您接受了CSDN社区的用户行为准则。
补充:.NET技术 , 非技术区