PHP 和 Objective C Blowfish 加密编码不同
PHP and Objective C Blowfish Encryption Encoding different
我正在处理的 iOS 和 Android 项目要求我们打开一个连接到第 3 方网站的网络视图。问题是我们调用的 URL 必须附带一些使用 Blowfish 和 ECB 模式加密的参数。
这个第 3 方使用 PHP 到 encrypt/decrypt 参数,他们给了我他们用来加密和解密的代码。
基于此,在我的 iOS 项目中,我使用 FclBlowfish 库 (https://github.com/cantecim/FclBlowfish) encrypt/decrypt 数据。
完成所有操作后,encryption/decryption 无法正常工作,我刚刚发现这个问题,经过将近 5 小时的工作,iOS 中的加密几乎与 PHP,但由于 blowfish 生成奇怪的字符,其中一些未被 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]
此库使用的 encryption/decryption 代码可见于: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.
中不可解密
谢谢!
更新
所以我打开FclBlowfish代码,看到他们在加密和解密方法中使用了NSISOLatin1StringEncoding和NSASCIIStringEncoding编码,然后我决定尝试其他几个,发现使用 NSWindowsCP1252StringEncoding 实际上 returns 与 PHP 一样的正确编码和解密就像一个魅力!
嗯,
在重新阅读我的 post 以查看是否忘记了任何信息之后,我想到如果问题出在编码上,那么 iOS 库可能使用了不同的 NSEncoding那么应该是。
所以我打开FclBlowfish代码,看到他们在加密和解密方法中使用了NSISOLatin1StringEncoding和NSASCIIStringEncoding编码,然后我决定尝试其他一些方法,发现使用 NSWindowsCP1252StringEncoding 实际上 returns 是 PHP 的正确编码,并且解密非常有效!
希望这对遇到同样问题的人有所帮助!
IV 必须有 ascii 字符。所以你可以简单地对其进行base64编码
有关更多信息,我对您的问题发表了评论:https://github.com/cantecim/FclBlowfish/issues/1#issuecomment-77517878
我正在处理的 iOS 和 Android 项目要求我们打开一个连接到第 3 方网站的网络视图。问题是我们调用的 URL 必须附带一些使用 Blowfish 和 ECB 模式加密的参数。
这个第 3 方使用 PHP 到 encrypt/decrypt 参数,他们给了我他们用来加密和解密的代码。
基于此,在我的 iOS 项目中,我使用 FclBlowfish 库 (https://github.com/cantecim/FclBlowfish) encrypt/decrypt 数据。
完成所有操作后,encryption/decryption 无法正常工作,我刚刚发现这个问题,经过将近 5 小时的工作,iOS 中的加密几乎与 PHP,但由于 blowfish 生成奇怪的字符,其中一些未被 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]
此库使用的 encryption/decryption 代码可见于: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.
中不可解密谢谢!
更新
所以我打开FclBlowfish代码,看到他们在加密和解密方法中使用了NSISOLatin1StringEncoding和NSASCIIStringEncoding编码,然后我决定尝试其他几个,发现使用 NSWindowsCP1252StringEncoding 实际上 returns 与 PHP 一样的正确编码和解密就像一个魅力!
嗯,
在重新阅读我的 post 以查看是否忘记了任何信息之后,我想到如果问题出在编码上,那么 iOS 库可能使用了不同的 NSEncoding那么应该是。
所以我打开FclBlowfish代码,看到他们在加密和解密方法中使用了NSISOLatin1StringEncoding和NSASCIIStringEncoding编码,然后我决定尝试其他一些方法,发现使用 NSWindowsCP1252StringEncoding 实际上 returns 是 PHP 的正确编码,并且解密非常有效!
希望这对遇到同样问题的人有所帮助!
IV 必须有 ascii 字符。所以你可以简单地对其进行base64编码 有关更多信息,我对您的问题发表了评论:https://github.com/cantecim/FclBlowfish/issues/1#issuecomment-77517878