Swift, CryptoKit und Verschlüsselung

Im zweiten Artikel zu CryptoKit geht es um die Verschlüsselung. Auch hier nutze ich als Beispiel wieder einen Xcode-Playground mit einer Textdatei (“Text.txt”), die den Text “Hello, World!” zum Inhalt hat. Diese Datei habe ich zum Ordner “Resources” hinzugefügt. Während im ersten CryptoKit-Artikel der Hashwert dieser Datei erzeugt wurde, geht es nun darum, diese Datei zu verschlüsseln.

Das CryptoKit-Framework stellt dazu zwei Algorithmen bereit: AES (Advanced Encryption Standard) und ChaChaPoly (ChaCha20-Poly1305). Hier verwende ich ChaChaPoly.

Zunächst muss CryptoKit importiert werden:

import CryptoKit

Dann folgt die Festlegung des Schlüssels:

let key = SymmetricKey(size: .bits256)

Der folgende Code zeigt die Ver- und die Entschlüsselung:

if let filePath = Bundle.main.path(forResource: "Text", ofType: "txt"),

    // Pfad der Variablen encrypted Data zuweisen
    let encryptedData = FileManager.default.contents(atPath: filePath),

    // Verschlüsselung unter Verwendung von ChaCha20-Poly1305
    let cryptedBox = try? ChaChaPoly.seal(encryptedData, using: key) {

    // Der Variablen sealedBox den Container mit den verschlüsselten Daten zuweisen
    let sealedBox = try ChaChaPoly.SealedBox(combined: cryptedBox.combined)

    // Die im Container enthaltenen Daten wieder entschlüsseln
    if let decryptedData = try? ChaChaPoly.open(sealedBox, using: key) {
        let decryptedString = String(data: decryptedData, encoding: .utf8)!
        print(decryptedString) // -> Hello, World!
    }
}

Die Verschlüsselung erfolgt durch die Zeile:

let cryptedBox = try? ChaChaPoly.seal(encryptedData, using: key)

Dadurch wird ein Container erzeugt, der drei Komponenten enthält:

  • ciphertext: Dies sind die verschlüsselten Daten.
  • tag: Dieser Tag soll gewährleisten, dass niemand die Daten verändert hat.
  • nonce (nonce =  number used once): Ein willkürliche Nummer, die bei jedem Verschlüsselungsvorgang zufällig oder pseudo-zufällig generiert wird. Mehr dazu findet Ihr in der Wikipedia.

Mit

let sealedBox = try ChaChaPoly.SealedBox(combined: cryptedBox.combined)

weisen wir diesen Container der Variablen sealedBox zu.

Anschließend wird sie “geöffnet”, der verschlüsselte Inhalt entschlüsselt und der Variablen decryptedData zugewiesen:

if let decryptedData = try? ChaChaPoly.open(sealedBox, using: key)

Schließlich möchten wir uns auch die entschlüsselten Daten anzeigen lassen:

let decryptedString = String(data: decryptedData, encoding: .utf8)!
print(decryptedString) // -> Hello, World!

Weitere Informationen mit Beispielen kann man der Apple-Dokumentation zu CryptoKit entnehmen.

Und den ersten Teil zum Thema Hashwerte findet Ihr hier.