[英]Separating key and IV in AES encryption in objective-c
我试图将我的AES加密类从c#转换为Objective-c(我对Objective-c还是个新手),对一件事有些困惑。 我正在像c#这样从单个传输的对象创建密钥和初始化矢量对象:
Mode = CipherMode.CBC;
Padding = PaddingMode.PKCS7;
KeySize = 256;
Key = Encoding.UTF8.GetBytes(transferredObject.Substring(x1, x2));
IV = Encoding.ASCII.GetBytes(transferredObject.Substring(y1, y2));
其中x和y是int值,表示特定范围,而transferObject是String。 添加,然后我可以使用Key&IV进行加密/解密过程。
我知道,在Objective-C中我应该使用这种方法:
CCCryptorStatus cryptStatus = CCCrypt( kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
key, kCCKeySizeAES256, iv,
[self bytes], dataLength,
buffer, bufferSize,
&numBytesEncrypted);
加密和类似的解密方法,但是我找不到方法,如何获取我的密钥和iv对象。 Objective-C的示例通常显示如下内容:
[key getCString:keyPtr maxLength:sizeof( keyPtr ) encoding:NSUTF8StringEncoding];
因此,如果我在Objective-C中具有相同的单个NSString * transferredObject
对象,如何获得密钥和IV?
可接受答案中的解决方案将起作用。 另一个解决方案是使用NSString substringToIndex方法。
将如下所示:
NSString* IV = [key substringWithRange:NSMakeRange(x1, x2)];
NSString* Key = [key substringWithRange:NSMakeRange(y1, y2)];
char ivPtr[kCCKeySizeAES128 + 1];
bzero(ivPtr, sizeof(ivPtr));
[IV getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];
char keyPtr[kCCKeySizeAES256+1]; // room for terminator (unused)
bzero( keyPtr, sizeof( keyPtr ) ); // fill with zeroes (for padding)
[Key getCString:keyPtr maxLength:sizeof( keyPtr ) encoding:NSWindowsCP1251StringEncoding];
CCCryptorStatus cryptStatus = CCCrypt( kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
keyPtr, kCCKeySizeAES256,
ivPtr,
[self bytes], dataLength,
buffer, bufferSize,
&numBytesDecrypted );
您可以使用:
- (BOOL)getBytes:(void *)buffer maxLength:(NSUInteger)maxBufferCount usedLength:(NSUInteger *)usedBufferCount encoding:(NSStringEncoding)encoding options:(NSStringEncodingConversionOptions)options range:(NSRange)range remainingRange:(NSRangePointer)leftover
例:
int keyLength = kCCKeySizeAES256, x1=0, x2=keyLength;
int ivLength = kCCBlockSizeAES128, y1=keyLength, y2=ivLength;
u_int8_t key[keyLength*2];
u_int8_t iv[ivLength*2];
BOOL keySuccess = [transferredObject getBytes:key maxLength:keyLength usedLength:NULL encoding:NSASCIIStringEncoding options:0 range:NSMakeRange(x1, x2) remainingRange:NULL];
BOOL ivSuccess = [transferredObject getBytes:iv maxLength: ivLength usedLength:NULL encoding:NSASCIIStringEncoding options:0 range:NSMakeRange(y1, y2) remainingRange:NULL];
buffer:一个缓冲区,用于存储来自接收器的字节。 返回的字节不是以NULL结尾的。
maxBufferCount:要写入缓冲区的最大字节数。
usedBufferCount:缓冲区使用的字节数。 如果不需要此值,则传递NULL 。
encoding:用于返回字节的编码。
options:一个掩码,用于指定用于将接收者的内容转换为编码(如果需要转换)的选项。 您可以传递NULL
。
range:接收器中要获取的字符范围。
剩余部分:剩余范围。 如果您不需要此值,则传递NULL 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.