Skip to content

Instantly share code, notes, and snippets.

@math314
Created April 13, 2017 12:27
Show Gist options
  • Save math314/e9b7e076b01d0f97b20eda4eed83a435 to your computer and use it in GitHub Desktop.
Save math314/e9b7e076b01d0f97b20eda4eed83a435 to your computer and use it in GitHub Desktop.
#include <vector>
#include <string>
#include <iostream>
#include <sstream>
using namespace std;
#include <bits/stdc++.h>
#include <random>
using namespace std;
#define FOR(i,n) for(int i = 0; i < (n); i++)
#define sz(c) ((int)c.size())
#define ten(n) ((int)1e##n)
typedef unsigned char u8;
typedef unsigned int u32;
vector<u8> confusion = {
0xac,0xd1,0x25,0x94,0x1f,0xb3,0x33,0x28,0x7c,0x2b,0x17,0xbc,0xf6,0xb0,0x55,0x5d,
0x8f,0xd2,0x48,0xd4,0xd3,0x78,0x62,0x1a,0x02,0xf2,0x01,0xc9,0xaa,0xf0,0x83,0x71,
0x72,0x4b,0x6a,0xe8,0xe9,0x42,0xc0,0x53,0x63,0x66,0x13,0x4a,0xc1,0x85,0xcf,0x0c,
0x24,0x76,0xa5,0x6e,0xd7,0xa1,0xec,0xc6,0x04,0xc2,0xa2,0x5c,0x81,0x92,0x6c,0xda,
0xc6,0x86,0xba,0x4d,0x39,0xa0,0x0e,0x8c,0x8a,0xd0,0xfe,0x59,0x96,0x49,0xe6,0xea,
0x69,0x30,0x52,0x1c,0xe0,0xb2,0x05,0x9b,0x10,0x03,0xa8,0x64,0x51,0x97,0x02,0x09,
0x8e,0xad,0xf7,0x36,0x47,0xab,0xce,0x7f,0x56,0xca,0x00,0xe3,0xed,0xf1,0x38,0xd8,
0x26,0x1c,0xdc,0x35,0x91,0x43,0x2c,0x74,0xb4,0x61,0x9d,0x5e,0xe9,0x4c,0xbf,0x77,
0x16,0x1e,0x21,0x1d,0x2d,0xa9,0x95,0xb8,0xc3,0x8d,0xf8,0xdb,0x34,0xe1,0x84,0xd6,
0x0b,0x23,0x4e,0xff,0x3c,0x54,0xa7,0x78,0xa4,0x89,0x33,0x6d,0xfb,0x79,0x27,0xc4,
0xf9,0x40,0x41,0xdf,0xc5,0x82,0x93,0xdd,0xa6,0xef,0xcd,0x8d,0xa3,0xae,0x7a,0xb6,
0x2f,0xfd,0xbd,0xe5,0x98,0x66,0xf3,0x4f,0x57,0x88,0x90,0x9c,0x0a,0x50,0xe7,0x15,
0x7b,0x58,0xbc,0x07,0x68,0x3a,0x5f,0xee,0x32,0x9f,0xeb,0xcc,0x18,0x8b,0xe2,0x57,
0xb7,0x49,0x37,0xde,0xf5,0x99,0x67,0x5b,0x3b,0xbb,0x3d,0xb5,0x2d,0x19,0x2e,0x0d,
0x93,0xfc,0x7e,0x06,0x08,0xbe,0x3f,0xd9,0x2a,0x70,0x9a,0xc8,0x7d,0xd8,0x46,0x65,
0x22,0xf4,0xb9,0xa2,0x6f,0x12,0x1b,0x14,0x45,0xc7,0x87,0x31,0x60,0x29,0xf7,0x73
};
vector<u8> last = {
0x2c,0x97,0x72,0xcd,0x89,0xa6,0x88,0x4c,0xe8,0x83,0xeb,0x59,0xca,0x50,0x3f,0x27,
0x4e,0xae,0x43,0xd5,0x6e,0xd0,0x99,0x7b,0x7c,0x40,0x0c,0x52,0x86,0xc1,0x46,0x12,
0x5a,0x28,0xa8,0xbb,0xcb,0xf0,0x11,0x95,0x26,0x0d,0x34,0x66,0x22,0x18,0x6f,0x51,
0x9b,0x3b,0xda,0xec,0x5e,0x00,0x2a,0xf5,0x8f,0x61,0xba,0x96,0xb3,0xd1,0x30,0xdc,
0x33,0x75,0xe9,0x6d,0xc8,0xa1,0x3a,0x3e,0x5f,0x9d,0xfd,0xa9,0x31,0x9f,0xaa,0x85,
0x2f,0x92,0xaf,0x67,0x78,0xa5,0xab,0x03,0x21,0x4f,0xb9,0xad,0xfe,0xf3,0x42,0xfc,
0x17,0xd7,0xee,0xa3,0xd8,0x80,0x14,0x2e,0xa0,0x47,0x55,0xc4,0xff,0xe5,0x13,0x3f,
0x81,0xb6,0x7a,0x94,0xd0,0xb5,0x54,0xbf,0x91,0xa7,0x37,0xf1,0x6b,0xc9,0x1b,0xb1,
0x3c,0xb6,0xd9,0x32,0x24,0x8d,0xf2,0x82,0xb4,0xf9,0xdb,0x7d,0x44,0xfb,0x1e,0xd4,
0xea,0x5d,0x35,0x69,0x23,0x71,0x57,0x01,0x06,0xe4,0x55,0x9a,0xa4,0x58,0x56,0xc7,
0x4a,0x8c,0x8a,0xd6,0x6a,0x49,0x70,0xc5,0x8e,0x0a,0x62,0xdc,0x29,0x4b,0x42,0x41,
0xcb,0x2b,0xb7,0xce,0x08,0xa1,0x76,0x1d,0x1a,0xb8,0xe3,0xcc,0x7e,0x48,0x20,0xe6,
0xf8,0x45,0x93,0xde,0xc3,0x63,0x0f,0xb0,0xac,0x5c,0xba,0xdf,0x07,0x77,0xe7,0x4e,
0x1f,0x28,0x10,0x6c,0x59,0xd3,0xdd,0x2d,0x65,0x39,0xb2,0x74,0x84,0x3d,0xf4,0xbd,
0xc7,0x79,0x60,0x0b,0x4d,0x33,0x36,0x25,0xbc,0xe0,0x09,0xcf,0x5b,0xe2,0x38,0x9e,
0xc0,0xef,0xd2,0x16,0x05,0xbe,0x53,0xf7,0xc2,0xc6,0xa2,0x24,0x98,0x1c,0xad,0x04
};
vector<u32> diffusion = {
0xf26cb481,0x16a5dc92,0x3c5ba924,0x79b65248,0x2fc64b18,0x615acd29,0xc3b59a42,0x976b2584,
0x6cf281b4,0xa51692dc,0x5b3c24a9,0xb6794852,0xc62f184b,0x5a6129cd,0xb5c3429a,0x6b978425,
0xb481f26c,0xdc9216a5,0xa9243c5b,0x524879b6,0x4b182fc6,0xcd29615a,0x9a42c3b5,0x2584976b,
0x81b46cf2,0x92dca516,0x24a95b3c,0x4852b679,0x184bc62f,0x29cd5a61,0x429ab5c3,0x84256b97
};
vector<u8> Forward(vector<u8> c) {
vector<u8> d(32);
for (u32 i = 0; i<256; i++) {
for (u8 j = 0; j<32; j++) {
d[j] = confusion[c[j]];
c[j] = 0;
}
for (u8 j = 0; j<32; j++)
for (u8 k = 0; k<32; k++)
c[j] ^= d[k] * ((diffusion[j] >> k) & 1);
}
for (u8 i = 0; i<16; i++)
d[i] = confusion[c[i * 2]] ^ last[c[i * 2 + 1]];
d.resize(16);
return d;
}
vector<vector<u8>> confinv(256), lastinv(256);
__m256i dm256i_mask[32];
void init_Forward_avx() {
alignas(32) u8 diffusion_aligned[32][32];
for (u8 k = 0; k < 32; k++) {
for (u8 j = 0; j < 32; j++) {
diffusion_aligned[k][j] = 0xff * ((diffusion[j] >> k) & 1);
}
}
for (int i = 0; i < 32; i++) dm256i_mask[i] = _mm256_load_si256((__m256i *) diffusion_aligned[i]);
}
void init() {
FOR(i, 256) {
confinv[confusion[i]].push_back(i);
lastinv[last[i]].push_back(i);
}
init_Forward_avx();
}
void print(const vector<u8>& d) {
FOR(i, sz(d)) printf("%3X", d[i]);
puts("");
FOR(i, sz(d)) printf("%3c", d[i]);
puts("");
}
vector<u8> DiffusionPhase(const vector<u8> &input) {
alignas(32) u8 c[32];
__m256i cbase = _mm256_setzero_si256();
for (u8 k = 0; k < 32; k++) {
const __m256i dk = _mm256_set1_epi8((u8)input[k]);
const __m256i dk_masked = _mm256_and_si256(dk, dm256i_mask[k]);
cbase = _mm256_xor_si256(cbase, dk_masked);
}
_mm256_store_si256((__m256i *)c, cbase);
vector<u8> ret(32);
FOR(i, 32) ret[i] = c[i];
return ret;
}
void Backward2DFS(const vector<u8> &d2, int dep) {
if (dep == 256) {
print(d2);
auto out = Forward(d2);
print(out);
exit(0);
}
auto rdiffused = DiffusionPhase(d2);
vector<vector<u8>> nts(1);
FOR(i, sz(rdiffused)) {
auto& v = confinv[rdiffused[i]];
if (sz(v) == 0) return;
vector<vector<u8>> tmp;
for (auto& a : nts) {
for (auto i : v) {
tmp.emplace_back(a);
tmp.back().push_back(i);
}
}
nts = tmp;
}
for (auto& nt : nts) {
print(nt);
}
for (auto& nt : nts) {
Backward2DFS(nt, dep + 1);
}
}
void Backward1DFS(const string& hash, vector<u8>& d1, int dep) {
if (dep == 16) {
Backward2DFS(d1, 0);
return;
}
FOR(i, 256) {
auto& x = confinv[i];
for (auto a : x) {
auto& y = lastinv[i ^ hash[dep]];
for (auto b : y) {
d1[2 * dep] = a;
d1[2 * dep + 1] = b;
assert(confusion[a] ^ last[b] == hash[dep]);
Backward1DFS(hash, d1, dep + 1);
}
}
}
}
void Backward() {
vector<u8> input(32, 0);
// Backward1DFS("Hire me!!!!!!!!", input, 0);
Backward1DFS("^^314@live.jp^^", input, 0);
// Backward1DFS("Reverse me fast", input, 0);
}
int main() {
init();
Backward();
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment