我正在进行的iOS和Android项目要求我们打开一个连接到第三方网站的3rd视图。问题是,我们调用的URL必须附带一些参数,这些参数使用带有ECB模式的Blowfish加密。
这个第三方使用PHP加密/解密参数,他们给了我他们用来进行加密和解密的代码。
基于此,在我的iOS项目中,我使用FclBlowfish库(https://github.com/cantecim/FclBlowfish)加密/解密数据。
做完所有的事情之后,加密/解密就不能正常工作了,而我刚刚发现的问题是,在进行了将近5个小时的工作后,在iOS中的加密几乎与PHP相同,但是由于河豚生成奇怪的字符,其中一些字符没有被iOS处理,这使得解密无法工作。
一个例子是:
在PHP中,我的加密字符串是p%FE& ¶4!ɢߟén™,但在iOS中,相同的加密字符串是p%FE&¶4!É¢ßén,正如您可以看到的那样,iOS缺少了Ÿ和™,这使得最终加密的字符串有所不同,因此PHP无法正确解密。
我在iOS上使用的代码是:
FclBlowfish *bf = [[FclBlowfish alloc] init];
bf.Key = @"MyK3yF8n";
bf.IV = @"aaassss";
[bf prepare];
[bf encrypt:@"21988882121" withMode:modeEBC withPadding:paddingZero]这个库使用的加密/解密代码可以在:https://github.com/cantecim/FclBlowfish/blob/master/FclBlowfish.m上看到。
PHP中的代码是:
$initializationVectorSize = mcrypt_get_iv_size(MCRYPT_BLOWFISH, 'ecb');
$initializationVector = mcrypt_create_iv($initializationVectorSize, MCRYPT_RAND);
// Decrypt
$valor = $_GET['v'];
$valor = base64_decode($valor);
$valor = mcrypt_decrypt(MCRYPT_BLOWFISH, 'MyK3yF8n', $valor, 'ecb', $initializationVector);
print 'Valor: ' . $valor;
// Encrypt
$v = mcrypt_encrypt(MCRYPT_BLOWFISH, 'MyK3yF8n', $valor, 'ecb', $initializationVector);
print $v;我希望有任何帮助,试图找出为什么iOS缺少一些牧师,使字符串不可解密的PHP。
谢谢!
更新
因此,我打开了NSISOLatin1StringEncoding代码,看到他们在加密和解密方法中使用了NSASCIIStringEncoding和FclBlowfish编码,然后我决定尝试其他一些方法,然后发现使用NSWindowsCP1252StringEncoding实际上返回正确的编码,因为PHP和解密就像一种魅力!
发布于 2015-03-06 03:38:59
井,
在重新阅读了我的帖子,看我是否忘记了任何信息后,我意识到,如果问题是编码,那么iOS库可能使用的是NSEncoding,这应该是不同的。
因此,我打开了NSISOLatin1StringEncoding代码,看到他们在加密和解密方法中使用了NSASCIIStringEncoding和FclBlowfish编码,然后我决定尝试其他一些方法,然后发现使用NSWindowsCP1252StringEncoding实际上返回正确的编码,因为PHP和解密就像一种魅力!
希望这能帮助有同样问题的人!
发布于 2015-03-06 07:33:34
IV必须有ascii字符。因此,您可以简单地对其进行base64编码以获取更多信息,我就您的问题写了一条评论:https://github.com/cantecim/FclBlowfish/issues/1#issuecomment-77517878
https://stackoverflow.com/questions/28891658
复制相似问题