当前位置: 首页 > 知识库问答 >
问题:

将加密/解密转换为其 PHP 等效项

慕高格
2023-03-14

我正在尝试转换用ActionScript编写的加密/解密程序,并找到它的PHP等价物。编写动作脚本代码的开发人员告诉我,他使用了“TEA”算法来做这件事,但我不再与他联系。当我搜索等效的TEA算法并运行它时,不幸的是,我得到的结果与ActionScript的结果不同。有人能帮我吗?提前感谢。

我在这里粘贴了动作脚本代码。

WIN_apiTEA.prototype.encrypt = function(src, key) {
          if(src.length == 0) return "";
          var v = this.charsToLongs(this.strToChars(src));
          var k = this.charsToLongs(this.hexToChars(key));
          var n = v.length;
          if (n % 2==1) v[n++] = 0;

          tempv = new Array(2);
          newv = new Array(v.length);
          for (i=0; i<v.length; i=i+2){
               tempv = this.mcrypt_encrypt(k,v,v[i+1]);
               newv[i] = tempv[0];
               newv[i+1] = tempv[1];
          }

          var encStr = this.charsToHex(this.longsToChars(newv));

          return [encStr];

     }

WIN_apiTEA.prototype.mcrypt_encrypt = function(k,y,z)
{
     sum = 0;
     while (sum != -957401312) {
          y = int(y + ((((z << 4) ^ (z >>> 5)) + z) ^ (sum + k[sum & 3])));
          sum = int(sum + 0x9E3779B9);
          z = int(z + ((((y << 4) ^ (y >>> 5)) + y) ^ (sum + k[(sum >>> 11) & 3])));
     }
     return [y,z];
}

WIN_apiTEA.prototype.hexToChars = function(hex) {
          var codes = [];
          var hexArr = hex.split("");
          var hl = hexArr.length/2;
          for(var i=0;i<hl;i++) {
               codes[i] = int("0x"+hexArr[i*2]+hexArr[(i*2)+1]);
          }
          return codes;
     }

WIN_apiTEA.prototype.charsToLongs = function(chars) {
     var tlength = Math.ceil(chars.length/4);
     var temp = [];
     var ti = 0;
     for(var i = 0; i<tlength; i++){
          ti = i*4;
          temp[i] = (((chars[ti] << 24) + (chars[ti+1]<<16)) + (chars[ti+2]<<8)) + chars[ti+3];
     }
     return temp;
}

WIN_apiTEA.prototype.longsToChars = function(longs) {
          var codes = [];
          var ll = longs.length;
          var x = 0;
          for(var i = 0; i<ll; i++) {
               codes[x++] = longs[i]>>>24 & 0xFF;
               codes[x++] = longs[i]>>>16 & 0xFF;
               codes[x++] = longs[i]>>>8 & 0xFF;
               codes[x++] = longs[i] & 0xFF;
          }
          return codes;
}

WIN_apiTEA.prototype.charsToStr = function(chars) {
          var temp = "";
          var cl = chars.length;
          for(var i = 0; i<cl; i++) {
               temp += chr(chars[i]);
          }
          return temp;
}

WIN_apiTEA.prototype.strToChars = function(src) {
     var codes = [];
     var strArr = src.split("");
     var sl = strArr.length;
     var cnt = 0;
     for(var i = 0; i<sl; i++) {
          codes[i] = ord(strArr[i]);
     }
     return codes;
}

WIN_apiTEA.prototype.changeKey = function(enctext, keytext){
          return (enctext.substr(0, 8) + keytext.substr(8, 24));
}

我开始将其转换为PHP,这就是我所拥有的,但是它不起作用(它给我的加密字符串与我运行原始AS版本时获得的字符串不同):

