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];
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top