解决方案 »

  1. 256太长了,因为我是要根据js在PHP上模拟出来,js的iv确定32位了
    蛋疼的问题是js可以加密但是PHP出现警告
      

  2. 错误信息显示 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 位长度
      

  3. 需要注意的是,php5.4 及以下虽然会有 iv 超长的警告
    但依然会完成加密和解密的动作(当然密文就不一样了)
      

  4. Utf8是可以解出来的,但是Js是hex,因为不能动js的代码,所以只能在PHP想办法了
      

  5. $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 是得不到的
      

类似问题 »