CryptoJS加密其中iv为32位,php 解密

Earl_Hwong 2015-03-12 10:15:20

<script type="text/javascript" src='aes.js'></script>
<script type="text/javascript">
var key = '123454536f667445454d537973576562';
key = CryptoJS.enc.Hex.parse(key);
var iv = CryptoJS.enc.Hex.parse("1234577290ABCDEF1264147890ACAE45");
var encrypted = CryptoJS.AES.encrypt('T10515', key, {iv: iv,mode:CryptoJS.mode.CBC}).toString()
alert(encrypted);
</script>


js代码如上,现在想用php来加密

<?php
$pk = "123454536f667445454d537973576562";
$iv = "1234577290ABCDEF1264147890ACAE45";
$t = ('T10515');

$encrypted = ( mcrypt_encrypt(MCRYPT_RIJNDAEL_128,$pk,$t,MCRYPT_MODE_CBC,$iv) );
echo 'base64_encode'.(base64_encode($encrypted)).'<br>';
?>

为什么不行?出现警告如下:

Warning: mcrypt_encrypt(): Received initialization vector of size 32, but size 16 is required for this encryption mode in F:\LAMP\Apache2.4\htdocs\fee\cry.php on line 32


我知道js那里CryptoJS.enc.Hex.parse是转16进制的,但是这串字符串不已经是16进制了吗?
...全文
1610 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ycxjg 2015-03-17
  • 打赏
  • 举报
回复
新手围观中 studying
xuzuning 2015-03-14
  • 打赏
  • 举报
回复
$pk = pack('H*', "123454536f667445454d537973576562"); $iv = pack('H*', "1234577290ABCDEF1264147890ACAE45"); W/3ax9dAw/GQ/ELf5enWeQ== T10515 W/3ax9dAw/GQ/ELf5enWeQ== T10515 如果你坚持不加 padding:CryptoJS.pad.ZeroPadding(不足部分以'\0'充填)的话,那就是无解了 dRewstG3hsVzDdKJxzmXtg== 这样的结果,php 是得不到的
Earl_Hwong 2015-03-14
  • 打赏
  • 举报
回复
Utf8是可以解出来的,但是Js是hex,因为不能动js的代码,所以只能在PHP想办法了
xuzuning 2015-03-13
  • 打赏
  • 举报
回复
需要注意的是,php5.4 及以下虽然会有 iv 超长的警告 但依然会完成加密和解密的动作(当然密文就不一样了)
xuzuning 2015-03-13
  • 打赏
  • 举报
回复 1
错误信息显示 iv 太长了,应该是 16 位长度 你的 js 部分存在问题,无法与 php 对应(不是说算法有问题,既然是想要在两方面通用,那总是要达成某种妥协的) 就是部分
text = 'T10515';
var key = '123454536f667445454d537973576562';
    key = CryptoJS.enc.Utf8.parse(key);
var iv = "1234577290ABCDEF1264147890ACAE45";
    iv = CryptoJS.enc.Utf8.parse(iv);
var encrypted = CryptoJS.AES.encrypt(text, key, {
      iv: iv,
      mode:CryptoJS.mode.CBC,
      padding:CryptoJS.pad.ZeroPadding
    }).toString()
document.write(encrypted);
b7y/JPJFNTfxNVR8H4NNtw== php 部分
$pk = "123454536f667445454d537973576562";
$iv = substr("1234577290ABCDEF1264147890ACAE45", 0, 16);
$t = 'T10515';
  
$encrypted = ( mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $pk, $t, MCRYPT_MODE_CBC,$iv) );
echo base64_encode($encrypted).'<br>';
b7y/JPJFNTfxNVR8H4NNtw== 解密
echo  mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $pk, $encrypted, MCRYPT_MODE_CBC, $iv);
T10515 可以推断, js 部分实际只使用了 iv 的 16 位长度
Earl_Hwong 2015-03-13
  • 打赏
  • 举报
回复
256太长了,因为我是要根据js在PHP上模拟出来,js的iv确定32位了
蛋疼的问题是js可以加密但是PHP出现警告
太久 2015-03-13
  • 打赏
  • 举报
回复
MCRYPT_RIJNDAEL_256

20,359

社区成员

发帖
与我相关
我的任务
社区描述
“超文本预处理器”,是在服务器端执行的脚本语言,尤其适用于Web开发并可嵌入HTML中。PHP语法利用了C、Java和Perl,该语言的主要目标是允许web开发人员快速编写动态网页。
phpphpstorm 技术论坛(原bbs)
社区管理员
  • 开源资源社区
  • phpstory
  • xuzuning
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