PHP
C#
JS
PHP:
function encrypt($str) {
$key = array();
$dst = array();
$i = 0;
$nBytes = strlen($str);
while ($i < $nBytes)
{
$i++;
$key[$i] = ord(substr($str, $i - 1, 1));
$dst[$i] = $key[$i];
}
$rslt = $key[1] + $key[2]*256 + $key[3]*65536 + $key[4]*16777216;
$one = $rslt * 213119 + 2529077;
$one = $one - intval($one/ 4294967296) * 4294967296;
$rslt = $key[5] + $key[6]*256 + $key[7]*65536 + $key[8]*16777216;
$two = $rslt * 213247 + 2529089;
$two = $two - intval($two/ 4294967296) * 4294967296;
$rslt = $key[9] + $key[10]*256 + $key[11]*65536 + $key[12]*16777216;
$three = $rslt * 213203 + 2529589;
$three = $three - intval($three/ 4294967296) * 4294967296;
$rslt = $key[13] + $key[14]*256 + $key[15]*65536 + $key[16]*16777216;
$four = $rslt * 213821 + 2529997;
$four = $four - intval($four/ 4294967296) * 4294967296;
$key[4] = intval($one/16777216);
$key[3] = intval(($one - $key[4] * 16777216) / 65535);
$key[2] = intval(($one - $key[4] * 16777216 - $key[3] * 65536) / 256);
$key[1] = intval(($one - $key[4] * 16777216 - $key[3] * 65536 - $key[2] * 256));
$key[8] = intval($two/16777216);
$key[7] = intval(($two - $key[8] * 16777216) / 65535);
$key[6] = intval(($two - $key[8] * 16777216 - $key[7] * 65536) / 256);
$key[5] = intval(($two - $key[8] * 16777216 - $key[7] * 65536 - $key[6] * 256));
$key[12] = intval($three/16777216);
$key[11] = intval(($three - $key[12] * 16777216) / 65535);
$key[10] = intval(($three - $key[12] * 16777216 - $key[11] * 65536) / 256);
$key[9] = intval(($three - $key[12] * 16777216 - $key[11] * 65536 - $key[10] * 256));
$key[16] = intval($four/16777216);
$key[15] = intval(($four - $key[16] * 16777216) / 65535);
$key[14] = intval(($four - $key[16] * 16777216 - $key[15] * 65536) / 256);
$key[13] = intval(($four - $key[16] * 16777216 - $key[15] * 65536 - $key[14] * 256));
$dst[1] = $dst[1] ^ $key[1];
$i=1;
while ($i<16)
{
$i++;
$dst[$i] = $dst[$i] ^ $dst[$i-1] ^ $key[$i];
}
$i=0;
while ($i<16)
{
$i++;
if ($dst[$i] == 0)
{
$dst[$i] = 102;
}
}
$encrypt = "0x";
$i=0;
while ($i<16)
{
$i++;
if ($dst[$i] < 16)
{
$encrypt = $encrypt . "0" . dechex($dst[$i]);
}
else
{
$encrypt = $encrypt . dechex($dst[$i]);
}
}
return $encrypt;
}
C#
Код:
// unsigned 32 bit integer (dword) #if defined(_MSC_VER) && !defined(uint32_t)
#if (_MSC_VER < 1300)
typedef unsigned int uint32_t;
#else
typedef unsigned __int32 uint32_t;
#endif
#else
#include <stdint.h>
#endif
const int hash_skeys[4][2] = {
{ 213119, 2529077 },
{ 213247, 2529089 },
{ 213203, 2529589 },
{ 213821, 2529997 }
};
const char hex_digit[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
void encrypt(char *src, char *dst)
{
int i = 0, j = 0;
char key[0x10];
char buff[0x10];
char hexbuff[0x21];
uint32_t* key_dwords = (uint32_t*)key;
memset(&key, 0, sizeof(key));
memset(&buff, 0, sizeof(buff));
memset(&hexbuff, 0, sizeof(hexbuff));
strncpy(key, src, sizeof(key));
strncpy(buff, src, sizeof(buff));
for(i = 0; i < 4; i++)
key_dwords = key_dwords * hash_skeys[0] + hash_skeys[1];
buff[0] = buff[0] ^ key[0];
for(i = 1; i < 0x10; i++)
buff = buff ^ buff[i-1] ^ key;
for(i = 0; i < 0x10; i++) {
j = buff != 0 ? buff : 102;
hexbuff[i*2] = hex_digit[j >> 4 & 0x0f];
hexbuff[i*2 + 1] = hex_digit[j & 0x0f];
}
//hexbuff[0x20] = 0;
sprintf(dst, "0x%s", hexbuff);
}
Код:
function pwdcrypt(str){
var key = new Array();
var dst = new Array();
for (var i = 0; i < str.length; i++)
{
key = str.charCodeAt(i);
dst = key;
}
var hash_keys = new Array(4);
for (var i = 0; i < 4; i++)
{
hash_keys = new Array(2);
}
hash_keys[0][0] = 213119; hash_keys[0][1] = 2529077;
hash_keys[1][0] = 213247; hash_keys[1][1] = 2529089;
hash_keys[2][0] = 213203; hash_keys[2][1] = 2529589;
hash_keys[3][0] = 213821; hash_keys[3][1] = 2529997;
var msum = function (m, n)
{
return (((((m & 0xffff0000) * n[0]) >>> 0) + (((m & 0x0000ffff) * n[0]) >>> 0)) + n[1]) >>> 0;
};
for (var i = 0; i < 16; i += 4)
{
var dw = 0;
for (var j = 0; j < 4; j++)
{
dw += key[i + j] << j * 8;
}
var tmp = msum(dw, hash_keys[Math.floor(i / 4)]);
key[i + 3] = (tmp >> 24) & 0xFF;
key[i + 2] = ((tmp - ((key[i + 3] << 24) & 0xFF000000)) >> 16) & 0xFF;
key[i + 1] = ((tmp - ((key[i + 3] << 24) & 0xFF000000) - (key[i + 2] << 16)) >> 8) & 0xFF;
key[i + 0] = ((tmp - ((key[i + 3] << 24) & 0xFF000000) - (key[i + 2] << 16) & 0xFF - (key[i + 1] << 8) & 0xFF));
}
dst[0] = dst[0] ^ key[0];
for (var i = 1; i < 16; i++)
{
dst = dst ^ dst[i - 1] ^ key;
}
for (var i = 0; i < 16; i++)
{
if (dst == 0)
{
dst = 102;
}
}
var e = "0x";
for (var i = 0; i < 16; i++)
{
if (dst < 16)
{
e += "0";
}
e += parseInt(dst[i], 10).toString(16);
}
return e;
}