我正在尝试加密服务器上的字符串并将其发送到我的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 00 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 c c c cc c c c c c c
base64-
fwqkKsopev3Xmu4BF4OE5Q==
有人能引导我找到解决方案吗?
区别在于填充。PHP解决方案不执行标准化的填充机制。相反,它使用零填充,如果纯文本以一个00
h值字节的字符串结束,这可能会导致麻烦,因为它们将通过取消添加机制(或任何trim
或right_trim
方法)从纯文本中删除。
您应该像CCCrypt一样,在PHP中加密之前填充纯文本。CCCrypt使用一种很好的标准化填充模式,称为PKCS#7填充。此模式总是填充1到16(块大小)字节。字节的值与填充字节的数量相同。在您的示例中,它是十六进制的0C
h,或12个填充字节。
请查看StackOverflow的链接,了解如何在PHP中填充/取消填充。填充/取消填充总是在原始纯文本上执行,而不是在密文上执行。
请注意,您的密文可能是用IV值预先固定的。这前16个字节不应该被解密。它们应该被用作IV,并被解密函数跳过。通常,应该为每个加密创建一个新的IV值。否则,您将能够查看(的开头)明文是否与之前的明文相同。随机IV为每次加密改变整个密文。