Triple DES Encrypt C# - Decrypt in Java

后端 未结 3 1839
孤独总比滥情好
孤独总比滥情好 2021-01-07 14:45

I\'m getting a Triple DES decrypted string from the clients server, which has been coded in c# (see below):

using System.IO;
using System;
using System.Secur         


        
3条回答
  •  心在旅途
    2021-01-07 15:38

    acording https://stackoverflow.com/a/33768305/1140304 you can use unicode instead of UTF-8 in java code

    encrypt in c# :

    public static string Encrypt2(string clearText,string key)
    {
        try
        {
            string encryptedText = "";
            MD5 md5 = new MD5CryptoServiceProvider();
            TripleDES des = new TripleDESCryptoServiceProvider();
            des.KeySize = 128;
            des.Mode = CipherMode.CBC;
            des.Padding = PaddingMode.PKCS7;
    
            byte[] md5Bytes = md5.ComputeHash(Encoding.Unicode.GetBytes(key));
    
            byte[] ivBytes = new byte[8];
    
    
            des.Key = md5Bytes;
    
            des.IV = ivBytes;
    
            byte[] clearBytes = Encoding.Unicode.GetBytes(clearText);
    
            ICryptoTransform ct = des.CreateEncryptor();
            using (MemoryStream ms = new MemoryStream())
            {
                using (CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write))
                {
                    cs.Write(clearBytes, 0, clearBytes.Length);
                    cs.Close();
                }
                encryptedText = Convert.ToBase64String(ms.ToArray());
            }
            return encryptedText;
        }
        catch (Exception exception)
        {
            return "";
        }
    }
    

    for decode in c# you can use:

    public static string Decrypt2(string cipher,string key)
    {
        try
        {
            byte[] clearBytes = Convert.FromBase64String(cipher);
            MD5 md5 = new MD5CryptoServiceProvider();
            byte[] md5Bytes = md5.ComputeHash(Encoding.Unicode.GetBytes(key));
            string encryptedText = "";
            TripleDES des = new TripleDESCryptoServiceProvider();
            des.KeySize = 128;
            des.Mode = CipherMode.CBC;
            des.Padding = PaddingMode.PKCS7;
            byte[] ivBytes = new byte[8];
            des.Key = md5Bytes;
            des.IV = ivBytes;
            ICryptoTransform ct = des.CreateDecryptor();
            byte[] resultArray = ct.TransformFinalBlock(clearBytes, 0, clearBytes.Length);
            encryptedText = Encoding.Unicode.GetString(resultArray);
            return encryptedText;
        }
        catch (Exception exception)
        {
            return "";
        }
    }
    

    now, for encrypt in java you can use :

    private String _encrypt2(String clearText,String key )
    {
        try
        {
            /**
             * create md5
             */
            MessageDigest md = MessageDigest.getInstance("md5");
            byte[] digestOfPassword = md.digest(key.getBytes("UTF-16LE"));
            byte[] keyBytes = Arrays.copyOf(digestOfPassword, 24);
            for (int j = 0, k = 16; j < 8; )
            {
                keyBytes[k++] = keyBytes[j++];
            }
    
    
            SecretKey secretKey = new SecretKeySpec(keyBytes, 0, 24, "DESede");
            IvParameterSpec iv = new IvParameterSpec(new byte[8]);
            Cipher cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");
            cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);
    
            byte[] plainTextBytes = clearText.getBytes("UTF-16LE");
            byte[] cipherText = cipher.doFinal(plainTextBytes);
    
            String output = Base64.encodeToString(cipherText,Base64.DEFAULT);
            return output;
        }
        catch (Exception ex) {}
        return "";
    }
    

    and for decrypt in java :

    private String _decrypt2(String encryptText,String key)
    {
    
        MessageDigest md = null;
        byte[] digestOfPassword = null;
    
        try
        {
            byte[] message = Base64.decode(encryptText.getBytes("UTF-16LE"), Base64.DEFAULT);
    
            /**
             * make md5
             */
            md = MessageDigest.getInstance("md5");
            digestOfPassword = md.digest(key.getBytes("UTF-16LE"));
            byte[] keyBytes = Arrays.copyOf(digestOfPassword, 24);
            for (int j = 0, k = 16; j < 8; )
            {
                keyBytes[k++] = keyBytes[j++];
            }
    
            SecretKey secretKey = new SecretKeySpec(keyBytes, 0, 24, "DESede");
            IvParameterSpec iv = new IvParameterSpec(new byte[8]);
            Cipher cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");
            cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);
            byte[] cipherText = cipher.doFinal(message);
    
            return new String(cipherText, "UTF-16LE");
        }
        catch (NoSuchAlgorithmException e)
        {
            e.printStackTrace();
        }
        catch (UnsupportedEncodingException e)
        {
            e.printStackTrace();
        }
        catch (InvalidKeyException e)
        {
            e.printStackTrace();
        }
        catch (InvalidAlgorithmParameterException e)
        {
            e.printStackTrace();
        }
        catch (NoSuchPaddingException e)
        {
            e.printStackTrace();
        }
        catch (BadPaddingException e)
        {
            e.printStackTrace();
        }
        catch (IllegalBlockSizeException e)
        {
            e.printStackTrace();
        }
        return "";
    }
    

提交回复
热议问题