#include <stdio.h>
#include <sysinfoapi.h>
#include <stdint.h>
int
h2i(
char
c){
int
x = c -
'0'
;
if
(x <= 9)
return
x;
return
c -
'a'
+ 10;
}
const
int
R = 12;
void
op25_dec (uint32_t* v, uint32_t* k) {
uint32_t v0=v[0], v1=v[1], sum=0, i;
uint32_t delta=0xb979379e;
uint32_t k0=k[0], k1=k[1], k2=k[2], k3=k[3];
for
(i=0; i < R; i++) {
sum += delta;
v1 += ((v0<<4) + k2) ^ (v0 + sum) ^ ((v0>>5) + k3);
v0 += ((v1<<4) + k0) ^ (v1 + sum) ^ ((v1>>5) + k1);
}
v[0]=v0; v[1]=v1;
}
void
op25_enc (uint32_t* v, uint32_t* k) {
uint32_t v0=v[0], v1=v[1], sum=0xb979379e*R, i;
uint32_t delta=0xb979379e;
uint32_t k0=k[0], k1=k[1], k2=k[2], k3=k[3];
for
(i=0; i < R; i++) {
v0 -= ((v1<<4) + k0) ^ (v1 + sum) ^ ((v1>>5) + k1);
v1 -= ((v0<<4) + k2) ^ (v0 + sum) ^ ((v0>>5) + k3);
sum -= delta;
}
v[0]=v0; v[1]=v1;
}
void
enc(
char
*password,
int
uid) {
uint64_t buf[2] = {0,};
uint8_t *p = (uint8_t *)buf;
uint64_t a, b, c;
for
(
int
i = 0; i < 32; i += 2) {
p[i >> 1] = (h2i(password[i]) << 4) | h2i(password[i+1]);
}
printf
(
"buf = "
);
for
(
int
i = 0; i < 16; i++) {
printf
(
"%x "
, p[i]);
}
printf
(
"\n"
);
uint32_t key0[4] = {0xD7851B65, 0x473457C1, 0x1231F787, 0x9ACD6D9A};
op25_enc((uint32_t *)buf, key0);
uint32_t key1[4] = {0xB728E994, 0x1746382E, 0xC52D865C, 0x10778A6E};
op25_enc((uint32_t *)(&buf[1]), key1);
printf
(
"buf = %llX %llX\n"
, buf[0], buf[1]);
FILETIME
time
;
GetSystemTimePreciseAsFileTime(&
time
);
a = 1800 * ((*(uint64_t *)&
time
/ 10000000 - 11644473600LL) / 1800);
printf
(
"a = %lld\n"
, a);
printf
(
"%llX == %llX, %llX == %llX\n"
, a, buf[0], uid, buf[1]);
}
void
dec(
int
uid) {
uint64_t buf[3] = {0, };
uint8_t *p = (uint8_t *)buf;
FILETIME
time
;
GetSystemTimePreciseAsFileTime(&
time
);
uint64_t a = 1800 * ((*(uint64_t *)&
time
/ 10000000 - 11644473600LL) / 1800);
buf[0] = a;
buf[1] = uid;
buf[2] = 0x0404040400000000 | 0xA0C4D3EC;
uint32_t key0[4] = {0xD7851B65, 0x473457C1, 0x1231F787, 0x9ACD6D9A};
op25_dec((uint32_t *)buf, key0);
uint32_t key1[4] = {0xB728E994, 0x1746382E, 0xC52D865C, 0x10778A6E};
op25_dec((uint32_t *)(&buf[1]), key1);
uint32_t key2[4] = {0x7459F437, 0x90D1E5D, 0x779375B2, 0xEFCB8541};
op25_dec((uint32_t *)(&buf[2]), key2);
printf
(
"buf = "
);
for
(
int
i = 0; i < 24; i++) {
printf
(
"%02x"
, p[i]);
}
printf
(
"\n"
);
}
int
main() {
char
password[] =
"bae8bc715b8329433ebf884fbf3bbd9d"
;
enc(password, 2353116);
dec(2353116);
return
0;
}