#1
|
|||
|
|||
Encryption cracking challenge
Can someone help find the key?
Code:
/* * poly.c crackme january 2020 * dilabox at gmail dot com */ #include <stdint.h> #include <stdio.h> uint64_t poly(uint64_t a, uint64_t b) { uint64_t r = 0; while (b) { r ^= a & -(b & 1); uint64_t m = -((a >> 63) & 1); a <<= 1; a ^= m & 0x307fdb4d20abf247; b >>= 1; } return r; } uint64_t encrypt(uint64_t data, uint64_t key) { data ^= key; uint64_t out = 1; for (int i = 0; i < 64; ++i) { if ((0x61e261e161e261e2 >> i) & 1) { out = poly(out, data); } data = poly(data, data); } out ^= key; return out; } uint64_t decrypt(uint64_t data, uint64_t key) { return encrypt(data, key); } int main() { uint64_t key = 0; scanf("%lx", &key); if (encrypt(0xe9eec16478534a39, key) == 0xf3201dcbbeefe53a) { printf("GOOD\n"); } else { printf("BAD\n"); } return 0; } |
#2
|
||||
|
||||
some lines don't make sense !
uint64_t m = -((a >> 63) & 1); how do you assign a negative value to an unsigned int64 ? |
#3
|
|||
|
|||
-x is the same as ~x + 1
In this case the code is extracting the most-significant bit (MSB) from a and then creating a 64-bit mask from it. If MSB(a) == 0, the result is 0x0000000000000000 Otherwise, if MSB(a) == 1, the result is 0xFFFFFFFFFFFFFFFF |
#4
|
|||
|
|||
Some compilers might warn or even generate an error over that. But as said it's just a 2s compliment and the sign but is merely interpreted differently as a cast occurred to signed and back to unsigned. This challenge is interesting need to look for a crypto weakness in the inner function perhaps. Brute force won't work with 2^64...
|
The Following User Says Thank You to chants For This Useful Post: | ||
niculaita (01-14-2020) |
Thread Tools | |
Display Modes | |
|
|
Similar Threads | ||||
Thread | Thread Starter | Forum | Replies | Last Post |
The Mutilated AES Challenge | dila | General Discussion | 2 | 08-27-2018 04:06 |
Cracking App come with Challenge Code | new air | General Discussion | 2 | 08-19-2003 00:49 |