class apiTea
{
public function encrypt($src, $key, $token)
{
    if (strlen($src) == 0) {
        return ("");
    }
    $_loc1 = $this->charsToLongs($this->strToChars($src));
    $_loc3 = $this->charsToLongs($this->hexToChars($key));
    $n     = count($_loc1);
    if ($n % 2 == 1) {
        $_loc1[$n++] = 0;
    }
    $tempv = array(
        2
    );
    $newv  = array(
        count($_loc1)
    );
    for ($i = 0; $i < count($_loc1); $i = $i + 2) {
        $tempv       = $this->mcrypt_encrypt($_loc3, $_loc1[$i], $_loc1[$i + 1]);
        $newv[$i]    = $tempv[0];
        $newv[i + 1] = $tempv[1];
    }
    $encStr = $this->charsToHex($this->longsToChars($newv));
    return ($token . ':' . $encStr);
}
function mcrypt_encrypt($k, $y, $z)
{
    $_loc1 = $z;
    $_loc2 = $y;
    $_loc3 = $k;
    $sum   = 0;
    while ($sum != -957401312) {
        $_loc2 = (int) ($_loc2 + (($_loc1 << 4 ^ $_loc1 >> 5) + $_loc1 ^ $sum + $_loc3[$sum & 3]));
        $sum   = (int) ($sum + 2654435769.000000);
        $_loc1 = (int) ($_loc1 + (($_loc2 << 4 ^ $_loc2 >> 5) + $_loc2 ^ $sum + $_loc3[$sum >> 11 & 3]));
    }
    return (array(
        $_loc2,
        $_loc1
    ));
}
function mcrypt_decrypt($k, $y, $z)
{
    $_loc1 = $z;
    $_loc2 = $y;
    $_loc3 = $k;
    $sum   = -957401312;
    while ($sum) {
        $_loc1 = (int) ($_loc1 - (($_loc2 << 4 ^ $_loc2 >> 5) + $_loc2 ^ $sum + $_loc3[$sum >> 11 & 3]));
        $sum   = (int) ($sum - 2654435769.000000);
        $_loc2 = (int) ($_loc2 - (($_loc1 << 4 ^ $_loc1 >> 5) + $_loc1 ^ $sum + $_loc3[$sum & 3]));
    }
    return (array(
        $_loc2,
        $_loc1
    ));
}
function decrypt($src, $key)
{
    if (substr($src, 0, 1) == "<") {
        return ($src);
    } else {
        if (strlen($src) == 0) {
            return ("");
        }
        $_loc1 = $this->charsToLongs($this->hexToChars($src));
        $_loc3 = $this->charsToLongs($this->hexToChars($key));
        $tempv = array(
            2
        );
        $newv  = array(
            strlen($_loc1)
        );
        for ($i = 0; $i < strlen($_loc1); $i = $i + 2) {
            $tempv        = $this->mcrypt_decrypt($_loc3, $_loc1[$i], $_loc1[$i + 1]);
            $newv[$i]     = $tempv[0];
            $newv[$i + 1] = $tempv[1];
        }
        return ($this->charsToStr($this->longsToChars($newv)));
    }
}
function charsToHex($chars)
{
    $_loc2 = $chars;
    $temp  = (string) ("");
    $_loc3 = array(
        "0",
        "1",
        "2",
        "3",
        "4",
        "5",
        "6",
        "7",
        "8",
        "9",
        "a",
        "b",
        "c",
        "d",
        "e",
        "f"
    );
    for ($_loc1 = 0; $_loc1 < count($_loc2); $_loc1++) {
        $temp = $temp + ($_loc3[$_loc2[$_loc1] >> 4] + $_loc3[$_loc2[$_loc1] & 15]);
    }
    return ($temp);
}
function charsToLongs($chars)
{
    $_loc3   = $chars;
    $tlength = ceil(count($_loc3) / 4);
    $temp    = array();
    $_loc2   = 0;
    for ($_loc1 = 0; $_loc1 < $tlength; $_loc1++) {
        $_loc2        = $_loc1 * 4;
        $temp[$_loc1] = ((($_loc3[$_loc2] << 24) + ($_loc3[$_loc2 + 1] << 16)) + ($_loc3[$_loc2 + 2] << 8)) + $_loc3[$_loc2 + 3];
    }
    return ($temp);
}
function longsToChars($longs)
{
    $_loc2 = array();
    $ll    = count($longs);
    $_loc3 = 0;
    for ($_loc1 = 0; $_loc1 < $ll; $_loc1++) {
        $_loc2[$_loc3++] = $longs[$_loc1] >> 24 & 255;
        $_loc2[$_loc3++] = $longs[$_loc1] >> 16 & 255;
        $_loc2[$_loc3++] = $longs[$_loc1] >> 8 & 255;
        $_loc2[$_loc3++] = $longs[$_loc1] & 255;
    }
    return ($_loc2);
}
function hexToChars($hex)
{
    $chars = array();
    for ($i = (substr($hex, 0, 2) == "0x" ? 2 : 0); $i < strlen($hex); $i += 2) {
        array_push($chars, intval(substr($hex, $i, 2), 16));
    }
    return $chars;
}
function charsToStr($chars)
{
    $str = "";
    for ($i = 0; $i < count($chars); $i++) {
        $str .= chr($chars[$i]);
    }
    return $str;
}
function strToChars($str)
{
    $chars = array();
    foreach (str_split($str) as $ord) {
        array_push($chars, ord($ord));
    }
    return $chars;
}
function changeKey($enctext, $keytext)
{
    // not needed yet
}
}

