Verschlüsselten String mit CryptoKit

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Verschlüsselten String mit CryptoKit

    Hallo zusammen,

    ich will jetzt keine Diskussion lostreten, dass man das nicht nicht macht.
    Schlüssel kommt natürlich nicht in den Quellcode, aber so weit bin ich noch nicht. Sind erste Gehversuche. OK?

    Ich hätte gerne Hilfe zu meiner Fragestellung.

    Ich möchte mit CryptoKit einen String verschlüsseln.
    Ich komme bisher so weit, dass ich den String verschlüsseln und entschlüsseln kann (hoffe ich zumindest).

    Quellcode

    1. struct Crypto {
    2. private static let key = SymmetricKey(data: SHA256.hash(data: "Mein Schlüssel".data(using: .utf8)!))
    3. static func decrypt(_ value: String) -> ChaChaPoly.SealedBox? {
    4. if let decrypetBox = try? ChaChaPoly.seal(value.data(using: .utf8)!, using: key) {
    5. return decrypetBox
    6. } else {
    7. return nil
    8. }
    9. }
    10. static func encrypt(_ cryptedBox : ChaChaPoly.SealedBox) -> String? {
    11. if let sealedBox = try? ChaChaPoly.SealedBox(combined: cryptedBox.combined),
    12. let decryptedData = try? ChaChaPoly.open(sealedBox, using: key) {
    13. return String(data: decryptedData, encoding: .utf8)!
    14. } else {
    15. return nil
    16. }
    17. }
    18. }
    Alles anzeigen
    Ich möchte aber den verschlüsselten String erhalten, so wie z.B. hier: gillmeister-software.de/online…sseln-entschluesseln.aspx
    Ich habe schon alle Eigenschaften von ChaCHaPoly.SealedBox durchprobiert, hier ist aber nirgends der verschlüsselte String enthalten.

    Geht das mit CryptoKit überhaupt?
  • Moin again,

    habe mit CryptoKit noch nicht gearbeitet. Ein Blick in die Doku verrät mir aber, dass deine decryptedBox vom Typ SealedBox ist, da sie ein Container für mehrere Informationen darstellt (nonce, ciphertext, tag) und daher einfach kein String ist. ciphertext, tag und combined sind alle drei vom Typ Data, d.h. du könntest mal ausprobieren, was dir die description ausgibt - evtl. reicht die für z.B. Debug-Zwecke oder was du vorhast.

    PS: Wenn ich dir einen kleinen Swift-Hinweis geben darf: Einen Optional zu unwrappen, um dann wieder einen Optional zurückzugeben, ist unnötig bzw. unsinnig Entweder du möchtest tatsächlich einen Optional zurückgeben, dann kannst du as dem hier...

    Quellcode

    1. static func decrypt(_ value: String) -> ChaChaPoly.SealedBox? {
    2. if let decrypetBox = try? ChaChaPoly.seal(value.data(using: .utf8)!, using: key) {
    3. return decrypetBox
    4. } else {
    5. return nil
    6. }
    7. }
    ... das hier machen:

    Quellcode

    1. static func decrypt(_ value: String) -> ChaChaPoly.SealedBox? {
    2. return try? ChaChaPoly.seal(value.data(using: .utf8)!, using: key)
    3. }


    Oder du möchtest sichergehen, dass decrypt einen Non-Optional zurückgibt. Dann kannst du statt eines Optionals z.B.. einen Error werfen, falls das decypten fehlschlägt:

    Quellcode

    1. static func decrypt(_ value: String) throws -> ChaChaPoly.SealedBox {
    2. guard let decrypetBox = try? ChaChaPoly.seal(value.data(using: .utf8)!, using: key) else {
    3. throw MyDecryptionFailedError()
    4. }
    5. return decrypetBox
    6. }

    VG
  • Ich habe es nun anders gelöst bekommen.
    Über sealedBox.combined bekommt man ein Data zurück, welches ich wiederum in den UserDefaults speichern kann.
    Somit benötige ich überhaupt keinen String