Сбой дешифрования после регистрации AeadConfig более одного раза?

#encryption #kotlin #tink

#шифрование #kotlin #звон

Вопрос:

Я шифрую некоторый текст и пытаюсь его расшифровать, однако он не расшифровывается, когда я использую другой AeadConfig.register() для расшифровки, а не для шифрования. Мне интересно, как решить эту проблему, потому что я буду шифровать в одном действии и расшифровывать в другом действии. Я упростил это ради приведения примера ниже.

Это работает, если я просто передаю aead в качестве параметра, но я не уверен, что это то, что я должен делать.

 private fun deletableEncrypt() {

    AeadConfig.register()

    val keysetHandle: KeysetHandle = KeysetHandle.generateNew(AeadKeyTemplates.AES128_GCM)
    val aead: Aead = AeadFactory.getPrimitive(keysetHandle)

    val plainText = "Hello world"
    val aad = "masterpassword"

    val cipherText = aead.encrypt(plainText.toByteArray(), aad.toByteArray())

    Log.d(TAG, cipherText.toString())

    dbHelper.insertNewRow("text", cipherText,
        "moreText")
}

private fun deleteableDecrypt() {

    AeadConfig.register()

    val keysetHandle: KeysetHandle = KeysetHandle.generateNew(AeadKeyTemplates.AES128_GCM)
    val aead: Aead = AeadFactory.getPrimitive(keysetHandle)

    val aad = "masterpassword"

    val cipherText = dbHelper.getAllEncrypts()[0]

    val decrypted = aead.decrypt(cipherText, aad.toByteArray())
}
  

Прямо сейчас дешифрование выдает исключение. Я думаю, что это вызвано aeadConfig, но я не знаю, как зарегистрировать его только один раз, поэтому, как только это будет решено, он больше не будет генерировать исключение.

Ответ №1:

На самом деле я обнаружил ошибку, я каждый раз генерирую новый набор ключей, когда вместо этого я должен его сохранять. Инструкции о том, как это сделать, находятся здесь https://github.com/google/tink/blob/master/docs/JAVA-HOWTO.md в разделе «Хранение наборов ключей»