Member 14901669 Ответов: 1

Как я...решаю шифрование с помощью AES 256 с ключом C# к java


Сценарий, подобный API, разработанный на Java и должен потреблять в asp.net с#. Проблема заключается в шифровании и дешифровании полезной нагрузки. Алгоритм AES-256 , генерируемый зашифрованным текстом в c#, не совпадает с Java. Пожалуйста, помогите. заранее спасибо.

Что я уже пробовал:

JAVA CODE : 
public static void main(String args[]) 
    {
        MyClass obj = new MyClass();

        String mdString = obj.generateAESEncryption("dfgfrhdfgfrhdfgfrhdfgfrhdfgfrhil", "1");

        System.out.println(" AES 256 Encrypted Key : " + mdString);
    }

    public String generateAESEncryption(String sercretKey, String message) 
    {

        String base64EncryptedString = "";

        MessageDigest md = null;
        try {

            md = MessageDigest.getInstance("SHA-256");


            byte[] digestOfPassword = md.digest(sercretKey.getBytes(StandardCharsets.UTF_8));
            
            System.out.println(" Message Digest Byte[] String : " + digestOfPassword);
            

            byte[] keyBytes = Arrays.copyOf(digestOfPassword, 24);

            byte[] iv = Arrays.copyOf(digestOfPassword, 16);
            
            System.out.println(" keyBytes Byte[] String : " + digestOfPassword);
            System.out.println(" iv Byte[] String : " + digestOfPassword);

            SecretKey key = new SecretKeySpec(keyBytes, "AES");

            Cipher cipher = null;
            try {
                    cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");


                    IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);

                    try 
                    {
                        cipher.init(Cipher.ENCRYPT_MODE, key, ivParameterSpec);
                    } 
                    catch (InvalidAlgorithmParameterException | InvalidKeyException e) 
                    {
                        e.printStackTrace();
                    }

                    byte[] plainTextBytes = message.getBytes(StandardCharsets.UTF_8);
                    
                    System.out.println(" plainTextBytes Byte[] String : " + digestOfPassword);

                    byte[] buf = new byte[0];
                    try 
                    {
                        buf = cipher.doFinal(plainTextBytes);
                    } 
                    catch (BadPaddingException e) 
                    {
                        e.printStackTrace();
                    } 
                    catch (IllegalBlockSizeException e) 
                    {
                        e.printStackTrace();
                    }

                    //byte[] encryptedByteValue = new Base64().encode(buf);
                    byte[] encryptedByteValue = Base64.getEncoder().encode(buf);

                    //String encryptedValue = encryptedByteValue.toString();
                    base64EncryptedString = new String(encryptedByteValue, StandardCharsets.UTF_8);

                    //Logger.debug("AES : ", "EncryptedValue : " + base64EncryptedString);

                } 
                catch (NoSuchPaddingException e) 
                {
                    e.printStackTrace();
                }
        } 
        catch (NoSuchAlgorithmException e) 
        {
            e.printStackTrace();
        }

        return base64EncryptedString;
    }
}

C# Code : 

        private static string Encrypt_2(string PlainText, String key)
        {
            HashAlgorithm Hasher = new SHA256CryptoServiceProvider();
            byte[] strBytes = Encoding.UTF8.GetBytes(key);
            byte[] passBytes = Hasher.ComputeHash(strBytes);

            RijndaelManaged aes = new RijndaelManaged();
            aes.BlockSize = 128;
            aes.KeySize = 256;

            // It is equal in java 
            /// Cipher _Cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");    
            aes.Mode = CipherMode.CBC;
            aes.Padding = PaddingMode.PKCS7;

            byte[] keyArr = Convert.FromBase64String(key);
            byte[] KeyArrBytes32Value = new byte[24];
            Array.Copy(passBytes, KeyArrBytes32Value, 16);

            // Initialization vector.   
            // It could be any value or generated using a random number generator.
            byte[] ivArr = { 1, 2, 3, 4, 5, 6, 6, 5, 4, 3, 2, 1, 7, 7, 7, 7 };
            byte[] IVBytes16Value = new byte[16];
            Array.Copy(ivArr, IVBytes16Value, 16);

            aes.Key = KeyArrBytes32Value;
            aes.IV = IVBytes16Value;

            ICryptoTransform encrypto = aes.CreateEncryptor();

            byte[] plainTextByte = ASCIIEncoding.UTF8.GetBytes(PlainText);
            byte[] CipherText = encrypto.TransformFinalBlock(plainTextByte, 0, plainTextByte.Length);
            return Convert.ToBase64String(CipherText);

        }

OriginalGriff

Мы более чем готовы помочь тем, кто застрял, но это не значит, что мы здесь, чтобы сделать все это для вас! Мы не можем сделать всю работу, вам либо платят за это, либо это часть ваших оценок, и было бы совсем несправедливо, если бы мы сделали все это за вас.

Поэтому нам нужно, чтобы вы сделали работу, и мы поможем вам, когда вы застряли. Это не значит, что мы дадим вам пошаговое решение, которое вы можете сдать!
Начните с объяснения, где вы находитесь в данный момент и каков следующий шаг в этом процессе. Затем расскажите нам, что вы пытались сделать, чтобы этот следующий шаг сработал, и что произошло, когда вы это сделали.

BillWoodruff

"сгенерированный зашифрованный текст в c# не совпадает с Java" почему вы смешиваете C# и Java ?

1 Ответов

Рейтинг:
0

Garth J Lancaster

Вам нужно убедиться, что такие вещи, как IV и Padding (и, очевидно, cypher, режим cypher), одинаковы ...

В вашем случае, например, в java я не знаю, что такое IV генерируется, и вы используете PKCS5 padding .. в C# вы устанавливаете IV и используете PKCS7 padding

У меня нет времени разбирать ваш код на части, поэтому я предоставлю вам 2 URL-адреса, где люди "говорят" (я еще не проверял), что у них все правильно, может быть, вы сможете перепроверить или просто использовать их код, с атрибуцией, конечно)

Майкл Ремиджан: шифрование AES между Java и C#[^]

(интересно, что он использует заполнение PCKs5 в Java и заполнение PKCS7 в C#, но обратите внимание, что IV-это одно и то же)

AES-128 (совместимость C# и Java) · GitHub[^]


BillWoodruff

+5