最近老是碰到和其他项目对接,对方项目采用JAVA,对于调用api时通常会 设计到对参数的加密解密。这时候就需要把对方的加密算法用C#实现一遍。
直接上代码。
Java
private static byte[] iv = {1,2,3,4,5,6,7,8}; public static String encryptDES(String encryptString, String encryptKey) throws Exception { // IvParameterSpec zeroIv = new IvParameterSpec(new byte[8]); IvParameterSpec zeroIv = new IvParameterSpec(iv); SecretKeySpec key = new SecretKeySpec(encryptKey.getBytes("utf-8"), "DES"); Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, key, zeroIv); byte[] encryptedData = cipher.doFinal(encryptString.getBytes("utf-8")); return Base64_BAK.encode(encryptedData); } public static String decryptDES(String decryptString, String decryptKey) throws Exception { byte[] byteMi = new Base64_BAK().decode(decryptString); IvParameterSpec zeroIv = new IvParameterSpec(iv); // IvParameterSpec zeroIv = new IvParameterSpec(new byte[8]); SecretKeySpec key = new SecretKeySpec(decryptKey.getBytes("utf-8"), "DES"); Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); cipher.init(Cipher.DECRYPT_MODE, key, zeroIv); byte decryptedData[] = cipher.doFinal(byteMi); String retrdecryptedData = new String(decryptedData,"UTF-8"); return retrdecryptedData; }
对字符进行编码的代码
class Base64_BAK { private static final char[] legalChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".toCharArray(); /** * data[]进行编码 * @param data * @return */ public static String encode(byte[] data) { int start = 0; int len = data.length; StringBuffer buf = new StringBuffer(data.length * 3 / 2); int end = len - 3; int i = start; int n = 0; while (i <= end) { int d = ((((int) data[i]) & 0x0ff) << 16) | ((((int) data[i + 1]) & 0x0ff) << 8) | (((int) data[i + 2]) & 0x0ff); buf.append(legalChars[(d >> 18) & 63]); buf.append(legalChars[(d >> 12) & 63]); buf.append(legalChars[(d >> 6) & 63]); buf.append(legalChars[d & 63]); i += 3; if (n++ >= 14) { n = 0; buf.append(" "); } } if (i == start + len - 2) { int d = ((((int) data[i]) & 0x0ff) << 16) | ((((int) data[i + 1]) & 255) << 8); buf.append(legalChars[(d >> 18) & 63]); buf.append(legalChars[(d >> 12) & 63]); buf.append(legalChars[(d >> 6) & 63]); buf.append("="); } else if (i == start + len - 1) { int d = (((int) data[i]) & 0x0ff) << 16; buf.append(legalChars[(d >> 18) & 63]); buf.append(legalChars[(d >> 12) & 63]); buf.append("=="); } return buf.toString(); } private static int decode(char c) { if (c >= ‘A‘ && c <= ‘Z‘) return ((int) c) - 65; else if (c >= ‘a‘ && c <= ‘z‘) return ((int) c) - 97 + 26; else if (c >= ‘0‘ && c <= ‘9‘) return ((int) c) - 48 + 26 + 26; else switch (c) { case ‘+‘: return 62; case ‘/‘: return 63; case ‘=‘: return 0; default: throw new RuntimeException("unexpected code: " + c); } } /** * Decodes the given Base64 encoded String to a new byte array. The byte * array holding the decoded data is returned. */ public static byte[] decode(String s) { ByteArrayOutputStream bos = new ByteArrayOutputStream(); try { decode(s, bos); } catch (IOException e) { throw new RuntimeException(); } byte[] decodedBytes = bos.toByteArray(); try { bos.close(); bos = null; } catch (IOException ex) { System.err.println("Error while decoding BASE64: " + ex.toString()); } return decodedBytes; } private static void decode(String s, OutputStream os) throws IOException { int i = 0; int len = s.length(); while (true) { while (i < len && s.charAt(i) <= ‘ ‘) i++; if (i == len) break; int tri = (decode(s.charAt(i)) << 18) + (decode(s.charAt(i + 1)) << 12) + (decode(s.charAt(i + 2)) << 6) + (decode(s.charAt(i + 3))); os.write((tri >> 16) & 255); if (s.charAt(i + 2) == ‘=‘) break; os.write((tri >> 8) & 255); if (s.charAt(i + 3) == ‘=‘) break; os.write(tri & 255); i += 4; } }
对应的C#加密和解密算法如下
static String encode(byte[] data) { int start = 0; int len = data.Length; StringBuilder buf = new StringBuilder(data.Length * 3 / 2); var legalChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".ToCharArray(); int end = len - 3; int i = start; int n = 0; while (i <= end) { int d = ((((int)data[i]) & 0x0ff) << 16) | ((((int)data[i + 1]) & 0x0ff) << 8) | (((int)data[i + 2]) & 0x0ff); buf.Append(legalChars[(d >> 18) & 63]); buf.Append(legalChars[(d >> 12) & 63]); buf.Append(legalChars[(d >> 6) & 63]); buf.Append(legalChars[d & 63]); i += 3; if (n++ >= 14) { n = 0; buf.Append(" "); } } if (i == start + len - 2) { int d = ((((int)data[i]) & 0x0ff) << 16) | ((((int)data[i + 1]) & 255) << 8); buf.Append(legalChars[(d >> 18) & 63]); buf.Append(legalChars[(d >> 12) & 63]); buf.Append(legalChars[(d >> 6) & 63]); buf.Append("="); } else if (i == start + len - 1) { int d = (((int)data[i]) & 0x0ff) << 16; buf.Append(legalChars[(d >> 18) & 63]); buf.Append(legalChars[(d >> 12) & 63]); buf.Append("=="); } return buf.ToString(); } private static string Encrypt(string str, string sKey, byte[] iv) { DESCryptoServiceProvider des = new DESCryptoServiceProvider(); byte[] inputByteArray = Encoding.Default.GetBytes(str); des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);// 密匙 //byte[] iv = { 1, 2, 3, 4, 5, 6, 7, 8 }; des.IV = iv;// 初始化向量 MemoryStream ms = new MemoryStream(); CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write); cs.Write(inputByteArray, 0, inputByteArray.Length); cs.FlushFinalBlock(); var retB = encode(ms.ToArray()); return retB; } private static string Decrypt(string pToDecrypt, string sKey,byte[] iv) { DESCryptoServiceProvider des = new DESCryptoServiceProvider(); byte[] inputByteArray = Convert.FromBase64String(pToDecrypt); //byte[] iv = { 1, 2, 3, 4, 5, 6, 7, 8 }; des.Key = ASCIIEncoding.ASCII.GetBytes(sKey); des.IV = iv; MemoryStream ms = new MemoryStream(); CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write); cs.Write(inputByteArray, 0, inputByteArray.Length); // 如果两次密匙不一样,这一步可能会引发异常 cs.FlushFinalBlock(); return System.Text.Encoding.Default.GetString(ms.ToArray()); }
Java加密解密算法
public static String decryptDES(String decryptString, String decryptKey) throws Exception { String afterDecryptString = null; byte[] byteMi = new Base64().decode(decryptString); try { SecretKeySpec key = new SecretKeySpec(decryptKey.getBytes(), "DES"); Cipher cipher = Cipher.getInstance("DES"); cipher.init(2, key); byte[] decryptData = cipher.doFinal(byteMi); afterDecryptString = new String(decryptData, "UTF-8"); } catch (Exception e) { log.error("decryptDES error", e); throw e; } return afterDecryptString; }
C#代码
public static string Decrypt(string pToDecrypt, string sKey) { //var inputByteArray = ASCIIEncoding.ASCII.GetBytes(pToDecrypt); byte[] inputByteArray = Convert.FromBase64String(pToDecrypt); using (DESCryptoServiceProvider des = new DESCryptoServiceProvider()) { //des.Padding =PaddingMode.PKCS7; des.Mode = CipherMode.ECB; des.Key = ASCIIEncoding.ASCII.GetBytes(sKey); des.IV = ASCIIEncoding.ASCII.GetBytes(sKey); System.IO.MemoryStream ms = new System.IO.MemoryStream(); using (CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write)) { cs.Write(inputByteArray, 0, inputByteArray.Length); cs.FlushFinalBlock(); cs.Close(); } string str = Encoding.UTF8.GetString(ms.ToArray()); ms.Close(); return str; } }
原文地址:https://www.cnblogs.com/Playfunny/p/11428934.html
时间: 2024-10-12 08:49:47