【问题标题】:Separating key and IV in AES encryption in objective-c在objective-c中分离AES加密中的密钥和IV
【发布时间】:2014-07-26 03:06:20
【问题描述】:

我正在尝试将我的 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 );

【问题讨论】:

    标签: c# objective-c encryption aes


    【解决方案1】:

    你可以使用:

    - (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];
    

    缓冲区: 用于存储来自接收方的字节的缓冲区。返回的字节不是以 NULL 结尾的。

    最大缓冲区计数: 写入缓冲区的最大字节数。

    usedBufferCount: 从缓冲区使用的字节数。 如果不需要此值,则传递 NULL。

    编码: 用于返回字节的编码。

    选项: 一个掩码,用于指定用于将接收器的内容转换为编码的选项(如果需要转换)。你可以传NULL。

    范围: 接收器中要获取的字符范围。

    剩下的: 剩余范围。 传递NULL如果你不需要这个值。

    【讨论】:

    • 是的,那行得通。有趣的。实际上,我已经通过简单地使用[transferredObject substringWithRange:NSMakeRange()] 方法解决了这个问题,如果 Key 和 IV 是 NSString 类型,CCCrypt 方法将正确运行。但是您的解决方案也可以。
    猜你喜欢
    • 2012-02-21
    • 2022-01-22
    • 1970-01-01
    • 2018-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多