我正在尝试在目标C中加密AES256中的json以发送到一个服务器并使用以下行解密它:
MCRYPT_DECRYPT(MCRYPT_RIJNDAEL_256,$ key,base64_decode($ ha),MCRYPT_MODE_ECB,NULL));
花了几天时间进行搜索和测试,但我还没有得到结果。我正在使用的代码是:
- (NSString *)AES256EncryptData:(NSData *) datos {
//NSData * datos = [json dataUsingEncoding:NSUTF8StringEncoding];
UIApplication *aplicacion = [UIApplication sharedApplication];
AppDelegate *delegate = (AppDelegate *) aplicacion.delegate;
char keyPtr[kCCKeySizeAES256+1];
bzero(keyPtr, sizeof(keyPtr));
[delegate.appKey getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding ];
NSUInteger dataLength = [datos length];
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize);
size_t numBytesEncrypted;
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
kCCAlgorithmAES128,
kCCOptionECBMode + kCCOptionPKCS7Padding,
keyPtr,
kCCKeySizeAES256,
NULL,
[datos bytes],
[datos length],
buffer,
bufferSize,
&numBytesEncrypted);
if (cryptStatus == kCCSuccess) {
NSData *returnData = [[NSData alloc] initWithBytes:buffer length:numBytesEncrypted];
return [returnData base64EncodedStringWithOptions:0];
}
free(buffer);
return nil;
}
答案 0 :(得分:0)
根据您使用的加密算法,您可以永远尝试。您当前正在使用MCRYPT_RIJNDAEL_256
,这是具有256 块大小的Rijndael分组密码。您应该使用MCRYPT_RIJNDAEL_128
(也称为AES),然后执行PKCS#7 unpadding yourself。
你确实应该提供恰当数量的关键字节,对于AES,它应该是16,24或32字节。显然,关键字节必须与您在C#代码中使用的字符匹配。
如果您无法更改服务器代码,则应为IOS制作/编译mcrypt,并为该特定API实现相同的功能。至少它会兼容。不幸的是,您似乎必须do the porting yourself。