【问题标题】:PHP and Objective C Blowfish Encryption Encoding differentPHP和Objective C Blowfish加密编码不同
【发布时间】:2015-05-07 15:17:44
【问题描述】:

我正在处理的 iOS 和 Android 项目要求我们打开一个连接到第 3 方网站的 web 视图。问题是我们调用的URL必须附带一些使用ECB模式的Blowfish加密的参数。

这个第 3 方使用 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 中不可解密,我将不胜感激。

谢谢!

更新

所以我打开 FclBlowfish 代码,发现他们在加密和解密方法中使用了 NSISOLatin1StringEncodingNSASCIIStringEncoding 编码,然后我决定尝试其他几个发现使用 NSWindowsCP1252StringEncoding 实际上返回正确的编码作为 PHP 编码和解密就像一个魅力!

【问题讨论】:

  • 1.使用 Blowfish 不是一个好主意,AES 是当前的加密方法——如果你真的关心安全的话。 2. ECB 和 iv 的结合没有意义。 3 验证填充是否以相同的方式完成。 4. 使用 Apple 提供的 Common Crypto 可能是更好的选择,加密在标准库中,因此不会受到编译器问题的影响,并且是受信任的代码。
  • @Zaph 相信我,我说我会消灭河豚的诞生。但是第 3 方网站需要河豚,我必须使用它。 :(
  • 查看SO Answer 了解 Blowfish 通用加密实现示例。

标签: php ios encryption cryptography blowfish


【解决方案1】:

嗯,

在重新阅读我的帖子以查看我是否忘记了任何信息之后,我想到如果问题出在编码上,那么 iOS 库可能使用了不同的 NSEncoding,那么它应该是。

所以我打开 FclBlowfish 代码,发现他们在加密和解密方法中使用了 NSISOLatin1StringEncodingNSASCIIStringEncoding 编码,然后我决定尝试其他几个发现使用 NSWindowsCP1252StringEncoding 实际上返回正确的编码作为 PHP 编码和解密就像一个魅力!

希望这可以帮助遇到同样问题的人!

【讨论】:

  • 你最好将这个添加到问题中。
【解决方案2】:

IV 必须有 ascii 字符。因此,您可以简单地对其进行 base64 编码 有关更多信息,我对您的问题发表了评论:https://github.com/cantecim/FclBlowfish/issues/1#issuecomment-77517878

【讨论】:

  • 为什么会有 ecb 模式的 iv?
  • ecb模式不使用iv,任何操作都先检查,之后只在cbc模式下使用iv
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-22
  • 1970-01-01
  • 2012-10-24
  • 1970-01-01
  • 2015-09-25
  • 2015-05-02
相关资源
最近更新 更多