Шифровать на C# и расшифровывать на Java с помощью одного и того же секретного ключа. ⇐ C#
Шифровать на C# и расшифровывать на Java с помощью одного и того же секретного ключа.
Я готовлюсь выполнить шифрование на стороне сервера (C#) и расшифровку на стороне Android (Java) для моего ключа API. И шифрование/дешифрование в С# было в порядке. Кроме того, в Java и шифрование/дешифрование тоже в порядке. Основная проблема заключается в том, что зашифрованный текст в C# отличается от Java, хотя я использовал тот же секретный ключ. Зашифрованный текст, сгенерированный C#, не может быть расшифрован в Java. Я попробовал, как показано ниже.
На Java
public static String key = "aaaaaaabbccccbbbaaaaaaaabbccccbb"; частный статический байт [] key_Array = Base64.decode(key,Base64.DEFAULT); общедоступное статическое шифрование строки (String PlainText) { пытаться { Шифр шифра = Cipher.getInstance("AES/CBC/PKCS5PADDING"); // Вектор инициализации. // Это может быть любое значение или оно может быть сгенерировано с помощью генератора случайных чисел. байт[] iv = { 1, 2, 3, 4, 5, 6, 6, 5, 4, 3, 2, 1, 7, 7, 7, 7 }; IvParameterSpec ivspec = новый IvParameterSpec(iv); Ключ secretKey = новый SecretKeySpec(key_Array, "AES"); cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivspec); return Base64.encodeToString(cipher.doFinal(plainText.getBytes()),Base64.DEFAULT); } поймать (Исключение e) { System.out.println("[Exception]:"+e.getMessage()); } вернуть ноль; } публичная статическая расшифровка строки (String EncryptedMessage) { пытаться { //Шифрование _Cipher = Cipher.getInstance("AES"); //Cipher _Cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING"); Cipher _Cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING"); // Вектор инициализации. // Это может быть любое значение или оно может быть сгенерировано с помощью генератора случайных чисел. байт[] iv = { 1, 2, 3, 4, 5, 6, 6, 5, 4, 3, 2, 1, 7, 7, 7, 7 }; IvParameterSpec ivspec = новый IvParameterSpec(iv); Ключ SecretKey = новый SecretKeySpec (key_Array, «AES»); _Cipher.init(Cipher.DECRYPT_MODE, SecretKey, ivspec); байт decodedMessage[] = Base64.decode(encryptedMessage,Base64.DEFAULT); вернуть новую строку(_Cipher.doFinal(decodedMessage)); } поймать (Исключение e) { System.out.println("[Exception]:"+e.getMessage()); } вернуть ноль; } На C#
публичный класс Crypt { // Код C#, CipherMode.CBC // Версия CBC требует вектора инициализации IV. общедоступная статическая строка keyStr = "aaaaaaabbccccbbaaaaaaaabbccccbb"; // FFClY170hLrhsDnKUEhJ4FhVOnrpNNFFClY170hLrhsDnKUE общедоступная статическая строка Encrypt (строка PlainText) { RijndaelManaged aes = новый RijndaelManaged(); aes.BlockSize = 128; aes.KeySize = 256; // В Java оно равно /// Cipher _Cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING"); aes.Mode = CipherMode.CBC; aes.Padding = PaddingMode.PKCS7; byte[] keyArr = Convert.FromBase64String(keyStr); байт [] KeyArrBytes32Value = новый байт [32]; Array.Copy(keyArr, KeyArrBytes32Value, 24); // Вектор инициализации. // Это может быть любое значение или оно может быть сгенерировано с помощью генератора случайных чисел. byte[] ivArr = { 1, 2, 3, 4, 5, 6, 6, 5, 4, 3, 2, 1, 7, 7, 7, 7 }; байт[] IVBytes16Value = новый байт[16]; Array.Copy(ivArr, IVBytes16Value, 16); aes.Key = KeyArrBytes32Value; aes.IV = IVBytes16Value; ICryptoTransform шифрование = aes.CreateEncryptor(); byte[] PlainTextByte = ASCIIEncoding.UTF8.GetBytes(PlainText); byte[] CipherText = encrypto.TransformFinalBlock(plainTextByte, 0, PlainTextByte.Length); return Convert.ToBase64String(CipherText); } общедоступная статическая строка Decrypt (строка CipherText) { RijndaelManaged aes = новый RijndaelManaged(); aes.BlockSize = 128; aes.KeySize = 256; aes.Mode = CipherMode.CBC; aes.Padding = PaddingMode.PKCS7; byte[] keyArr = Convert.FromBase64String(keyStr); байт [] KeyArrBytes32Value = новый байт [32]; Array.Copy(keyArr, KeyArrBytes32Value, 24); // Вектор инициализации. // Это может быть любое значение или оно может быть сгенерировано с помощью генератора случайных чисел. byte[] ivArr = { 1, 2, 3, 4, 5, 6, 6, 5, 4, 3, 2, 1, 7, 7, 7, 7 }; байт[] IVBytes16Value = новый байт[16]; Array.Copy(ivArr, IVBytes16Value, 16); aes.Key = KeyArrBytes32Value; aes.IV = IVBytes16Value; ICryptoTransform decrypto = aes.CreateDecryptor(); byte[] EncryptedBytes = Convert.FromBase64CharArray(CipherText.ToCharArray(), 0, CipherText.Length); byte[] decryptedData = decrypto.TransformFinalBlock(encryptedBytes, 0, EncryptedBytes.Length); вернуть ASCIIEncoding.UTF8.GetString(decryptedData); } } Вывод Java
Обычный текст: хла хла
Текст шифра: MW6b3AIpNw5RLmhvAro1Yg==
Вывод C#
Обычный текст: хла хла
Зашифрованный текст: qsHRHy05GbRv5Q1QNOUlZQ==
Любые идеи или альтернативные способы будут оценены по достоинству. Спасибо.
Я готовлюсь выполнить шифрование на стороне сервера (C#) и расшифровку на стороне Android (Java) для моего ключа API. И шифрование/дешифрование в С# было в порядке. Кроме того, в Java и шифрование/дешифрование тоже в порядке. Основная проблема заключается в том, что зашифрованный текст в C# отличается от Java, хотя я использовал тот же секретный ключ. Зашифрованный текст, сгенерированный C#, не может быть расшифрован в Java. Я попробовал, как показано ниже.
На Java
public static String key = "aaaaaaabbccccbbbaaaaaaaabbccccbb"; частный статический байт [] key_Array = Base64.decode(key,Base64.DEFAULT); общедоступное статическое шифрование строки (String PlainText) { пытаться { Шифр шифра = Cipher.getInstance("AES/CBC/PKCS5PADDING"); // Вектор инициализации. // Это может быть любое значение или оно может быть сгенерировано с помощью генератора случайных чисел. байт[] iv = { 1, 2, 3, 4, 5, 6, 6, 5, 4, 3, 2, 1, 7, 7, 7, 7 }; IvParameterSpec ivspec = новый IvParameterSpec(iv); Ключ secretKey = новый SecretKeySpec(key_Array, "AES"); cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivspec); return Base64.encodeToString(cipher.doFinal(plainText.getBytes()),Base64.DEFAULT); } поймать (Исключение e) { System.out.println("[Exception]:"+e.getMessage()); } вернуть ноль; } публичная статическая расшифровка строки (String EncryptedMessage) { пытаться { //Шифрование _Cipher = Cipher.getInstance("AES"); //Cipher _Cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING"); Cipher _Cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING"); // Вектор инициализации. // Это может быть любое значение или оно может быть сгенерировано с помощью генератора случайных чисел. байт[] iv = { 1, 2, 3, 4, 5, 6, 6, 5, 4, 3, 2, 1, 7, 7, 7, 7 }; IvParameterSpec ivspec = новый IvParameterSpec(iv); Ключ SecretKey = новый SecretKeySpec (key_Array, «AES»); _Cipher.init(Cipher.DECRYPT_MODE, SecretKey, ivspec); байт decodedMessage[] = Base64.decode(encryptedMessage,Base64.DEFAULT); вернуть новую строку(_Cipher.doFinal(decodedMessage)); } поймать (Исключение e) { System.out.println("[Exception]:"+e.getMessage()); } вернуть ноль; } На C#
публичный класс Crypt { // Код C#, CipherMode.CBC // Версия CBC требует вектора инициализации IV. общедоступная статическая строка keyStr = "aaaaaaabbccccbbaaaaaaaabbccccbb"; // FFClY170hLrhsDnKUEhJ4FhVOnrpNNFFClY170hLrhsDnKUE общедоступная статическая строка Encrypt (строка PlainText) { RijndaelManaged aes = новый RijndaelManaged(); aes.BlockSize = 128; aes.KeySize = 256; // В Java оно равно /// Cipher _Cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING"); aes.Mode = CipherMode.CBC; aes.Padding = PaddingMode.PKCS7; byte[] keyArr = Convert.FromBase64String(keyStr); байт [] KeyArrBytes32Value = новый байт [32]; Array.Copy(keyArr, KeyArrBytes32Value, 24); // Вектор инициализации. // Это может быть любое значение или оно может быть сгенерировано с помощью генератора случайных чисел. byte[] ivArr = { 1, 2, 3, 4, 5, 6, 6, 5, 4, 3, 2, 1, 7, 7, 7, 7 }; байт[] IVBytes16Value = новый байт[16]; Array.Copy(ivArr, IVBytes16Value, 16); aes.Key = KeyArrBytes32Value; aes.IV = IVBytes16Value; ICryptoTransform шифрование = aes.CreateEncryptor(); byte[] PlainTextByte = ASCIIEncoding.UTF8.GetBytes(PlainText); byte[] CipherText = encrypto.TransformFinalBlock(plainTextByte, 0, PlainTextByte.Length); return Convert.ToBase64String(CipherText); } общедоступная статическая строка Decrypt (строка CipherText) { RijndaelManaged aes = новый RijndaelManaged(); aes.BlockSize = 128; aes.KeySize = 256; aes.Mode = CipherMode.CBC; aes.Padding = PaddingMode.PKCS7; byte[] keyArr = Convert.FromBase64String(keyStr); байт [] KeyArrBytes32Value = новый байт [32]; Array.Copy(keyArr, KeyArrBytes32Value, 24); // Вектор инициализации. // Это может быть любое значение или оно может быть сгенерировано с помощью генератора случайных чисел. byte[] ivArr = { 1, 2, 3, 4, 5, 6, 6, 5, 4, 3, 2, 1, 7, 7, 7, 7 }; байт[] IVBytes16Value = новый байт[16]; Array.Copy(ivArr, IVBytes16Value, 16); aes.Key = KeyArrBytes32Value; aes.IV = IVBytes16Value; ICryptoTransform decrypto = aes.CreateDecryptor(); byte[] EncryptedBytes = Convert.FromBase64CharArray(CipherText.ToCharArray(), 0, CipherText.Length); byte[] decryptedData = decrypto.TransformFinalBlock(encryptedBytes, 0, EncryptedBytes.Length); вернуть ASCIIEncoding.UTF8.GetString(decryptedData); } } Вывод Java
Обычный текст: хла хла
Текст шифра: MW6b3AIpNw5RLmhvAro1Yg==
Вывод C#
Обычный текст: хла хла
Зашифрованный текст: qsHRHy05GbRv5Q1QNOUlZQ==
Любые идеи или альтернативные способы будут оценены по достоинству. Спасибо.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Шифровать на C# и расшифровывать на Java с помощью одного и того же секретного ключа.
Anonymous » » в форуме JAVA - 0 Ответы
- 19 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Шифровать на C# и расшифровывать на Java с помощью одного и того же секретного ключа.
Anonymous » » в форуме C# - 0 Ответы
- 18 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Как получить доступ к корзине s3 без секретного ключа и ключа доступа на Java?
Anonymous » » в форуме JAVA - 0 Ответы
- 32 Просмотры
-
Последнее сообщение Anonymous
-