XWIS:APGAR: Difference between revisions
Appearance
en>Gordon-creAtive PW is faked - I'm just looking for an true one. |
m 5 revisions imported |
||
| (4 intermediate revisions by 3 users not shown) | |||
| Line 1: | Line 1: | ||
APGAR is a token sent by a C&C game to tell XWIS | APGAR is a token sent by a C&C game to tell XWIS the players' password. The password is encrypted using a weak algorithm. This is a one-way encryption, i.e. you cannot find the original password from it's encrypted form. | ||
Pseudo-code to calculate the password from an 8 letter input: | |||
<pre> | <pre> | ||
apgar | function apgar(input) | ||
lookup = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" | |||
out = "" | |||
i = 1 | |||
while (i <= 8) | |||
left = ascii value of input[ i ] | |||
right = ascii value of input[ length[input] - i ] | |||
if left is odd | |||
x = ((left * 2) XOR (left AND 1)) AND right | |||
else | |||
x = left XOR right | |||
out += lookup[x AND 63] | |||
i++ | |||
return out | |||
</pre> | </pre> | ||
The closing zero seems to have | |||
A C++ implementation of this algorithm: | |||
<pre> | |||
std::string apgar(std::string input) { | |||
std::string lookup = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; | |||
std::string out = ""; | |||
int i = 0; | |||
while (i < 8) { | |||
unsigned char left = input[i]; | |||
unsigned char right = input[input.length() - i]; | |||
unsigned char x = left & 1 ? ((left << 1) ^ (left & 1)) & right : left ^ right; | |||
out += lookup[x & 63]; | |||
i++; | |||
} | |||
return out; | |||
} | |||
</pre> | |||
Example (decrypted password "reneproj"): | |||
<pre> | |||
apgar Ykbcaxop 0 | |||
</pre> | |||
The closing zero seems to have no special function. | |||
[[Category:XWIS Protocol]] | [[Category:XWIS Protocol]] | ||
Latest revision as of 22:14, 31 March 2025
APGAR is a token sent by a C&C game to tell XWIS the players' password. The password is encrypted using a weak algorithm. This is a one-way encryption, i.e. you cannot find the original password from it's encrypted form.
Pseudo-code to calculate the password from an 8 letter input:
function apgar(input)
lookup = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
out = ""
i = 1
while (i <= 8)
left = ascii value of input[ i ]
right = ascii value of input[ length[input] - i ]
if left is odd
x = ((left * 2) XOR (left AND 1)) AND right
else
x = left XOR right
out += lookup[x AND 63]
i++
return out
A C++ implementation of this algorithm:
std::string apgar(std::string input) {
std::string lookup = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
std::string out = "";
int i = 0;
while (i < 8) {
unsigned char left = input[i];
unsigned char right = input[input.length() - i];
unsigned char x = left & 1 ? ((left << 1) ^ (left & 1)) & right : left ^ right;
out += lookup[x & 63];
i++;
}
return out;
}
Example (decrypted password "reneproj"):
apgar Ykbcaxop 0
The closing zero seems to have no special function.