Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在objective-c中分离AES加密中的密钥和IV_C#_Objective C_Encryption_Aes - Fatal编程技术网

C# 在objective-c中分离AES加密中的密钥和IV

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

我正在尝试将我的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值,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方法将正确工作。但你的解决方案也会奏效。