我想使用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。顯然,結果會有所不同。 –