Как расшифровать данные в Java, которые были зашифрованы в Obj-c - PullRequest
1 голос
/ 01 апреля 2019

Я шифрую в ojb-c с помощью SecKeyEncryptedData и пытаюсь расшифровать в Java с помощью javax.Cipher и сталкиваюсь с проблемой.

Недавно я перешел к созданию длинных блоков и мне нужно было использовать симметричное шифрование сКлюч AES, зашифрованный парой асимметричных ключей.У меня проблемы с декодированием.

У меня есть ключ iOS kSecKeyAlgorithmRSAEncryptionPKCS1, работающий для асимметричных данных, совпадающих с Cipher.getInstance («RSA / ECB / PKCS1Padding») в Java.Это декодирует короткие блоки.

Поскольку мне нужно отправить более длинные блоки, и я пытаюсь переключиться на kSecKeyAlgorithmRSAEncryptionOAEPSHA512AESGCM на iOS, и он прекрасно шифрует, но я не могу найти метод для использования в Cipher, чтобы расшифровать его и непонять, нужно ли это сделать в Java в двух шагах в облаке.

OBJ-C: SecKeyAlgorithm algorithm = kSecKeyAlgorithmRSAEncryptionOAEPSHA512AESGCM; NSData* cipherText = nil; cipherText = (NSData*)CFBridgingRelease( // ARC takes ownership<br> SecKeyCreateEncryptedData(self.pubKey, algorithm, (__bridge CFDataRef)data, &error)); Java: try { cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); cipher.init(Cipher.DECRYPT_MODE, priv); byte[] dog = decoder.decode(encString); dec = cipher.doFinal(dog); res = new String(dec);<br> } // handle errors

Очевидно, что декодирование завершается неудачей.

Итак, мой вопрос состоит из 2 частей.

  1. существует ли тип шифра, который будет выполнять необходимое декодирование, или мне нужно взломать зашифрованный ключ AES и сначала расшифровать его?
  2. Если мне нужно разбить его, то как долго это зашифрованная ключевая часть AES блока данных и, если вы знаете шифры для этого, это было бы замечательно.

1 Ответ

0 голосов
/ 02 апреля 2019

существует ли тип шифра, который будет выполнять декодирование, необходимое

Вы можете прочитать документацию Cipher . Я считаю, что вы ищете RSA/ECB/OAEPWithSHA-256AndMGF1Padding

Я вижу, что обозначение не совсем совпадает с именем Obj-C, но это общий стандарт, поэтому стоит попробовать

Поскольку мне нужно отправить более длинные блоки, и я пытаюсь переключиться на kSecKeyAlgorithmRSAEncryptionOAEPSHA512AESGCM

Вы можете попытаться найти "гибридное шифрование". Асимметричные шифры ОЧЕНЬ медленны по сравнению с симметричными шифрами и предназначены для шифрования только ограниченного объема данных.

Некоторые реализации в любом случае могут шифровать более длинные данные (для каждого 256-битного ввода, обеспечивающего 2048 или 4096-битный вывод), Java просто будет жаловаться и останавливать

Так что правильное шифрование будет

  • шифрование данных с помощью radom-ключа (DEK - ключ шифрования данных) с использованием симметричного шифра
  • шифрование DEK с использованием асимметричного открытого ключа

Если kSecKeyAlgorithmRSAEncryptionOAEPSHA512AESGCM не будет аналогом (совместимым) с RSA/ECB/OAEPWithSHA-256AndMGF1Padding, вы все равно можете использовать отступ PKCS # 1 1.5 (старый) с этим подходом.

Редактировать: этот ответ может быть полезен и при работе с OAEP RSA / ECB / OAEPWithSHA-256AndMGF1Padding, но с MGF1 с использованием SHA-256?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...