【发布时间】:2014-01-16 14:08:03
【问题描述】:
我在 iOS 项目中使用 RNCryptor 进行加密。该应用程序解密从服务器发送的 JSON 字符串。在服务器上,使用RNCryptor repo 中的 未修改 版本的 PHP 函数对字符串进行加密。
使用相同的密码加密所有字符串,返回的 base64 数据有时对于我传递给 RNCryptor PHP 加密函数的不同 JSON 字符串无效。在应用程序上,我在尝试从服务器解密数据时看到此错误: “操作无法完成。(net.robnapier.RNCryptManager 错误 -4301。)”
举几个例子,这个base64字符串被成功解密:
AwHwsZqlDpvAcmWX92UtkQSKcHOq18gLsLFtP4FujV3DtXVrtGL86CFY9KAs23HaAoYINTLH3ouUJPpyQEcfXni+rJUJghTFBB24kk52aU0GQ/8IIgfnXPUywUuNwD4n7DnweaS3DdmdhFBQIUpSaCEg4T5bMPhIvUAndVMvJwc/SjbhJoB+bUqRDcPYXPzMiEW1i4jea/ssE87PcX9/NZtfkoNyiY7KLRy/dhgsADde1Q==
然而,这个失败了:
AwHH7y0mnQvtWNCKa73jnS2DG63ylqDBc5iema3G6+/EkwPxiIkrPQHyJLvd3MO3mMIPsJjDK1C3uBCoHDc+Gzm0NJhBa08zs1twzZQ1jBdyt/q2AnGX99nku7MqF1oJOJ8nN1lriwYcFyvjBoBkEAAG28umjwxb5Y1t29dXtJzCwsrEVERs+SNkRE5C/j++bMPTV28EmR7LviyaMFAzpT+F5yUlLp2zRQgaQfyG8RlJTcvc+IqsrOisrDn7umDg+ii/Z9GDLlMkhu7OL1lHfcmD
似乎只有具有“=”字符的 base64 字符串才能成功解密。同样,我使用相同的密码来加密和解密这两个字符串。为什么 PHP 加密函数会这样?
附:传入的 JSON 字符串完全有效(使用 PHP json_encode() 函数生成)。
【问题讨论】:
-
=需要填充通常不适合 mime 的 8 位 -> 6 位转换的字符串。根据原始字符串的位长,mime 需要它们的存在。获取=或不获取=完全取决于原始字符串。您的第二个字符串比第一个字符串长得多,这意味着它在不编码时要长得多,而且这个长度“恰到好处”,不需要=填充。 -
密码前/后附加不同的盐?
-
您是否将发送到/从服务器的 base64 文本与客户端的 base64 文本进行比较?请注意,base64 不是 URL 证明,如果您使用例如发送它,则需要使用 URL 编码方案对 base64 进行编码。 HTTP GET。此外,并非所有客户端都能够处理很长的 URL,因此如果您使用 HTTP 发送数据,则可能需要使用 HTTP POST。
标签: php json encryption cryptography rncryptor