将AES解密从CryptoJS移植到Php

时间:2015-09-16 02:20:59

标签: javascript php encryption aes encryption-symmetric

我正在尝试将AES解密函数从JavaScript转换为PHP脚本。忽略缩进以便于阅读。

var enc = 'EK/tvL3RsjOY1j82ILXv7W10bEU83JeaiBhlLmcZIrk=';

var key = 'FSHcT+sfRO/siok2ooweuA==' ;

var y = CryptoJS.AES.decrypt({ciphertext:     CryptoJS.enc.Base64.parse(enc)}, 
CryptoJS.enc.Base64.parse(key), 
{iv: CryptoJS.enc.Hex.parse("2323232323232323")});

var dec = y.toString(CryptoJS.enc.Utf8);

在我试过的PHP中

$iv = mcrypt_create_iv(16, '2323232323232323'); 

$enc = 'EK/tvL3RsjOY1j82ILXv7W10bEU83JeaiBhlLmcZIrk=';

$key = 'FSHcT+sfRO/siok2ooweuA==' ;

$dec = rtrim((mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $enc, MCRYPT_MODE_CBC, $iv)), "\0\3");

在Javascript解密工作正常,但当我执行PHP时,它给了我奇怪的字符。

2 个答案:

答案 0 :(得分:5)

警告:这是弱密码术

  • 您正在使用CBC模式,其中空字节的常量为IV(应为每条消息随机生成IV)。
  • 你是not authenticating your ciphertext
  • 天真地使用rtrim()会将您的应用程序公开给padding oracle attacks,如果您遵循加密然后MAC结构,这将不会有问题。

代码中的实际错误

$iv = mcrypt_create_iv(16, '00000000000000000000000000000000'); 

这不是如何使用这个功能的。

string mcrypt_create_iv(int $length, int $source);

例如:mcrypt_create_iv(16, MCRYPT_DEV_URANDOM);将从/dev/urandom生成16字节的随机数据。看起来你想要str_repeat("\0", 16),但正如我上面所说,这是一个可怕的想法。

你也没有base64_decode()密钥。

我真的希望你没有在任何地方部署这些代码。

推荐阅读:Talyor Hornby的Write crypto code! Don't publish it!

另外,如果你能avoid using mcrypt,你会发现自己更快乐。

答案 1 :(得分:0)

您应该使用 override func viewDidLoad() { super.viewDidLoad() self.initialVC = self.childViewControllers.last self.substituteVC = self.storyboard!.instantiateViewControllerWithIdentifier("Substitute") self.currentVC = self.initialVC; } @IBAction func switchControllers(sender: UISegmentedControl) { switch sender.selectedSegmentIndex{ case 0: if (self.currentVC == self.substituteVC) { self.addChildViewController(self.initialVC) //self.initialVC.view.frame = self.containerView.bounds moveToNewController(self.initialVC) } case 1: if (self.currentVC == self.initialVC) { self.addChildViewController(self.substituteVC) //self.substituteVC.view.frame = self.containerView.bounds moveToNewController(self.substituteVC) } default: break; } } func moveToNewController(newController : UIViewController){ self.currentVC.willMoveToParentViewController(nil) self.transitionFromViewController( self.currentVC!, toViewController: newController, duration: 0.2, options: UIViewAnimationOptions.TransitionCrossDissolve, animations: nil, completion: { finished in self.currentVC.removeFromParentViewController() newController.didMoveToParentViewController(self) self.currentVC = newController }) } 扩展名(在C中实现),因此您不需要移植JS代码。

http://php.net/manual/en/book.mcrypt.php