Come per cifrare un NSString in Objective C con DES in ECB-Mode?
Domanda
Sto cercando di cifrare un NSString in Objective C su iPhone. Almeno io wan't per ottenere una stringa come "TmsbDaNG64lI8wC6NLhXOGvfu2IjLGuEwc0CzoSHnrs =" quando ho codificare "ci = foo; pw = bar; pwAlg = false;" usando questa chiave:. "testtest"
Il mio problema per ora è, che CCCrypt restituisce sempre. "4300 - Errore parametro" e non ho idea del perché più
Questo è il mio codice (il risultato di 5 ore di Google e try'n'error):
NSString *token = @"us=foo;pw=bar;pwAlg=false;";
NSString *key = @"testtest";
const void *vplainText;
size_t plainTextBufferSize;
plainTextBufferSize = [token length];
vplainText = (const void *) [token UTF8String];
CCCryptorStatus ccStatus;
uint8_t *bufferPtr = NULL;
size_t bufferPtrSize = 0;
size_t *movedBytes;
bufferPtrSize = (plainTextBufferSize + kCCBlockSize3DES) & ~(kCCBlockSize3DES - 1);
bufferPtr = malloc( bufferPtrSize * sizeof(uint8_t));
memset((void *)bufferPtr, 0x0, bufferPtrSize);
// memset((void *) iv, 0x0, (size_t) sizeof(iv));
NSString *initVec = @"init Vec";
const void *vkey = (const void *) [key UTF8String];
const void *vinitVec = (const void *) [initVec UTF8String];
ccStatus = CCCrypt(kCCEncrypt,
kCCAlgorithmDES,
kCCOptionECBMode,
vkey, //"123456789012345678901234", //key
kCCKeySizeDES,
NULL,// vinitVec, //"init Vec", //iv,
vplainText, //"Your Name", //plainText,
plainTextBufferSize,
(void *)bufferPtr,
bufferPtrSize,
movedBytes);
NSString *result;
NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes];
result = [myData base64Encoding];
Soluzione
cifratura DES in modalità BCE utilizza una dimensione di blocco 8 byte, e codifica blocca ciascuna individualmente. Il problema è che la stringa di input non divide in 8 byte di parità, il cryptor non sa cosa fare con blocco finale non 8 byte.
La correzione è quello di permettere la cryptor per riempire il blocco finale con l'aggiunta di kCCOptionPKCS7Padding alle opzioni a CCCrypt. per esempio (frammento da una categoria di crittografia NSData):
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
kCCAlgorithmDES,
kCCOptionPKCS7Padding | kCCOptionECBMode,
keyPtr,
kCCKeySizeDES,
NULL,
[self bytes],
dataLength,
buffer,
bufferSize
&numBytesEncrypted);
Date un'occhiata a questo postale per maggiori dettagli per quanto riguarda gli algoritmi di imbottitura . Spero che questo aiuti.