Skip to content

Instantly share code, notes, and snippets.

@MinecraftFuns
Created September 18, 2022 01:31
Show Gist options
  • Save MinecraftFuns/44173a642b4886c86a2f4198f02c20a2 to your computer and use it in GitHub Desktop.
Save MinecraftFuns/44173a642b4886c86a2f4198f02c20a2 to your computer and use it in GitHub Desktop.
#include <bits/stdc++.h>
using namespace std;
/*
class lfsr():
def __init__(self, seed, mask, length):
self.length_mask = 2 ** length - 1
self.mask = mask & self.length_mask
self.state = seed & self.length_mask
print(self.state, self.mask)
def next(self):
next_state = (self.state << 1) & self.length_mask
output = count_one(self.state & self.mask & self.length_mask)
next_state ^= output # 最低位为 0,相当于 |
self.state = next_state
return output
def getrandbit(self, nbit):
output = 0
for _ in range(nbit):
output = (output << 1) ^ self.next()
return output
*/
void decrypt(const uint32_t &mask)
{
vector<uint32_t> codes = {205,
197,
241,
3,
18,
128,
36,
253,
5,
200,
170,
131,
25,
71,
9,
196,
164,
161,
9,
0,
7,
123,
149,
121,
32,
122,
149,
131,
170,
252,
189,
68,
162,
164,
153,
67};
uint32_t state = (249u << 24) | (16u << 16) | (69u << 8) | (218u);
for (const auto &code : codes)
{
// cout << code;
uint32_t num = 0u;
for (int j = 0; j < 8; ++j)
{
uint32_t next_state = state << 1, output = popcount(state & mask) & 1;
next_state ^= output;
state = next_state;
num <<= 1;
num ^= output;
}
auto c = code ^ num;
if (isalnum(c) || c == '{' || c == '}')
{
// cout << c << endl;
cout << (char)(c);
}
}
cout << endl;
}
int main()
{
uint32_t array[3] = {153u, 131u, 138u};
for (uint32_t mask = 0; mask < numeric_limits<uint32_t>::max(); ++mask)
{
uint32_t state = (249u << 24) | (16u << 16) | (69u << 8) | (218u);
bool flag = true;
uint32_t num;
for (int i = 0; i < 3 && flag; ++i)
{
num = 0u;
for (int j = 0; j < 8; ++j)
{
uint32_t next_state = state << 1, output = popcount(state & mask) & 1;
next_state ^= output;
state = next_state;
num <<= 1;
num ^= output;
}
if (num != array[i])
{
flag = false;
}
}
if (flag)
{
for (int i = 3; i < 36; ++i)
{
num = 0u;
for (int j = 0; j < 8; ++j)
{
uint32_t next_state = state << 1, output = popcount(state & mask) & 1;
next_state ^= output;
state = next_state;
num <<= 1;
num ^= output;
}
}
if (num == 62u)
{
cout << mask << endl;
}
}
}
vector<uint32_t> masks = {2226048585};
for (const auto &mask : masks)
{
decrypt(mask);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment