ObjC to Swift : chiffrage/déchiffrage AES

LeChatNoirLeChatNoir Membre, Modérateur
juin 2018 modifié dans API UIKit #1

Salut à tous,

Ca faisait bien longtemps :smiley:

Dans mon appli, je chiffre et déchiffre certains fichiers via une fonction Objective-C qui fait appelle à des fonctions crypto C. A chaque fois que je fais évoluer un module de l'appli, je m'astreins à le réécrire en Swift (c'est lourd...Android, ils ont Java depuis le début...).
J'ai donc un peu cherché comment le faire en Swift et il y a des solutions élégantes telles que celle-ci (désoler, je sais pas utiliser les marqueurs de code...) :
``
func aesCBCDecrypt(data:Data, keyData:Data) throws -> Data? {
let keyLength = keyData.count
let validKeyLengths = [kCCKeySizeAES128, kCCKeySizeAES192, kCCKeySizeAES256]
if (validKeyLengths.contains(keyLength) == false) {
throw AESError.KeyError(("Invalid key length", keyLength))
}

    let clearLength = size_t(data.count)
    var clearData = Data(count:clearLength)

    var numBytesDecrypted :size_t = 0
    let options   = CCOptions(kCCOptionPKCS7Padding)


    let cryptStatus = clearData.withUnsafeMutableBytes {cryptBytes in
        data.withUnsafeBytes {dataBytes in
            keyData.withUnsafeBytes {keyBytes in
               CCCrypt(CCOperation(kCCDecrypt),
                        CCAlgorithm(kCCAlgorithmAES128),
                        options,
                        keyBytes, keyLength,
                        dataBytes,
                        dataBytes+kCCBlockSizeAES128, clearLength,
                        cryptBytes, clearLength,
                        &numBytesDecrypted)
            }
        }
    }

    if UInt32(cryptStatus) == UInt32(kCCSuccess) {
        clearData.count = numBytesDecrypted
    }
    else {
        throw AESError.CryptorError(("Decryption failed", Int(cryptStatus)))
    }

    return clearData;
}

``
Mon problème est le suivant : ma clé ne fait pas forcément 32 de long (kCCKeySizeAES256). Ma clé est une String qui varie en longueur. Dans mon code Obj-C précédent, ça ne posait pas pb car le code transformait la clé en buffer de 32 de long, rempli de 0 dans lequel il venait copier la clé :

``char keyPtr[kCCKeySizeAES256+1]; // room for terminator (unused)
bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding)
// fetch key data
[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];

Et c'est ce buffer qu'on passait à la fonction de déchiffrage :

``CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
keyPtr, kCCKeySizeAES256,
NULL /* initialization vector (optional) /,
[self bytes], dataLength, /
input /
buffer, bufferSize, /
output */
&numBytesDecrypted);

Ma question est donc la suiante : en swift, comment faire pour réaliser l'équivalent. Je m'y suis cassé les dents qques heures :(

Si ça branche quelqu'un... ?

Réponses

Connectez-vous ou Inscrivez-vous pour répondre.