我正在尝试将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时,它给了我奇怪的字符。
答案 0 :(得分:5)
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代码。