CryptoKit - ios и Android шифрование и дешифрование - PullRequest
0 голосов
/ 15 января 2020

Я пытаюсь зашифровать в 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

Ответы [ 2 ]

1 голос
/ 23 января 2020

Привет, я очень долго играл с этим и придумал рабочую игровую площадку Xcode, демонстрирующую шифрование и дешифрование CryptoKit AES-GCM 256. У меня также была эта ошибка очень часто сегодня, но я мог ее исправить. Вы можете клонировать репо моей игровой площадки и попробовать его, сыграть с ним:

https://github.com/Blackjacx/Playgrounds/blob/master/playgrounds/CryptoKit.playground/Contents.swift

0 голосов
/ 15 января 2020

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

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

...