【问题标题】:RNCryptor PHP encrypt function returns invalid base64 dataRNCryptor PHP 加密函数返回无效的 base64 数据
【发布时间】: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


【解决方案1】:

经过多次调试,问题原来是我在 iOS 上使用的 base64 解码器。我最初使用blog post 中的 NSData+Base64 类别。这是有缺陷的。

我最终使用了实现here。现在一切都解密得很好。 :)

【讨论】:

  • 很高兴您找到了 MachOSX,感谢您的更新。不要忘记接受您自己的答案(一段时间后),这样该问题就会被视为已回答。
  • 你用iOS 7原生base64解密了吗?
猜你喜欢
  • 2017-03-02
  • 1970-01-01
  • 2012-11-18
  • 1970-01-01
  • 1970-01-01
  • 2021-10-12
  • 1970-01-01
  • 2020-03-18
  • 2015-02-05
相关资源
最近更新 更多