Ich muss AES128 einen 16-Byte-Block von Daten mit einem Schlüssel und einem IV zu einem 16-Byte-AES-Block verschlüsseln.So senden Sie NSData als Schlüssel und IV für CCCrypt
Jedes CCCrypt-Beispiel, das ich gesehen habe, nimmt (NSString *) für Schlüssel und IV auf. Mein Schlüssel und IV sind NSData 16 Bytes. Ich habe die NSData in Hexadezimalstrings umgewandelt, aber das Ergebnis ist nicht korrekt. Ich bekomme einen AES-Block von 32 Bytes, wenn ich es so mache.
Also meine Frage ist, was muss ich tun, um NSData in CCCrypt als const void * gelesen zu bekommen?
- (NSData *)AES128Operation:(CCOperation)operation key:(NSString *)key iv:(NSString *)iv theData:(NSData *)theData
{
char keyPtr[kCCKeySizeAES128 + 1];
bzero(keyPtr, sizeof(keyPtr));
[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
char ivPtr[kCCBlockSizeAES128 + 1];
bzero(ivPtr, sizeof(ivPtr));
if (iv) {
[iv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];
}
NSUInteger dataLength = [theData length];
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize);
size_t numBytesEncrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(operation,
kCCAlgorithmAES128,
kCCOptionECBMode,
keyPtr,
kCCBlockSizeAES128,
ivPtr,
[theData bytes],
dataLength,
buffer,
bufferSize,
&numBytesEncrypted);
if (cryptStatus == kCCSuccess) {
return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
}
free(buffer);
return nil;
}
Sie angeben PKCS7 Padding. PKCS7 fügt mindestens 1 Byte Padding hinzu, so dass die Verschlüsselung von 16 Bytes Sie in 2 Blöcke von 16 Bytes = 32 Byte verschlüsselter Daten versetzt. –
Danke. Tut mir leid, ich habe das nur zum Testen eingegeben. Ich habe 16 Bytes bekommen, als das Padding nicht da war. Ich frage, wie man 16 Byte NSData in den const void * Eingang für ivPtr und keyPtr konvertiert. – Scott
ECB-Modus verwendet keine IV, vielleicht brauchen Sie den CBC-Modus, der die Standardeinstellung ist. – zaph