Шифрование на java и дешифрование на C # и обратное

#bouncycastle #encryption

#bouncycastle #шифрование

Вопрос:

Я прочитал какую-то тему для своего заголовка, поэтому я не могу использовать их для решения своей проблемы. Итак, я открываю новую тему… Я хочу создать 2 функции шифрования и дешифрования на Java (для приложения Android) и C # (мой сервер) с использованием симметричного шифрования

Клиент (java): шифрование (ClearText1, ключ) = секрет -> Сервер: расшифровка (секрет, ключ) = ClearText1 и сервер (java): шифрование (ClearText2, ключ) = секрет -> Клиент: Расшифровка (секрет, ключ)= ClearText2

Я использовал библиотеку BouncyCastle для java и C #, но байт в java равен -128..127, в то время как байт в C # равен 0..255, не имеет отрицательных данных. Таким образом, шифрование и дешифрование клиента и сервера завершаются ошибкой.

Пожалуйста, помогите мне (или поделитесь библиотекой для моей проблемы). Спасибо!

Вот код на C #: как использовать их в Java? Обратите внимание, что тип данных «байт» в C # и java не совпадают (конечно, шифрование и дешифрование данных с помощью 2 следующих функций является истинным)

 >     public string _secretPhrase = "123abc456";
>     public string EncryptData(string plainText)
>     {
>         DES des = new DESCryptoServiceProvider();
>         des.Mode = CipherMode.ECB;
>         des.Padding = PaddingMode.PKCS7;
> 
>         des.Key = Encoding.UTF8.GetBytes(_secretPhrase.Substring(0, 8));
>         des.IV = Encoding.UTF8.GetBytes(_secretPhrase.Substring(0, 8));
> 
>         byte[] bytes = Encoding.UTF8.GetBytes(plainText);
>         byte[] resultBytes = des.CreateEncryptor().TransformFinalBlock(bytes, 0, bytes.Length);
> 
>         return Convert.ToBase64String(resultBytes);
>     }
> 
>     public string DecryptData(string encryptedText)
>     {
>         DES des = new DESCryptoServiceProvider();
>         des.Mode = CipherMode.ECB;
>         des.Padding = PaddingMode.PKCS7;
>         des.Key = Encoding.UTF8.GetBytes(_secretPhrase.Substring(0, 8));
>         des.IV = System.Text.Encoding.UTF8.GetBytes(_secretPhrase.Substring(0, 8));
> 
>         byte[] bytes = Convert.FromBase64String(encryptedText);
>         byte[] resultBytes = des.CreateDecryptor().TransformFinalBlock(bytes, 0, bytes.Length);
> 
>         return Encoding.UTF8.GetString(resultBytes);
>     }
  

Комментарии:

1. Это большая библиотека. Либо опубликуйте свой код, либо объясните, как вы его используете.

2. Пожалуйста, отредактируйте свой вопрос. Кроме того, пожалуйста, опубликуйте код для обоих языков.

Ответ №1:

Не похоже, что вы используете BouncyCastle. Это похоже на стандартный криптографический код .NET Framework. BouncyCastle использует соглашения об именах, подобные DesEngine.

Я рекомендую вам попробовать использовать BouncyCastle как для C #, так и для Java. Я не уверен, что разница в байтах будет практической проблемой. Библиотека должна правильно учитывать это.

Кроме того, одиночный DES теперь считается очень слабым. Против него проводятся однодневные атаки на разумном оборудовании, и он больше не является утвержденным стандартом. Вместо этого посмотрите на AES.

Наконец, я не уверен, что использование одного и того же ключа и IV разумно. Я не специалист по криптографии, но использование двух разных случайных чисел должно быть безопаснее.

Комментарии:

1. Код не является BouncyCastle, потому что он завершается ошибкой при шифровании или дешифровании с использованием типа данных «байт».

2. @black_star, опубликуйте свой код BouncyCastle (как для C #, так и для Java, если он у вас есть). Я сомневаюсь, что библиотека просто не может шифровать байтовые массивы (в этом весь смысл). Скорее всего, вам придется исправить свой код.

3. BouncyCastle является гибким, поэтому я могу сжать их и отправить вам?

4. @black_star, нет, опубликуйте это в вопросе или добавьте что-то вроде gist , затем опубликуйте ссылку. Таким образом, каждый может помочь.