Я реализую шифрование AES/GCM/NoPadding в Swift для iOS с минимальной целью развертывания 12.1. Я пытаюсь добиться аналогичной функциональности, как мой Java-код ниже:
Cipher cipherAes = initCipher(Cipher.ENCRYPT_MODE, key, iv);
byte[] encryptedMessageByte = cipherAes.doFinal(messageBytes);
byte[] cipherByte = ByteBuffer.allocate(iv.length + salt.length + encryptedMessageByte.length)
.put(iv)
.put(salt)
.put(encryptedMessageByte)
.array();
В Swift я написал следующий код:
let gcm = GCM(iv: iv.bytes, additionalAuthenticatedData: nil, tagLength: tagLength)
let aes = try AES(key: key.bytes, blockMode: gcm, padding: .noPadding)
let encryptedMessage = try aes.encrypt(message.bytes)
let cipherData = Data(iv) + Data(salt) + Data(encryptedMessage)
Однако длина EncryptedMessage в Swift отличается от EncryptedMessageByte в Java. Я ожидал, что оба дадут зашифрованный текст одинаковой длины.
Гарантия: Я уверен, что длины ключей, iv и salt одинаковы в реализациях Java и Swift.
Вопрос: Существуют ли какие-либо дополнительные конфигурации или параметры, необходимые для шифрования AES/GCM/NoPadding в Swift, чтобы соответствовать поведению в Java?
В коде Java зашифрованный текст и тег аутентификации GCM по умолчанию объединяются; в коде CryptoSwift оба по умолчанию обрабатываются отдельно.
Чтобы сделать код CryptoSwift совместимым с кодом Java, зашифрованный текст и тег можно явно объединить:
...
let gcm = GCM(iv: iv.bytes, additionalAuthenticatedData: nil, tagLength: tagLength, mode: .detached) // detached is the default
let aes = try! AES(key: key.bytes, blockMode: gcm, padding: .noPadding)
let encryptedMessage = try! aes.encrypt(message.bytes)
let tag = gcm.authenticationTag!
let cipherData = Data(iv) + Data(salt) + Data(encryptedMessage) + Data(tag) // concatenate explicitly
...
или шифрование выполняется в комбинированном режиме, при котором зашифрованный текст и тег также неявно объединяются:
...
let gcm = GCM(iv: iv.bytes, additionalAuthenticatedData: nil, tagLength: tagLength, mode: .combined) // apply combined mode
let aes = try! AES(key: key.bytes, blockMode: gcm, padding: .noPadding)
let encryptedMessageTag = try! aes.encrypt(message.bytes)
let cipherData = Data(iv) + Data(salt) + Data(encryptedMessageTag)
...
См. также примеры AES-GCM в документации.
этот пост отвечает на ваш вопрос: stackoverflow.com/questions/61332076/…