AES128は16バイトのデータブロックをキーを使って暗号化し、IVを16バイトのAESブロックに暗号化する必要があります。CCCryptのキーとしてNSDataを送る方法
私が見たすべてのCCCryptの例は、キーとIVの(NSString *)を取り入れています。私のキーとIVはNSData 16バイトです。 NSDataを16進文字列に変換しましたが、結果は正しくありません。このようにすると32バイトのAESブロックが得られます。
私の質問は、NSDataをconst void *としてCCCryptに読み込むためには何が必要なのですか?
- (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;
}
あなたはPKCS7パディングを指定しています。 PKCS7は少なくとも1バイトのパディングを追加するので、16バイトを暗号化すると2ブロックの16バイト= 32バイトの暗号化されたデータになります。 –
ありがとうございます。申し訳ありません、私はそれをテストに入れました。パディングがなければ16バイトを出しました。私は16バイトのNSDataをivPtrとkeyPtrのconst void *入力に変換する方法を尋ねています。 – Scott
ECBモードではIVが使用されません。デフォルトのCBCモードが必要です。 – zaph