![]() |
|
#16
|
|||
|
|||
|
My code for solving (see here on how to install z3py):
Code:
from z3 import *
key = BitVec('key', 64)
solve((key * key * key * key * key * key * key) == 0x90de757572b51cd3)
Code:
[key = 16721472531635646971] 0xE80E9AAC619831FB |
| The Following User Gave Reputation+1 to mr.exodia For This Useful Post: | ||
niculaita (06-05-2016) | ||
|
#17
|
|||
|
|||
|
Here is my solution based on solving it as an RSA problem:
Where d is the private exponent, calculated by finding the multiplicative inverse of 7 modulo phi(2^64) = 2^63, which turns out to be 0x6db6db6db6db6db7. Raising the magic constant to this private exponent, and taking modulo 2^64, produces the seret key 0xe80e9aac619831fb, as found by Kerlingen, UniSoft, and mr.exodia. Code:
#include <iostream>
#include <stdint.h>
uint64_t modexp(uint64_t a, uint64_t b) {
uint64_t y = 1;
uint64_t tmp = a;
for (int i = 0; i < 64; ++i) {
uint64_t mask = uint64_t(1) << i;
if (b & mask) {
y *= tmp;
}
tmp *= tmp;
}
return y;
}
int main() {
uint64_t in = 0x90de757572b51cd3;
uint64_t tmp = modexp(in, 0x6db6db6db6db6db7);
uint64_t out = modexp(tmp, 7);
if (in == out) {
std::cout << "Success: " << std::hex << tmp << std::endl;
} else {
std::cout << "Error" << std::endl;
}
return 0;
}
|
|
#18
|
|||
|
|||
|
Quote:
Code:
uint64_t modexp(uint64_t a, uint64_t b)
{
uint64_t y = 1;
uint64_t tmp = a;
while( b )
{
if( b & 1 )
y *= tmp;
tmp *= tmp;
b >>= 1;
}
return y;
}
|
| The Following User Says Thank You to aliali For This Useful Post: | ||
dila (06-14-2016) | ||
|
#19
|
|||
|
|||
|
Quote:
![]() Can anyone explain me the mathematical way to calculate this ? I always come up to a different result. Like: 0xE80E9AAC619831FB ^7 = 0x80BE33B7E7E4CB02B42B9C6FDF0D774CC0645D8992D29738EC470B848F80CFA482BA62D01E70C65E397E7EFE6F190D1990DE757572B51CD3 or something like that Where is my "think failure" ? - Seth |
|
#20
|
||||
|
||||
|
We are calculating this with a 64 bit precision constraint. Since you overload the numerical capacity of 64 bits, the rest of the information is lost as a result. Since you are calculating this with full precision, you need to and your result by 0xFFFFFFFFFFFFFFFF.
0x80BE33B7E7E4CB02B42B9C6FDF0D774CC0645D8992D29738EC470B848F80CFA482BA62D01E70C65E397E7EFE6F190D1990DE757572B51CD3 <- 64 bit value
__________________
"As the island of our knowledge grows, so does the shore of our ignorance." John Wheeler |
![]() |
| Thread Tools | |
| Display Modes | |
|
|
Similar Threads
|
||||
| Thread | Thread Starter | Forum | Replies | Last Post |
| GMP function | Git | General Discussion | 4 | 06-16-2011 21:33 |
| FUNCTION CHUNKs | Git | General Discussion | 4 | 09-07-2005 19:35 |
| C++ Help (Hooking a function) | Peter[Pan] | General Discussion | 8 | 08-31-2004 20:37 |