ObjC to Swift : chiffrage/déchiffrage AES
Salut à tous,
Ca faisait bien longtemps
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
Ça a visiblement déjà branché quelqu'un