java c# 加密与解密对照

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java c# 加密与解密对照相关的知识,希望对你有一定的参考价值。

原文 java c# 加密与解密对照

最近一直烦恼,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代码  技术分享
  1. // java格式化16进制输出  
  2. public static void formatIntTo16(byte[] bytes) {  
  3.     String[] resultBytes = new String[bytes.length];  
  4.     for (int i = 0; i < bytes.length; i++) {  
  5.         resultBytes[i] = Integer.toHexString(bytes[i] & 0xFF);  
  6.     }  
  7. }  




Java代码  技术分享
  1. //MD5加密  
  2.  public static String md5Encode(String strContent) {  
  3.     try {  
  4.         MessageDigest messageDigest = MessageDigest.getInstance("MD5");  
  5.         byte[] tempBytes =  messageDigest.digest(strContent.getBytes("UnicodeLittleUnmarked"));  
  6.         StringBuffer stringBuffer = new StringBuffer();  
  7.         for(byte bytes: tempBytes) {  
  8.             String tempByte = Integer.toHexString(bytes & 0xFF);  
  9.             if(tempByte.length() == 1) {  
  10.                 stringBuffer.append("0");  
  11.             }  
  12.             stringBuffer.append(tempByte);  
  13.         }  
  14.         return stringBuffer.toString();  
  15.     } catch(Exception e) {  
  16.         e.printStackTrace();  
  17.     }  
  18.     return null;  
  19.  }   



C#代码  技术分享
  1. //md5加密  
  2.     public static void MD5(string str) {  
  3.         string cl1 = str;  
  4.         string pwd = "";  
  5.         System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create();  
  6.         byte[] s = md5.ComputeHash(Encoding.Unicode.GetBytes(cl1));  
  7.         for (int i = 0; i < s.Length; i++) {  
  8.             pwd = pwd + s[i].ToString("x");  
  9.         }  
  10.         Console.Write(pwd);  
  11.         Console.WriteLine();  
  12.     }  



Java代码  技术分享
  1. // 3DES加密 基方法  
  2.     public static byte[] des3EncodeCBC(byte[] data, byte[] key) throws Exception {  
  3.   
  4.         Key deskey = null;  
  5.         DESedeKeySpec spec = new DESedeKeySpec(key);  
  6.         SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede");  
  7.         deskey = keyfactory.generateSecret(spec);  
  8.   
  9.         Cipher cipher = Cipher.getInstance("desede" + "/CBC/PKCS5Padding");  
  10.         IvParameterSpec ips = new IvParameterSpec(IV);  
  11.         cipher.init(Cipher.ENCRYPT_MODE, deskey, ips);  
  12.         return cipher.doFinal(data, 0, data.length);  
  13.   
  14.     }  


C#代码  技术分享
  1. // 3DES加密算法  
  2.     private static bool Encrypt( byte[] key, byte[] input, out byte[] output )  
  3.         {  
  4.             output = null;  
  5.   
  6.             try  
  7.             {  
  8.                 TripleDESCryptoServiceProvider trippleDesProvider = new TripleDESCryptoServiceProvider();  
  9.                 ICryptoTransform encryptObj = trippleDesProvider.CreateEncryptor(rkey, IV);  
  10.                 output = encryptObj.TransformFinalBlock(input, 0, input.Length);  
  11.                 trippleDesProvider.Clear();  
  12.             }  
  13.             catch (Exception)  
  14.             {  
  15.                 return false;  
  16.             }  
  17.   
  18.             return true;  
  19.         }  


Java代码  技术分享
  1. // 3DES 解密 基方法  
  2.     public static byte[] des3DecodeCBC(byte[] data, byte[] key) throws Exception {  
  3.         Key deskey = null;  
  4.         DESedeKeySpec spec = new DESedeKeySpec(key);  
  5.         SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("desede");  
  6.         deskey = keyFactory.generateSecret(spec);  
  7.           
  8.         Cipher cipher = Cipher.getInstance("desede" + "/CBC/PKCS5Padding");  
  9.         IvParameterSpec ips = new IvParameterSpec(IV);  
  10.         cipher.init(Cipher.DECRYPT_MODE, deskey, ips);  
  11.         return cipher.doFinal(data, 0, data.length);  
  12.     }  


C#代码  技术分享
  1. // 3DES 解密 基方法  
  2.     private static bool Decrypt(byte[] key, byte[] input, out byte[] output)  
  3.         {  
  4.             output = null;  
  5.   
  6.             try  
  7.             {  
  8.                 TripleDESCryptoServiceProvider trippleDesProvider = new TripleDESCryptoServiceProvider();  
  9.                 ICryptoTransform decryptObj = trippleDesProvider.CreateDecryptor(key, IV);  
  10.                 output = decryptObj.TransformFinalBlock(input, 0, input.Length);  
  11.                 trippleDesProvider.Clear();  
  12.             }  
  13.             catch (Exception ex)  
  14.             {  
  15.                 return false;  
  16.             }  
  17.   
  18.             return true;  
  19.         }  


Java代码  技术分享
  1. //DES加密  
  2.     public static String encode(byte[] key, byte[] iv, byte[] data) throws Exception {  
  3.         Key deskey = null;  
  4.         DESKeySpec spec = new DESKeySpec(key);  
  5.         SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");       
  6.         deskey = keyFactory.generateSecret(spec);  
  7.         IvParameterSpec ips = new IvParameterSpec(iv);  
  8.         Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");   
  9.         cipher.init(Cipher.ENCRYPT_MODE, deskey, ips);  
  10.         return new BASE64Encoder().encode(cipher.doFinal(data, 0, data.length));  
  11.     }  


C#代码  技术分享
    1. //DES加密     
    2. public static string DESEncode(string encryptString, string encryptKey) {   
    3.         byte[] rgbKey = Encoding.UTF8.GetBytes(encryptKey.Substring(0, 8));   
    4.         byte[] rgbIV = DESKeys;   
    5.         byte[] inputByteArray = Encoding.UTF8.GetBytes(encryptString);   
    6.         DESCryptoServiceProvider dCSP = new DESCryptoServiceProvider();   
    7.         MemoryStream mStream = new MemoryStream();   
    8.         CryptoStream cStream = new CryptoStream(mStream, dCSP.CreateEncryptor(rgbKey, rgbIV),   
    9.         CryptoStreamMode.Write);   
    10.         cStream.Write(inputByteArray, 0, inputByteArray.Length);   
    11.             cStream.FlushFinalBlock();   
    12.             return Convert.ToBase64String(mStream.ToArray());   
    13.     }   

以上是关于java c# 加密与解密对照的主要内容,如果未能解决你的问题,请参考以下文章

C# 与JAVA 的RSA 加密解密交互,互通,C#使用BouncyCastle来实现私钥加密,公钥解密的方法

C# RSA 加密/解密与传输

java密码加密与解密

AES之CryptoJS加密与C#解密

C#中RSA加密解密和签名与验证的实现

DES加密解密问题,java 和 C#