最近在項目中需要做java中DES加密和C#DES的對應設置,java代碼如下所示:
public static String encryptDES(String paramString1, String paramString2) throws Exception { SecretKeySpec localSecretKeySpec = new SecretKeySpec(paramString2.getBytes(), "DES"); Cipher localCipher = Cipher.getInstance("DES/ECB/PKCS5Padding"); localCipher.init(1, localSecretKeySpec); return Base64.encode(localCipher.doFinal(paramString1.getBytes())); }
網上搜到的C#對應都是如下所示:
public static string Encrypt(string pToEncrypt, string sKey) { using (DESCryptoServiceProvider des = new DESCryptoServiceProvider()) { byte[] inputByteArray = Encoding.UTF8.GetBytes(pToEncrypt); des.Key = Encoding.UTF8.GetBytes(sKey); des.IV = Encoding.UTF8.GetBytes(sKey); System.IO.MemoryStream ms = new System.IO.MemoryStream(); using (CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write)) { cs.Write(inputByteArray, 0, inputByteArray.Length); cs.FlushFinalBlock(); cs.Close(); } string base64 = Convert.ToBase64String(ms.ToArray()); ms.Close(); return base64 ; } }
折騰了大半天,修改編碼格式,研究了下C#Encoding.UTF8.GetBytes()和java 的getBytes()差別,加密的值都對不上;
好好看了下java的代碼相關,注意到下面這句代碼:
Cipher.getInstance("DES/ECB/PKCS5Padding");
搜索相關,java的PKCS5Padding 對應C#的des.Padding = PaddingMode.PKCS7;但是結果還是對應不上。
一直沒注意到ECB 還需要設置C#的des.Mode = CipherMode.ECB;
被這種小問題折騰半天,記錄一下;