私はPHPで値を暗号化しており、別のプログラマーがiPhoneアプリで値を復号化しています。私たちのどちらも、暗号化に精通しているとは言えません。このサイトや他の場所で見つけた情報から、すべてが正しいように見えます。iPhoneの男は、復号化プロセスから成功のリターンコードを取得したが、データの値がnullであると言っています。
PHP側は次のとおりです。
$key = getproperty("cryptkey","testkeytobechanged");
srand();
$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC), MCRYPT_RAND);
if (strlen($iv_base64 = rtrim(base64_encode($iv), '=')) != 22) return false;
$encrypted = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, md5($key), $iv_base64."::::".$authority->get_mobiuser()->get_message(), MCRYPT_MODE_CBC, $iv));
$rv = $iv_base64.$encrypted;
これはiPhone側にあるものです:
//We have compared the hex values after base64 decoding enough that I am satisfied there is not an issue at that point.
NSString *b = [[dict objectForKey:@"data"]objectForKey:@"nlbal"];
NSData *iv = [NSData dataFromBase64String:[[b substringToIndex:22]stringByAppendingString:@"=="]];
NSLog(@"IV %@", [iv description]);
NSString *e = [b substringFromIndex:22];
NSData *encrypted = [NSData dataFromBase64String:e];
NSLog(@"ENC %@", encrypted);
NSUInteger dataLength = [encrypted length];
uint8_t unencryptedData[dataLength + kCCKeySizeAES128];
size_t unencryptedLength;
//NSData *un = [encrypted AES128DecryptWithKey:[SessionManager md5:@"testkeytobechanged"] iv:iv];
//From my research, I understand this to be the correct form to match the encryption I use on the PHP side
CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,
kCCAlgorithmAES128, 0,
[[SessionManager md5:@"testkeytobechanged"]UTF8String],
kCCKeySizeAES128, [iv bytes],
[encrypted bytes], dataLength,
unencryptedData, dataLength, &unencryptedLength);
NSString *output = [[NSString alloc] initWithBytes:unencryptedData length:unencryptedLength encoding:NSUTF8StringEncoding];
// output = [[NSString alloc]initWithData:un encoding:NSUTF8StringEncoding];
//NSLog(@"un %@", [un description]);
NSLog(@"OUTPUT %i %@", cryptStatus, output);
上で述べたように、このコードは明らかに成功コードを生成しますが、null値を持っています。