0

在服务器上进行 AES256 加密,在 ios 上进行解密。很长一段时间都没有用,但我决定在加密之前对文本进行 64 位编码。

不小心我在 base64_encode($source) 周围放了大括号,然后就开始工作了。所以现在这个错误的代码有效(在 ios 上解密得很好):

$ciphertext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, "base64_encode($source)", MCRYPT_MODE_CBC, $iv);

正确的事情根本不起作用:

$ciphertext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, base64_encode($source), MCRYPT_MODE_CBC, $iv);

如果这会有所作为,请使用 cake php。什么是错的,有什么区别?为什么大括号可以使事情正常工作而没有大括号它只会在解密时失败?对不起,如果这是一个非常愚蠢的问题,但我是密码学的新手。

4

1 回答 1

0

您应该对纯文本进行字符编码(例如,使用 UTF-8,PHP 中有一个 utf8-encode 函数),然后如果要将结果作为字符串传输,则对结果进行 base64 编码。

请注意,mcrypt_encrypt() 的输出将无法与随机字节区分开来。这意味着可以输出任何字节,包括那些不是有效字符编码的字节(例如 00h 值字节或 C 中的 EOF)。由于 IV 是随机的(希望如此),有时一切看起来都很漂亮,有时您的解密会因为无效字符而失败。

使用加密,如果您不能完全控制(字符)编码/解码原则(没有那么多加密/解密),那么您可能偶尔会得到意想不到结果——这正是您在编程时需要避免的事情。

于 2012-07-01T23:50:22.460 回答