各位好,我用.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;
}
}
}
下面是我的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;
}
}
}
解决方案 »
- hibernate 出现的异常
- 懂 hibernate 的进……
- mysql数据库 IFNULL函数在hql中如何使用
- session问题,知道的大侠指导下 谢谢了
- jboss 部署本地EJB
- struts标签能做乘法运算么
- 请问:tomcat老出现这个错误Cannot get a connection, pool exhausted是怎么回事?
- websphere studio application development 的使用问题
- struts算j2ee的一部分吗?
- 项目中只有dispatcher-servlete 没有ApplicationContext.xml的项目单元测试要怎么写啊
- session验证码值到页面取不到
- 请问如何在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);
}}
主要要看,key 和 加密算法是否一样