我想使用AES对Objective-C中的密码进行加密,然后使用PHP解密,但我遇到了两个问题。使用AES进行Objective-C加密并使用PHP解密
- 我加密密码,但它是一个
NSData
对象,所以我用Base64编码,但是当我在PHP解码,结果是nil
。所以我不能解密它。 - 我可以在Objective-C中加密和解密密码,所以它是PHP的问题,但是当我使用AES进行加密然后使用base64进行编码时,结果并不相同。
这里是我的代码:
PHP:
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$key = "a16byteslongkey!";
$plaintext = "iphone";
$ciphertext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $plaintext, MCRYPT_MODE_ECB, $iv);
$ciphertext = base64_encode($ciphertext);
echo "ciphertext: ".$ciphertext."<br/>";
$ciphertext = base64_decode($ciphertext);
$plaintext = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $ciphertext, MCRYPT_MODE_ECB, $iv);
echo "plaintext: ".$plaintext."<br/>";
输出:
ciphertext: SXNepKfh0IrlDDdkq4EdmQ==
plaintext: iphone
的Objective-C:(此处获取完整的源代码:https://gist.github.com/838614)
NSString *key = @"a16byteslongkey!";
NSString *plaintext = @"iphone";
NSString *ciphertext = [plaintext AES256EncryptWithKey: key];
NSLog(@"ciphertext: %@", ciphertext);
plaintext = [ciphertext AES256DecryptWithKey: key];
NSLog(@"plaintext: %@", plaintext);
输出:
ciphertext: D19l3gsgXJlrLl7B2oCT6g==
plaintext: iphone
我kCCKeySizeAES128取代kCCKeySizeAES256,并以“kCCOptionPKCS7Padding取代 “kCCOptionPKCS7Padding” | kCCOptionECBMode”,
马上就好像你在PHP中使用128,在Obj-C中使用256 ......这将是一个问题。 –
感谢您的回复,我用kCCKeySizeAES128替换了kCCKeySizeAES256,并用“kCCOptionPKCS7Padding&kCCOptionECBMode”替换了“kCCOptionPKCS7Padding”,但结果也不一样。有什么细节我应该改变? – pcrazyc
你似乎是'base64_encode'在PHP中产生的字符串,但只是将其转换为Obj-C中的UTF8。显然,结果会有所不同。 –