繁体   English   中英

在Objective-C中将AES加密中的密钥和IV分开

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM