IOS CryptoKit на JavaJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 IOS CryptoKit на Java

Сообщение Anonymous »

Я ищу настройки/параметры CryptoKit, которые позволят мне обмениваться данными между приложением iOS и приложением Java. Последовательность действий будет примерно такой:
  • Используйте CryptoKit для шифрования текста с использованием фиксированного ключа и случайного вектора инициализации (IV).
  • В приложении Java используйте стандартные библиотеки Javax для выполнения расшифровки с использованием того же фиксированного ключа. Случайный IV будет переноситься/совместно с приложением вместе с зашифрованным текстом.
Аналогично, требуется и обратное, когда текст шифруется с использованием библиотек JavaX с использованием фиксированного ключа и случайного IV. Случайный IV и зашифрованный текст передаются приложению iOS, где оно должно использовать CryptoKit для его расшифровки.
Ниже приведен код шифрования и дешифрования на Java:

Код: Выделить всё

public static byte[] encrypt(byte[] plaintext, byte[] key, byte[] IV) throws Exception
{
// Get Cipher Instance
Cipher cipher = Cipher.getInstance("AES_256/GCM/NoPadding");

// Create SecretKeySpec
SecretKeySpec keySpec = new SecretKeySpec(key, "AES");

// Create GCMParameterSpec
GCMParameterSpec gcmParameterSpec = new GCMParameterSpec(GCM_TAG_LENGTH * 8, IV);

// Initialize Cipher for ENCRYPT_MODE
cipher.init(Cipher.ENCRYPT_MODE, keySpec, gcmParameterSpec);

// Perform Encryption
byte[] cipherText = cipher.doFinal(plaintext);

return cipherText;
}

public static String decrypt(byte[] cipherText, byte[] key, byte[] IV) throws Exception
{
// Get Cipher Instance
Cipher cipher = Cipher.getInstance("AES_256/GCM/NoPadding");

// Create SecretKeySpec
SecretKeySpec keySpec = new SecretKeySpec(key, "AES");

// Create GCMParameterSpec
GCMParameterSpec gcmParameterSpec = new GCMParameterSpec(GCM_TAG_LENGTH * 8, IV);

// Initialize Cipher for DECRYPT_MODE
cipher.init(Cipher.DECRYPT_MODE, keySpec, gcmParameterSpec);

// Perform Decryption
byte[] decryptedText = cipher.doFinal(cipherText);

return new String(decryptedText);
}
Команды CryptoKit, как показано ниже:

Код: Выделить всё

let mykey = SymmetricKey(data: passhash)
let myiv = try AES.GCM.Nonce()
let mySealedBox = try AES.GCM.seal(source.data(using: .utf8)!, using: mykey, nonce: myiv)
let myNewSealedBox = try AES.GCM.SealedBox(nonce: myiv, ciphertext: mySealedBox.ciphertext, tag: mySealedBox.tag)
let myText = try String(decoding: AES.GCM.open(myNewSealedBox, using: mykey), as: UTF8.self)
Ниже приведены шаги по созданию зашифрованного текста в Java:

Код: Выделить всё

int GCM_IV_LENGTH = 12;

//Generate Key
MessageDigest md = MessageDigest.getInstance("SHA265");
byte[] key = md.digest("pass".getBytes(StandardCharsets.UTF_8));

// Generate IV
SecureRandom sr = new SecureRandom(pass.getBytes(StandardCharsets.UTF_8));
byte[] IV = new byte[GCM_IV_LENGTH];
sr.nextBytes(IV);

//Encrypt
byte[] cipherText = encrypt("Text to encrypt".getBytes(), key, IV);

//Base64 Encoded CipherText
String cipherTextBase64 = Base64.getEncoder().encodeToString(cipherText);
Чтобы расшифровать это в Swift CryptoKit, мне сначала нужно создать запечатанный ящик с этим CipherText. Однако API CryptoKit для создания запечатанного ящика требует следующего:
  • Nonce/IV (доступен выше)
  • CipherText (доступен выше)
  • Тег (НЕТ ИДЕИ, ОТКУДА ЭТО ПОЛУЧИТЬ????)

Код: Выделить всё

AES.GCM.SealedBox(nonce: , ciphertext: , tag: )
Другой путь. Давайте сначала зашифруем данные в CryptoKit:

Код: Выделить всё

let mykey = SymmetricKey(data: SHA256.hash(data: "12345".data(using: .utf8)!))
let myiv = AES.GCM.Nonce()
let mySealedBox = try AES.GCM.seal("Text to encrypt".data(using: .utf8)!, using: mykey, nonce: myiv)
let cipherText = mySealedBox.cipherText.base64EncodedString()
let iv = myiv.withUnsafeBytes{
return Data(Array($0)).base64EncodedString()
}
Если я передам этот IV и CipherText в функцию Java Decrypt вместе с ключом (хеш SHA265 строки «12345»), я получу ошибку несоответствия TAG.


Подробнее здесь: https://stackoverflow.com/questions/595 ... it-in-java
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»