Problem description
For the company's connection to the payment interface, data encryption needs to use DES encryption. The third-party payment interface decryption is the des decryption written by JAVA, which only provides JAVA demo.
I have solved a problem of JAVA and C ා symmetric encryption before. Since both C ා and JAVA are developed by myself, it is convenient to solve the problem by converting them to hexadecimal. So this time, I also try to see whether the interface can be adjusted successfully by turning to hexadecimal. The result was a failure (link to my previous question: DES encryption and decryption C and JAVA interworking ).
Solution
The JAVA call example Demo given uses "DES/ECB/PKCS5Padding" encryption instead of vector iv.
The corresponding C is CipherMode.ECB; PaddingMode.PKCS7;
public byte[] doECBEncrypt(byte[] plainText, int len) throws Exception { Cipher cipher = this.getCipher("DES", "DES/ECB/PKCS5Padding", 1, (byte[])null); byte[] encryptedData = cipher.doFinal(plainText, 0, len); return encryptedData; } protected Cipher getCipher(String factory, String cipherName, int cryptMode, byte[] iv) throws Exception { SecureRandom sr = new SecureRandom(); byte[] rawKeyData = this.m_desKey; SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(factory); SecretKey key = new SecretKeySpec(this.m_desKey, factory); Cipher cipher = Cipher.getInstance(cipherName); if (iv != null) { IvParameterSpec ips = new IvParameterSpec(iv); cipher.init(cryptMode, key, ips, sr); } else { cipher.init(cryptMode, key, sr); } return cipher; }
C × corresponds to the following
///< summary > / / / encrypted string /// </summary> ///< param name = "STR" > string to encrypt < / param > ///< param name = "key" > secret key < / param > ///< returns > encrypted string < / returns > public static string Encrypt_ECB(string str, string myKey) { string encryptKeyall = Convert.ToString(myKey); //Define key if (encryptKeyall.Length < 9) { for (; ; ) { if (encryptKeyall.Length < 9) encryptKeyall += encryptKeyall; else break; } } string encryptKey = encryptKeyall.Substring(0, 8); DESCryptoServiceProvider descsp = new DESCryptoServiceProvider(); byte[] key = Encoding.UTF8.GetBytes(encryptKey); //Define an array of bytes to store the key byte[] data = Encoding.UTF8.GetBytes(str);//Define a byte array to store the string to be encrypted descsp.Key = key; descsp.Mode = CipherMode.ECB; descsp.Padding = PaddingMode.PKCS7; MemoryStream MStream = new MemoryStream(); //Instantiate memory stream object //Using memory stream to instantiate cryptographic stream objects CryptoStream CStream = new CryptoStream(MStream, descsp.CreateEncryptor(key, key), CryptoStreamMode.Write); CStream.Write(data, 0, data.Length); //Write data to encrypted stream CStream.FlushFinalBlock(); //Release encrypted stream return Convert.ToBase64String(MStream.ToArray());//Returns the encrypted string }