共有1个答案

邹胜泫
2023-03-14

使用AS3Crypto,您可以找到与ASE-CBC兼容的解决方案。在这种情况下,请看这里:在PHP中解密AS3Crypto加密文本

 类似资料:
  • 我正在升级一个平台上的安全。但是,我无法破解如何安全地存储我的加密/解密密钥。 当前安装程序: MySQL Server Webserver 我需要使用aes_encrypt/aes_decrypt存储和读取数据库中的所有敏感数据。但是,加密/解密数据的密钥我想要安全地存储。因此,当某人获得数据库或Web服务器的访问权时,他们将无法轻易猜出组合键或从配置文件中读取组合键。 密钥可以根据我需要读/写

  • 问题内容: 我找到了在PHP中对字符串进行编码/解码的示例。起初它看起来非常好,但是不会起作用:-( 有人知道问题出在哪里吗? 结果是: 加密: 解密: 问题答案: 并且 在您的代码中未定义。查看有效的解决方案( 但不安全! ): 停! 这个例子是 不安全的! 不要使用它! **但是此代码中还有其他问题,使其变得不安全,尤其是使用ECB(这不是_加密_模式,只能在其上定义加密模式的构造块)。

  • 问题内容: 我有一个正在下载xml并将其解析为sql数据库的应用程序。我的问题是,一旦部署了应用程序,xml中的数据就很容易被抓取,其他人可能将我辛苦赚来的数据用于自己的邪恶目的/应用程序。基本上我需要使用php加密xml,然后使用android解密。我已经看过几个php类,它们可以很容易地加密,但是我不完全确定哪种加密方法与android兼容。 解决后编辑: 起初,我认为出于某种原因我不得不忽略

  • 问题内容: 我正在使用JavaScript加密用户密码,如下所示: 它工作正常,但现在我正尝试在服务器端的PHP中像这样解密: 它根本不起作用,解密后的密码字符串看起来很奇怪: 有用的注释后,这是我的JavaScript代码的当前状态: 我正在将saltHex和CipherTextHex发送到PHP服务器,并且正在使用mcrypt_decrypt(),如下所示: 仍然无法使用此更新的代码。 有人可

  • null 解密(PHP) $IVSIZE=mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256,MCRYPT_MODE_CBC); $iv=mcrypt_create_iv($ivsize,MCRYPT_RAND); mcrypt_decrypt(MCRYPT_RIJNDAEL_256,'test',$encrypt,MCRYPT_MODE_CBC,$iv);

  • 我试图用C#加密一些(cookie)数据,然后用PHP解密。我选择使用Rijndael加密。我几乎让它工作,除了只有一部分的文本被解密!我从这个例子开始工作:用C#解密PHP加密的字符串 这是我正在加密的文本(JSON)(删除敏感信息): 所以我登录到 C# 应用程序,该应用程序从存储的密钥和 IV 创建/编码 cookie,然后重定向到应该解密/读取 cookie 的 PHP 应用程序。当我解密