最近一直烦恼,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# RSA加密与JAVA解密,实现相互通信"的主题聚焦于如何利用RSA公钥/私钥加密算法在C#和Java两个不同的编程环境中实现安全的数据交换。RSA是一种非对称加密算法,它使用一对密钥——公钥和私钥,公钥用于加密,私钥...
C#加密和解密C#加密和解密C#加密和解密C#加密和解密
在这个示例中,"RSA加密"的压缩包可能包含了Java和C#的完整源代码,用于演示如何在两者之间实现RSA公钥加密和私钥解密的过程。开发者可以通过运行这些示例代码,理解并应用RSA加密解密技术到自己的项目中。
解密过程与加密相反: 1. 用同样的方式实例化`RSACryptoServiceProvider`,但这次可以导入之前导出的公钥或私钥参数。 2. 使用`Decrypt()`方法,传入加密后的数据(Base64解码)和相同的填充模式标志。 3. 解密后...
在IT领域,加密和解密是确保数据安全的重要手段,特别是在跨平台的环境中,如Java和C#之间进行数据交换时。AES(Advanced Encryption Standard),即高级加密标准,是一种广泛使用的对称加密算法,适用于保护敏感...
在IT领域,加密和解密是信息安全的重要组成部分,特别是在C#编程环境中,开发相关的加密解密功能对于数据保护至关重要。本文将围绕"C#加密解密源码"这一主题,深入探讨C#中加密解密的基本原理、常用算法以及如何通过...
### RSA加密算法实现以及C#与Java互通加解密 #### 一、RSA算法简介 RSA算法是一种非对称加密算法,由Ron Rivest、Adi Shamir 和 Leonard Adleman 在1977年提出,并以其三人的名字首字母命名。RSA算法的安全性基于...
C#作为一种强大的面向对象的编程语言,提供了丰富的库和工具来实现文件的加密和解密。本项目"文件加密解密(完整项目)"专注于利用C#进行文件的安全处理,确保数据在传输和存储时的隐私性。 一、C#加密技术基础 C#...
本案例聚焦于"C#与Java平台RSA加密解密签名验签互通"的问题,这涉及到两个主要的技术点:RSA加密算法和跨平台兼容性。下面将详细阐述这两个知识点。 首先,RSA是一种非对称加密算法,由Ron Rivest、Adi Shamir和...
标题中的"C++/java/C#语言的AES加密解密"涉及到的是三种常用编程语言——C++、Java和C#在实现AES(Advanced Encryption Standard,高级加密标准)算法上的应用。AES是一种广泛使用的对称加密算法,它在信息安全领域...
本主题主要探讨的是如何使用C#实现加密和解密操作,以便与Java应用程序进行无缝对接,特别是使用AES/CBC/PKCS7Padding算法,并将结果转换为16进制表示。下面将详细阐述相关知识点。 **AES(Advanced Encryption ...
C#和Java中都有内置的类库支持RSA加密,如C#的System.Security.Cryptography.RSACryptoServiceProvider和Java的java.security.KeyPairGenerator与java.security.Signature等。 接下来,我们讨论DES(Data ...
### Java与C#中的DES加密解密技术 #### 一、概述 在现代软件开发中,数据的安全性至关重要。为了确保数据在传输过程中的安全,加密技术被广泛应用。其中,数据加密标准(Data Encryption Standard,简称DES)是一...
DES加密方法JAVA和C#交叉加密解密代码
* RSA加密解密:私钥解密,公钥加密。 * RSA数字签名-俗称加签验签:私钥加签,公钥验签。 * RSA加密解密:私钥解密,公钥加密。 * RSA数字签名-俗称加签验签:私钥加签,公钥验签。 * RSA加密解密:私钥...
操作步骤与上述相反,使用私钥进行加密,公钥进行解密。 5. **注意事项**: - 加解密的数据长度受限于RSA密钥的大小,通常为密钥长度减去11位。因此,如果需要加密大量数据,通常会采用一种称为“密钥交换”的方式...
DES加密/解密类。 加密 加密数据 解密 解密数据 得到随机安全码(哈希加密)。 得到随机哈希加密字符串 哈希加密一个字符串 RSA加密解密及RSA签名和验证 RSA 的密钥产生 产生私钥 和公钥 RSA 方式加密 RSA的解密...
带加密字符的 加密 解密方法 static string encryptKey = "加密字符"; 自定义加密字符(加密解密必须一致才能解密) /// /// 加密字符串 /// /// name="str">要加密的字符串 /// 加密后的...
C#编写的加密解密小工具,可以对DES、RSA、Base64、SHA、MD5算法,轻松实现数据加密解密需求。 使用方法可浏览博文《C#集成数据加密算法,包含DES、RSA、Base64、SHA、MD5算法,轻松实现数据加密解密需求》
Java的解密过程与C#中的加密过程相反,首先设置相同的密钥和初始化向量,然后创建解密器,并将加密后的字节流转回原始字符串。以下是Java解密的伪代码: ```java import javax.crypto.Cipher; import javax.crypto....