CryptoKit-ios и Android шифрование и дешифрование

Я пытаюсь зашифровать в Android и дешифровать в IOS. Я использую шифрование AES.GCM, однако, когда я пытаюсь расшифровать пакет в IOS, я получаю сообщение об ошибке аутентификации. Ниже приведен код для дешифрования IOS

func decryptData(decryptToData:Data,key:SymmetricKey)->String {
    let combinedData = decryptToData // Previous sealed bo

    let sealedBoxToOpen = try! AES.GCM.SealedBox(combined: decryptToData)

    if let decryptedData = try? AES.GCM.open(sealedBoxToOpen, using: key) {
          decryptedString = String(data: decryptedData, encoding: .utf8)!
        print(decryptedString ?? "Failed")
    } else {   
        print(CryptoKitError)                // Ouch, doSomething() threw an error.
    }
}

Это похоже на iOS CryptoKit в Java, но я делаю наоборот.

Это код шифрования Android

public synchronized Map<String, String> encrypt(byte[] rawKey, byte[] rawData, @Nullable byte[] associatedData) throws StashDataEncryptionException {
    byte[] rawEncryptionKey = null;
    if (rawKey == null) {
        SecureRandom secureRandom = new SecureRandom();
        byte[] key = new byte[KEY_LENGTH_BYTE];
        secureRandom.nextBytes(key);
        rawEncryptionKey = key;
    } else {
        rawEncryptionKey = rawKey;
    }

    byte[] iv = null;
    byte[] encrypted = null;
    try {
        iv = new byte[IV_LENGTH_BYTE];
        secureRandom.nextBytes(iv);

        final Cipher cipherEnc = getCipher();
        cipherEnc.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(rawEncryptionKey, "AES"), new GCMParameterSpec(TAG_LENGTH_BIT, iv));

        if (associatedData != null) {
            cipherEnc.updateAAD(associatedData);
        }

        encrypted = cipherEnc.doFinal(rawData);

        String base64Key = Base64.encodeToString(rawEncryptionKey, Base64.DEFAULT);

        //concat all of it to a single message
        ByteBuffer byteBuffer = ByteBuffer.allocate(1 + iv.length + encrypted.length);
        byteBuffer.put((byte) iv.length);
        byteBuffer.put(iv);
        byteBuffer.put(encrypted);
        byte[] cipherMessage = byteBuffer.array();

        Map map = new HashMap<String, String>();
        map.put(MAP_KEY, base64Key);
        map.put(MAP_Byte_CONTENT, cipherMessage);
        return map;
    } catch (Exception e) {
        throw new StashDataEncryptionException("could not encrypt data", e);
    }
}

я проверил ключ, iv и длину тега. То же самое на стороне IOS, как Android

Всего 1 ответ


Реализации будут отличаться, достаточно, чтобы аннулировать аутентифицированное шифрование.

Используйте кроссплатформенную совместимую библиотеку корпоративного уровня, libsodium как libsodium .


Есть идеи?

10000