最近一直烦恼,java , c# 加密的不同,然后整理了一下,留个备份的轮子:
其中在 java、c#加密转换时,最重要的是 IV 的确定,我常常用如下方法使得java和c#之间的 IV 可以转换:
将其中某个 IV 数组转为 10进制后,在转换为相应的 byte数组就好了。10进制数组成为 java、c# 中IV转换的桥梁了。最后分别有java(我用myeclipse)和c#的编译器(SharpDevelop2很轻量级的编译器,但是运行代码后需要在后面写上 "Console.ReadLine(); " ,不然dos框会一闪而过。这个编译器还需要系统中安装有.net 2.0或者其他版本)多多实践,这样可以更加直接的看到结果。 下面实例中java与c#的代码都是一一对应的:当然,这些加密算法并不适合所有的加密结构,但是重要的是 IV 、key 的格式化。 网上查了资料,找到java转换为16进制的方法(已测)
// java格式化16进制输出
public static void formatIntTo16(byte[] bytes) {
String[] resultBytes = new String[bytes.length];
for (int i = 0; i < bytes.length; i++) {
resultBytes[i] = Integer.toHexString(bytes[i] & 0xFF);
}
}
//MD5加密
public static String md5Encode(String strContent) {
try {
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
byte[] tempBytes = messageDigest.digest(strContent.getBytes("UnicodeLittleUnmarked"));
StringBuffer stringBuffer = new StringBuffer();
for(byte bytes: tempBytes) {
String tempByte = Integer.toHexString(bytes & 0xFF);
if(tempByte.length() == 1) {
stringBuffer.append("0");
}
stringBuffer.append(tempByte);
}
return stringBuffer.toString();
} catch(Exception e) {
e.printStackTrace();
}
return null;
}
//md5加密
public static void MD5(string str) {
string cl1 = str;
string pwd = "";
System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create();
byte[] s = md5.ComputeHash(Encoding.Unicode.GetBytes(cl1));
for (int i = 0; i < s.Length; i++) {
pwd = pwd + s[i].ToString("x");
}
Console.Write(pwd);
Console.WriteLine();
}
// 3DES加密 基方法
public static byte[] des3EncodeCBC(byte[] data, byte[] key) throws Exception {
Key deskey = null;
DESedeKeySpec spec = new DESedeKeySpec(key);
SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede");
deskey = keyfactory.generateSecret(spec);
Cipher cipher = Cipher.getInstance("desede" + "/CBC/PKCS5Padding");
IvParameterSpec ips = new IvParameterSpec(IV);
cipher.init(Cipher.ENCRYPT_MODE, deskey, ips);
return cipher.doFinal(data, 0, data.length);
}
// 3DES加密算法
private static bool Encrypt( byte[] key, byte[] input, out byte[] output )
{
output = null;
try
{
TripleDESCryptoServiceProvider trippleDesProvider = new TripleDESCryptoServiceProvider();
ICryptoTransform encryptObj = trippleDesProvider.CreateEncryptor(rkey, IV);
output = encryptObj.TransformFinalBlock(input, 0, input.Length);
trippleDesProvider.Clear();
}
catch (Exception)
{
return false;
}
return true;
}
// 3DES 解密 基方法
public static byte[] des3DecodeCBC(byte[] data, byte[] key) throws Exception {
Key deskey = null;
DESedeKeySpec spec = new DESedeKeySpec(key);
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("desede");
deskey = keyFactory.generateSecret(spec);
Cipher cipher = Cipher.getInstance("desede" + "/CBC/PKCS5Padding");
IvParameterSpec ips = new IvParameterSpec(IV);
cipher.init(Cipher.DECRYPT_MODE, deskey, ips);
return cipher.doFinal(data, 0, data.length);
}
// 3DES 解密 基方法
private static bool Decrypt(byte[] key, byte[] input, out byte[] output)
{
output = null;
try
{
TripleDESCryptoServiceProvider trippleDesProvider = new TripleDESCryptoServiceProvider();
ICryptoTransform decryptObj = trippleDesProvider.CreateDecryptor(key, IV);
output = decryptObj.TransformFinalBlock(input, 0, input.Length);
trippleDesProvider.Clear();
}
catch (Exception ex)
{
return false;
}
return true;
}
//DES加密
public static String encode(byte[] key, byte[] iv, byte[] data) throws Exception {
Key deskey = null;
DESKeySpec spec = new DESKeySpec(key);
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
deskey = keyFactory.generateSecret(spec);
IvParameterSpec ips = new IvParameterSpec(iv);
Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, deskey, ips);
return new BASE64Encoder().encode(cipher.doFinal(data, 0, data.length));
}
//DES加密
public static string DESEncode(string encryptString, string encryptKey) {
byte[] rgbKey = Encoding.UTF8.GetBytes(encryptKey.Substring(0, 8));
byte[] rgbIV = DESKeys;
byte[] inputByteArray = Encoding.UTF8.GetBytes(encryptString);
DESCryptoServiceProvider dCSP = new DESCryptoServiceProvider();
MemoryStream mStream = new MemoryStream();
CryptoStream cStream = new CryptoStream(mStream, dCSP.CreateEncryptor(rgbKey, rgbIV),
CryptoStreamMode.Write);
cStream.Write(inputByteArray, 0, inputByteArray.Length);
cStream.FlushFinalBlock();
return Convert.ToBase64String(mStream.ToArray());
}
分享到:
相关推荐
c#加密解密c#加密解密c#加密解密c#加密解密c#加密解密c#加密解密c#加密解密c#加密解密
java c# 加密解密
C#RSA加密与JAVA解密,实现相互通信,对字符进行加密,java解密,对密文字节进行编码
C#加密和解密C#加密和解密C#加密和解密C#加密和解密
可以直接运行成功的RSA加密解密示例 JAVA端采用公钥加密,服务端C#采用私钥解密。
用c#做的加密解密的小软件,可以实现对文本的加密解密。
C#加密 解密对接java 的加密AES/CBC/PKCS7Padding 转16进制 C#加密解密中的详细整理
RSA加密算法实现以及C#与java互通加解密,解决RSA算法在java与C#相互通用
C#做的RSA加密解密, 带winform界面, 测试通过, 代码完整。
DES加密方法JAVA和C#交叉加密解密代码
c#加密解密加密解密加密解密加密解密加密解密c#加密解密加密解密加密解密加密解密加密解密
C#通过des对文件进行加密,java通过密钥对C#加密的文件进行解密
c# ras 加密解密 代码例子
* RSA加密解密:私钥解密,公钥加密。 * RSA数字签名-俗称加签验签:私钥加签,公钥验签。 * RSA加密解密:私钥解密,公钥加密。 * RSA数字签名-俗称加签验签:私钥加签,公钥验签。 * RSA加密解密:私钥...
带加密字符的 加密 解密方法 static string encryptKey = "加密字符"; 自定义加密字符(加密解密必须一致才能解密) /// /// 加密字符串 /// /// name="str">要加密的字符串 /// 加密后的...
C#与java平台RSA加密解密签名验签互通案例,解决RSA在C#与java加密算法不同导致验签不过情况
C#加密与解密,对数据的加密与解密,安全
c# 和 c++ 通用加密解密 。有c#和c++的例子代码。亲测可用 c# 和 c++ 通用加密解密 。有c#和c++的例子代码。亲测可用 c# 和 c++ 通用加密解密 。有c#和c++的例子代码。亲测可用 c# 和 c++ 通用加密解密 。有c#和c++...
这是C#的几种加密和解密的方法,里面包含Base64的加密和解密,MD5的加密,SHA1的加密和解密,文件夹的加密和解密
c# 使用DidiSoft.Pgp来实现对文件的GPG 加密与解密 。GPG非对称加密需要公钥和私钥 :你的公钥的作用 :别人用来给你发加密的信息&别人验证你的签名,即加密&验证(别人来做) 你的私钥的作用 :你用来创建签名&...