每日踩坑 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;
        }