1: <?php
2: /**
3: * This code is licensed under AGPLv3 license or Afterlogic Software License
4: * if commercial version of the product was purchased.
5: * For full statements of the licenses see LICENSE-AFTERLOGIC and LICENSE-AGPL3 files.
6: */
7:
8: namespace Aurora\System\Utils;
9:
10: /**
11: * @license https://www.gnu.org/licenses/agpl-3.0.html AGPL-3.0
12: * @license https://afterlogic.com/products/common-licensing Afterlogic Software License
13: * @copyright Copyright (c) 2019, Afterlogic Corp.
14: */
15: class Crypt
16: {
17: /**
18: *
19: * @param string $sString
20: * @param string $sKey
21: * @return string
22: */
23: public static function XxteaEncrypt($sString, $sKey)
24: {
25: if (empty($sString)) {
26: return '';
27: }
28:
29: $aV = self::str2long($sString, true);
30: $aK = self::str2long($sKey, false);
31: if (count($aK) < 4) {
32: for ($iIndex = count($aK); $iIndex < 4; $iIndex++) {
33: $aK[$iIndex] = 0;
34: }
35: }
36: $iN = count($aV) - 1;
37:
38: $iZ = $aV[$iN];
39: $iY = $aV[0];
40: $iDelta = 0x9E3779B9;
41: $iQ = floor(6 + 52 / ($iN + 1));
42: $iSum = 0;
43: while (0 < $iQ--) {
44: $iSum = self::int32($iSum + $iDelta);
45: $iE = $iSum >> 2 & 3;
46: for ($iPIndex = 0; $iPIndex < $iN; $iPIndex++) {
47: $iY = $aV[$iPIndex + 1];
48: $iMx = self::int32((($iZ >> 5 & 0x07ffffff) ^ $iY << 2) +
49: (($iY >> 3 & 0x1fffffff) ^ $iZ << 4)) ^ self::int32(($iSum ^ $iY) + ($aK[$iPIndex & 3 ^ $iE] ^ $iZ));
50: $iZ = $aV[$iPIndex] = self::int32($aV[$iPIndex] + $iMx);
51: }
52: $iY = $aV[0];
53: $iMx = self::int32((($iZ >> 5 & 0x07ffffff) ^ $iY << 2) +
54: (($iY >> 3 & 0x1fffffff) ^ $iZ << 4)) ^ self::int32(($iSum ^ $iY) + ($aK[$iPIndex & 3 ^ $iE] ^ $iZ));
55: $iZ = $aV[$iN] = self::int32($aV[$iN] + $iMx);
56: }
57:
58: return self::long2str($aV, false);
59: }
60:
61: /**
62: * @param string $sEncriptedString
63: * @param string $sKey
64: * @return string
65: */
66: public static function XxteaDecrypt($sEncriptedString, $sKey)
67: {
68: if (empty($sEncriptedString)) {
69: return '';
70: }
71:
72: $aV = self::str2long($sEncriptedString, false);
73: $aK = self::str2long($sKey, false);
74:
75: if (count($aK) < 4) {
76: for ($iIndex = count($aK); $iIndex < 4; $iIndex++) {
77: $aK[$iIndex] = 0;
78: }
79: }
80:
81: $iN = count($aV) - 1;
82:
83: $iZ = $aV[$iN];
84: $iY = $aV[0];
85: $iDelta = 0x9E3779B9;
86: $iQ = floor(6 + 52 / ($iN + 1));
87: $iSum = self::int32($iQ * $iDelta);
88: while ($iSum != 0) {
89: $iE = $iSum >> 2 & 3;
90: for ($iPIndex = $iN; $iPIndex > 0; $iPIndex--) {
91: $iZ = $aV[$iPIndex - 1];
92: $iMx = self::int32((($iZ >> 5 & 0x07ffffff) ^ $iY << 2) +
93: (($iY >> 3 & 0x1fffffff) ^ $iZ << 4)) ^ self::int32(($iSum ^ $iY) + ($aK[$iPIndex & 3 ^ $iE] ^ $iZ));
94: $iY = $aV[$iPIndex] = self::int32($aV[$iPIndex] - $iMx);
95: }
96: $iZ = $aV[$iN];
97: $iMx = self::int32((($iZ >> 5 & 0x07ffffff) ^ $iY << 2) +
98: (($iY >> 3 & 0x1fffffff) ^ $iZ << 4)) ^ self::int32(($iSum ^ $iY) + ($aK[$iPIndex & 3 ^ $iE] ^ $iZ));
99: $iY = $aV[0] = self::int32($aV[0] - $iMx);
100: $iSum = self::int32($iSum - $iDelta);
101: }
102:
103: return self::long2str($aV, true);
104: }
105:
106: /**
107: * @param array $aV
108: * @param array $aW
109: * @return string
110: */
111: private static function long2str($aV, $aW)
112: {
113: $iLen = count($aV);
114: $iN = ($iLen - 1) << 2;
115: if ($aW) {
116: $iM = $aV[$iLen - 1];
117: if (($iM < $iN - 3) || ($iM > $iN)) {
118: return false;
119: }
120: $iN = $iM;
121: }
122: $aS = array();
123: for ($iIndex = 0; $iIndex < $iLen; $iIndex++) {
124: $aS[$iIndex] = pack('V', $aV[$iIndex]);
125: }
126: if ($aW) {
127: return substr(join('', $aS), 0, $iN);
128: } else {
129: return join('', $aS);
130: }
131: }
132:
133: private static function str2long($sS, $sW)
134: {
135: $aV = unpack('V*', $sS . str_repeat("\0", (4 - strlen($sS) % 4) & 3));
136: $aV = array_values($aV);
137: if ($sW) {
138: $aV[count($aV)] = strlen($sS);
139: }
140: return $aV;
141: }
142:
143: /**
144: * @param int $iN
145: * @return int
146: */
147: private static function int32($iN)
148: {
149: while ($iN >= 2147483648) {
150: $iN -= 4294967296;
151: }
152: while ($iN <= -2147483649) {
153: $iN += 4294967296;
154: }
155: return (int) $iN;
156: }
157: }
158: