web-dev-qa-db-fra.com

Swift - Crypter et décrypter une chaîne en utilisant un mot de passe utilisateur

J'essaie de chiffrer une chaîne à l'aide d'un mot de passe dans Swift mais je ne sais pas comment le faire. J'ai besoin de quelque chose qui fonctionne comme ça comme ci-dessous

let password = "password"
let message = "messageToEncrypt"
let encryptedMessage = encrypt(message, password)
...

let decryptedMessage = decrypt(encryptedMessage, password)

Tout conseil serait très apprécié.

Merci 

UPDATE<- Suppression de cette section maintenant

MISE À JOUR 2

Ok j'ai maintenant ce qui suit:

 func testEnc() throws {

    let ivKey = "tEi1H3E1aj26XNro"
    let message = "Test Message"
    let password = "pass123"

    let aesKey = password.padding(toLength: 32, withPad: "0", startingAt: 0)

    do {
        let messageArray = Array(message.utf8)
        let encrypted = try AES(key: aesKey, iv: ivKey, blockMode: .CBC, padding: .pkcs7).encrypt(messageArray)
        let encryptedString = String.init(bytes: encrypted, encoding: .utf8)
        let decrypted = try AES(key: aesKey, iv: ivKey, blockMode: .CBC, padding: .pkcs7).decrypt(encrypted)
        let decryptedString = String.init(bytes: decrypted, encoding: .utf8)
        assert(message == decryptedString)
    } catch {
        print(error)
    }
}

Dans le code ci-dessus, le message est correctement chiffré et déchiffré à nouveau.

decryptedString renvoie la même valeur que message, ce qui est parfait. Cependant, j'ai besoin de stocker la valeur cryptée. Dans le code ci-dessus, encryptedString renvoie toujours nil. Est-ce qu'un Array<UInt8> crypté en AES n'est pas classé en tant que chaîne d'octets?

4
Matthew Cawley

Une des bibliothèques les plus populaires est CryptoSwift (plus de 4000 étoiles!). Il fournit de nombreuses fonctionnalités liées à la cryptographie qui pourraient vous intéresser. 

Pour votre question, je suppose que vous souhaitez utiliser le cryptage basé sur AES et que le message est petit (mais plus bas, il existe un exemple pour les fichiers plus volumineux, etc.). En utilisant la bibliothèque mentionnée ci-dessus, le code (tiré de la page de la bibliothèque elle-même - s'il vous plaît faites défiler vers le bas):

do {
    let aes = try AES(key: "passwordpassword", iv: "drowssapdrowssap") 
    let ciphertext = try aes.encrypt(Array("Nullam quis risus eget urna mollis ornare vel eu leo.".utf8))
} catch { }

Une des questions posées est de savoir comment obtenir une IV (vecteur d'initialisation). Dans cet exemple, le vecteur d'initialisation est simplement l'inverse du mot de passe, ce qui peut ne pas être une bonne idée dans les applications du monde réel. Le principe en vigueur est que l'IV n'a pas besoin d'être secret. Cela doit juste être aléatoire, et si possible, unique. Ainsi, vous pouvez enregistrer le vecteur IV avec le fichier, dans une base de données contenant le texte chiffré.

1
mgeek