C# 在objective-c中分离AES加密中的密钥和IV
我正在尝试将我的AES加密类从c#转换为objective-c(我对objective-c非常陌生),但有一点困惑。我正在从单个传输对象创建我的键和初始化向量对象,如c#:C# 在objective-c中分离AES加密中的密钥和IV,c#,objective-c,encryption,aes,C#,Objective C,Encryption,Aes,我正在尝试将我的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(transferred
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值,transferredObject是字符串。添加,然后我可以使用Key&IV进行加密/解密过程
我知道,在objective-c中,我应该使用以下方法:
CCCryptorStatus cryptStatus=CCCrypt,
钥匙,kCCKeySizeAES256,iv,
[self bytes],数据长度,
缓冲区,缓冲区大小,
&(未加密);
用于加密和类似的解密方法,但我找不到一种方法,如何获取我的密钥&iv对象。objective-c的示例通常显示如下内容:
[key-getCString:keyPtr-maxLength:sizeof(keyPtr)编码:NSUTF8StringEncoding];
那么,如果我在objective-c中有相同的NSString*transferredObject
对象,我如何获得我的key&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)编码:NSUTF8StringEncoding];
char keyPtr[kCCKeySizeAES256+1];//端子室(未使用)
bzero(keyPtr,sizeof(keyPtr));//用零填充(用于填充)
[Key getCString:keyPtr maxLength:sizeof(keyPtr)编码:NSWindowsCP1251String编码];
CCCryptorStatus cryptStatus=CCCrypt(kCCDecrypt,kCCAlgorithmAES128,kCCOptionPKCS7Padding,
keyPtr,kCCKeySizeAES256,
ivPtr,
[self bytes],数据长度,
缓冲区,缓冲区大小,
&不加密);
您可以使用:
- (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结尾的
maxBufferCount:
要写入缓冲区的最大字节数
usedBufferCount:
从缓冲区使用的字节数如果不需要此值,则传递NULL
编码:
用于返回字节的编码
选项:
用于指定用于将接收器内容转换为编码(如果需要转换)的选项的掩码。您可以传递NULL
范围:
接收器中要获取的字符范围
剩菜:
剩余的范围如果您不需要此值,请传递NULL。是的,可以。有趣。实际上,我已经通过简单地使用
[transferredObject substringWithRange:nsMakerRange()]
方法解决了这个问题,如果Key和IV是NSString类型,那么CCCrypt方法将正确工作。但你的解决方案也会奏效。