随机生成的 PHP IV 在 IOS 中无法正常工作
Random generated PHP IV is not working perfectly in IOS
问题是 base 64 编码的 iv(in PHP) 在 IOS
中解码时不匹配
场景是我正在使用 Blowfish 算法 CBC 模式。只需服务器(PHP)生成一个随机加密IV
和编码的 base64 格式,发送到 IOS。
问题出在这里,当我尝试解码时,解码结果总是不正确。有时它会产生正确的和其余时间的错误。
Here is my PHP code.
public function ivGenerator()
{
$ivSize = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($ivSize, MCRYPT_RAND);
echo base64_encode($iv);
}
这是 ivGenerator 的两个结果集,稍后我将用它来解码
bTpkpLxMbNo=
aIvJeujxW7w=
Here is my IOS code .
NSString *ecodedIVString = @"bTpkpLxMbNo=";
NSData *ecodedIVData= [[NSData alloc] initWithBase64EncodedString:ecodedIVString options:0];
NSString *decodeIVString = [[NSString alloc] initWithData:ecodedIVData encoding:NSASCIIStringEncoding];
NSLog(@"decodeIVString %@" , decodeIVString); // m:d¤¼LlÚ //its correct
如果我使用 ,
NSString *ecodedIVString = @"aIvJeujxW7w=";
那么结果是 hÉzèñ[¼ ,但实际结果应该是 h‹Ézèñ[¼
我试过了
NSWindowsCP1252StringEncoding , NSISOLatin1StringEncoding , NSUTF8StringEncoding
但是他们都无法生成准确的结果(我找到了大约10次测试)。
提前致谢!
您应该以十六进制打印出结果,然后进行比较。
两个平台上的编码似乎是相同的(你不应该想当然)所以你得到相同的字符。但是,不确定您使用的 font 或 font version 是否显示字符。也可能是一个平台显示未知编码序列的 ‹
字符,而另一个平台根本不显示任何内容。
这给我们带来了一个基本问题:如果您对随机字节值进行解码,那么您可能会遇到无法转换为字符的字节序列。因此,通过将二进制字符串转换为可打印字符串来比较二进制字符串是不好的。相反,您需要直接比较字节(例如,通过将 IV 保存到 iv.bin
文件)或将它们转换为十六进制。
尽管打印输出不同,但 IV 极有可能是相同的。
问题是 base 64 编码的 iv(in PHP) 在 IOS
中解码时不匹配场景是我正在使用 Blowfish 算法 CBC 模式。只需服务器(PHP)生成一个随机加密IV 和编码的 base64 格式,发送到 IOS。 问题出在这里,当我尝试解码时,解码结果总是不正确。有时它会产生正确的和其余时间的错误。
Here is my PHP code.
public function ivGenerator()
{
$ivSize = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($ivSize, MCRYPT_RAND);
echo base64_encode($iv);
}
这是 ivGenerator 的两个结果集,稍后我将用它来解码
bTpkpLxMbNo=
aIvJeujxW7w=
Here is my IOS code .
NSString *ecodedIVString = @"bTpkpLxMbNo=";
NSData *ecodedIVData= [[NSData alloc] initWithBase64EncodedString:ecodedIVString options:0];
NSString *decodeIVString = [[NSString alloc] initWithData:ecodedIVData encoding:NSASCIIStringEncoding];
NSLog(@"decodeIVString %@" , decodeIVString); // m:d¤¼LlÚ //its correct
如果我使用 ,
NSString *ecodedIVString = @"aIvJeujxW7w=";
那么结果是 hÉzèñ[¼ ,但实际结果应该是 h‹Ézèñ[¼
我试过了
NSWindowsCP1252StringEncoding , NSISOLatin1StringEncoding , NSUTF8StringEncoding
但是他们都无法生成准确的结果(我找到了大约10次测试)。
提前致谢!
您应该以十六进制打印出结果,然后进行比较。
两个平台上的编码似乎是相同的(你不应该想当然)所以你得到相同的字符。但是,不确定您使用的 font 或 font version 是否显示字符。也可能是一个平台显示未知编码序列的 ‹
字符,而另一个平台根本不显示任何内容。
这给我们带来了一个基本问题:如果您对随机字节值进行解码,那么您可能会遇到无法转换为字符的字节序列。因此,通过将二进制字符串转换为可打印字符串来比较二进制字符串是不好的。相反,您需要直接比较字节(例如,通过将 IV 保存到 iv.bin
文件)或将它们转换为十六进制。
尽管打印输出不同,但 IV 极有可能是相同的。