每日踩坑 2020-04-15 C# 与 Java 对应 DES 加密算法
最近公司项目有个对接Java系统的接口,之前也有一个另外的对接。
一有什么对接就全让我做,哭了。有名的加密模式都搞了一遍了。真的是心累。
这次这个玩意卡了我一天,但其实是个很简单的问题。
主要的坑有两个:
1.对解方给的密钥是32位的,事实上java是默认取密钥前8位,不够报错。而 C# 是必须传进去8位,不然就报错
2. 当java用 Cipher.getInstance("DES") 传参只传 DES 时,加密模式是 ECB !!!!!!!!!
大部分讲C#与JAVA对应该加密算法的文章讲的是 Cipher.getInstance("DES/CBC/PKCS5Padding"); 这种传参。
java方法:
// private static byte[] encrypt(String data, String password) throws Exception // { // byte[] datasource = data.getBytes("UTF-8"); // SecureRandom random = new SecureRandom(); // DESKeySpec desKey = new DESKeySpec(password.getBytes()); // SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); // javax.crypto.SecretKey securekey = keyFactory.generateSecret(desKey); // Cipher cipher = Cipher.getInstance("DES"); // cipher.init(1, securekey, random); // return cipher.doFinal(datasource); //}
C#方法:
public static string Encrypt(string data, string key) { //data = "8P5z$BDvxr8Uu6L?"; //key = "DqY7R9v3HbRbvTeZv1YArg3a7msPX6J8"; key = key.Substring(0, 8); byte[] byteData = Encoding.UTF8.GetBytes(data); byte[] byteKey = Encoding.UTF8.GetBytes(key); DESCryptoServiceProvider desProcider = new DESCryptoServiceProvider(); //DES一共有电子密码本模式(ECB)、加密分组链接模式(CBC)、加密反馈模式(CFB)和输出反馈模式(OFB)四种模式, //desProcider.Mode = CipherMode.CBC; desProcider.Mode = CipherMode.ECB; //desProcider.Padding = PaddingMode.PKCS7; desProcider.Key = byteKey; desProcider.IV = byteKey; MemoryStream ms = new MemoryStream(); CryptoStream cs = new CryptoStream(ms, desProcider.CreateEncryptor(), CryptoStreamMode.Write); cs.Write(byteData, 0, byteData.Length); cs.FlushFinalBlock(); var result = Convert.ToBase64String(ms.ToArray()); return result; }