#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 , затем опубликуйте ссылку. Таким образом, каждый может помочь.