我一直无法使用AES加密尝试在PHP和我的iOS应用程序之间进行通信.
到目前为止,我已经考虑了两种实现方法.第一个是使用OpenSSL.
在iOS方面,我实现了一种模仿这里显示的代码的方法:http://saju.net.in/code/misc/openssl_aes.c.txt.
在PHP方面,我使用生成的密钥和IV(来自iPhone)并将其用作PHP openssl加密的输入.
结果在输出方面有所不同......
我也考虑过:http://iphonedevelopment.blogspot.com/2009/02/strong-encryption-for-cocoa-cocoa-touch.html
但是这个帖子:iOS和PHP之间的AESCrypt解密让我震惊.
该项目并不局限于AES,它看起来像一个强大的加密算法,实现起来并不难.
我的基本问题是:实现可以轻松用于iOS和PHP之间通信的良好加密算法的最简单方法是什么?
我有一个加密的文本,我需要解密.它是用AES-256-CBC加密的.我有加密的文本,密钥和iv.然而,无论我尝试什么,我似乎无法让它工作.
互联网已经建议mcrypt的Rijndael密码能够做到这一点,所以这就是我现在所拥有的:
function decrypt_data($data, $iv, $key) {
$cypher = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');
// initialize encryption handle
if (mcrypt_generic_init($cypher, $key, $iv) != -1) {
// decrypt
$decrypted = mdecrypt_generic($cypher, $data);
// clean up
mcrypt_generic_deinit($cypher);
mcrypt_module_close($cypher);
return $decrypted;
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
现在,我得到2个警告,输出是胡言乱语:
Warning: mcrypt_generic_init() [function.mcrypt-generic-init]: Key size too large; supplied length: 64, max: 32 in /var/www/includes/function.decrypt_data.php on line 8
Warning: mcrypt_generic_init() [function.mcrypt-generic-init]: Iv size incorrect; supplied length: 32, needed: 16 in /var/www/includes/function.decrypt_data.php on line 8
Run Code Online (Sandbox Code Playgroud)
任何帮助,将不胜感激.
我已经能够在php和objective-c代码中成功加密和解密AES-256.我不会在这里发布任何代码,因为我已经尝试了很多种类,但没有工作.我不知道这些加密函数是如何工作的...... AES是一种标准化的算法,所以为什么它在我的想法中不起作用归结为
a)iv
b)一些编码错误
或
c)填充的差异(应该与解密无关).
如果某人的AES功能同时适用于php和objective-c,那将是非常好的,但如果没有,那么理解导致这些不同结果的原因的任何帮助都将受到赞赏.
如果你想要一个更窄的问题,那就是这个AES密码的编码,iv和块大小.
1)在密钥和明文/密文方面使用什么编码是否重要?基本上我猜测它不是纯文本的问题,因为我将使用的所有字符(至少在测试期间)是标准的ASCII符号.但是,让我们说php字符串是ASCII,我在objective-c中使用UTF8 ...我不知道如果php使用ASCII或如果字节即.两者之间的关键是不同的.
2)据我所知,ECB模式不使用iv(如果错误则更正).CBC模式使用iv.在这种情况下,iv必须与密文一起记录.现在这个键在php中是16或32个字符长(取决于128对256块大小).这意味着16或32个字节?当转换为字节时,字符串1234567890123456789012在ASCII和UTF8中是否相同?
3)根据算法,块大小和密钥大小有什么区别?(再次纠正如果错误)基本上他们都是相同的算法只是不同的参数?使用256位密钥和128位密钥只是传递了哪个密钥
(另请注意,我一直在使用base64编码在应用程序之间传输字符串以进行测试)
谢谢,以利亚