AES128'e bir anahtar ve 16 baytlık bir AES bloğuyla IV bir 16 bayt veri bloğu şifrelemesi gerekir.CCCrypt için NSData anahtarı ve IV nasıl gönderilir
Gördüğüm her CCCrypt örneği, anahtar ve IV için (NSString *) içeriyor. Anahtarım ve IV NSData 16 bayttır. NSData'yı hex dizelerine dönüştürdüm, ancak sonuç doğru değil. Bunu yaptığımda 32 baytlık bir AES bloğu alıyorum.
Benim sorum şu, NSData'nın CCCrypt'e const void * olarak okunmasını sağlamak için ne yapmalıyım?
- (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;
}
Sen PKCS7 Geciktirme belirtiyorsanız. PKCS7 en az 1 bayt dolgu ekler, böylece 16 bayt şifrelemek sizi 2 bayt 16 bayta = 32 bayt şifrelenmiş veriye itecektir. –
Teşekkürler. Üzgünüm, bunu test etmek için koydum. Dolgu yokken 16 bayt aldım. Ben 16 byte NSData ivPtr ve keyPtr için const void * girişi dönüştürmek için nasıl dönüştürüyorum. – Scott
ECB modu bir IV kullanmaz, belki de varsayılan olan CBC moduna ihtiyacınız vardır. – zaph