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.