0

我正在尝试加密服务器上的字符串并将其发送到我的 iPhone。

当我在我的 iphone 上加密并将其发送到我的服务器上解密时,一切都很好。

但是当我试图在我的服务器(php page)上加密时,我无法在我的 iPhone 上解密它。

例如:当我在我的 PHP 上加密“True”时,我得到:

ca 82 66 c8 是 5a a9 fb d8 7f 25 b6 1e f0 fb 68 54 72 75 65 0 0 0 0 0 0 0 0 0 0 0 0

然后我正在做一些 - base64

yoJmyL5aqfvYfyW2HvD7aA== 当我将它发送到我的 iPhone 时,我无法正确解密它..

但是当我试图在我的 Iphone 上加密“True”时,我得到:

ca 82 66 c8 是 5a a9 fb d8 7f 25 b6 1e f0 fb 68 54 72 75 65 ccccc ccccccc

base64-

fwqkKsopev3Xmu4BF4OE5Q==

有人可以指导我找到解决方案吗?

4

1 回答 1

2

不同之处在于填充。PHP 解决方案不执行标准化的填充机制。相反,它使用零填充,如果纯文本以 h 值字节的字符串结尾,这可能会导致麻烦,00因为它们将通过取消填充机制(或任何trimright_trim方法)从纯文本中删除。

您应该在 PHP 中加密之前填充纯文本,就像 CCCrypt 一样。CCCrypt 使用一种良好的标准化填充模式,称为 PKCS#7 填充。这种模式总是填充 1 到 16(块大小)字节。字节的值与填充字节的数量相同。在您的示例中,它是0C十六进制的 h 或 12 个填充字节。

查看这个 StackOverflow 链接,了解如何在 PHP 中填充/取消填充。填充/取消填充总是在原始纯文本上执行,而不是在密文上。

请注意,您的密文可能以 IV 值作为前缀。这些前 16 个字节不应被解密。它们应该用作 IV 并被解密函数跳过。通常应该为每个加密创建一个新的 IV 值。否则,您将能够查看(开始)明文是否与之前的明文相同。随机 IV 更改每次加密的整个密文。

于 2013-06-22T18:39:32.767 回答