2015-11-05 67 views
1

问题完美的工作是在IOS随机生成的PHP IV未在IOS

解码的情况是我使用Blowfish算法CBC模式时的基64编码的四(在PHP)不匹配。简单的服务器(PHP)生成一个随机加密IV 和编码的base64格式,发送到IOS。 问题在这里,当我尝试解码时,解码结果总是不正确。有时它会产生正确的和剩余的时间错误。

这是我的PHP代码。

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= 

这里是我的IOS代码。

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èñ[¼,但实际的结果应该是ħ<Ézèñ[¼

我试图

NSWindowsCP1252StringEncoding , NSISOLatin1StringEncoding ,  NSUTF8StringEncoding 

但是他们都无法产生准确的结果(约。 10次​​测试我找到了)。

在此先感谢!

+1

不要使用'MCRYPT_RAND' - 它没有任何随机性,它不是密码安全的。改为使用'MCRYPT_DEV_URANDOM'。 – Narf

+0

你尝试过'NSUTF32StringEncoding'吗? –

+0

没有工作@Albert Renshaw –

回答

1

你应该打印出十六进制结果,然后进行比较。

看起来,两个平台上的编码是相同的(你不应该认为是理所当然的),所以你会得到相同的字符。但是,不确定您正在使用的字体的或字体版本是否显示字符。也可能是一个平台显示未知编码序列的字符,而另一个平台不显示任何内容。

这给我们带来了一个基本问题:如果您解码随机字节值,那么您可能会遇到不转换为字符的字节序列。因此,通过将二进制字符串转换为可打印字符串来比较二进制字符串并不好相反,您需要直接比较字节(例如,通过将IV保存到iv.bin文件)或将它们转换为十六进制。

尽管打印输出不同,但IV很可能是相同的。

+0

是的,它的工作!谢谢 –