Exemplo n.º 1
0
/** Example function that generates a trail from a pair of inputs.
 * In this example, we use the messages found by I. Dinur, O. Dunkelman
 * and A. Shamir to produce a collision on Keccak[r=1088, c=512] reduced
 * to 4 rounds.
 */
void generateTrailFromDinurDunkelmanShamirCollision()
{
    const UINT8 M1[] =
    "\x32\x1c\xf3\xc4\x6d\xae\x59\x4c\xf4\xf0\x19\x5d\x4b\xe4\xc4\x25"
    "\x32\x30\x85\xd8\xf2\x12\x5e\x8d\xe2\x6e\x6e\xbb\x1e\x3b\xc3\x27"
    "\x58\x10\x09\x6c\xd5\x02\x90\xeb\x6f\xa0\xa4\x3b\xf1\xc7\x0c\x4a"
    "\x51\x5e\xb5\xcc\x83\xd9\x0d\x8d\x43\x08\x0a\x2b\xb0\xd3\x21\x9b"
    "\x75\x90\x67\x53\xd2\xde\x6d\x52\x44\x48\x29\x48\x2c\xed\xf4\x6f"
    "\x15\x2c\xce\x1a\xc7\x1d\x1c\x47\x68\x85\x09\xd4\x39\xf6\xeb\xf1"
    "\x57\xb2\xf7\xea\x87\xae\xfd\x09\xe6\x78\x88\x68\x30\xeb\x75\x48"
    "\x80\x2d\xc3\xc9\xcb\x6f\x9e\x3c\xfa\xbc\x2a\x3c\x7b\x80\xa4\xe6"
    "\xb8\x81\xb2\x2a\xb3\x32\x23";
    const unsigned int M1len = 135;
    UINT8 M2[] =
    "\xf7\x0e\xd3\xa4\x69\x8f\xbb\x80\xdf\x48\xc0\x90\xb9\x13\x72\xeb"
    "\x24\x04\x65\xa6\x3e\xf6\x65\x3a\x81\x88\x26\x8c\x1f\xb8\x51\xb6"
    "\x3c\xfa\xda\xaa\xc3\xa5\x2c\xee\xc2\xea\x78\xdb\x79\xe7\xea\xc8"
    "\x35\x9c\x2f\x44\x87\xe2\x21\x32\x5a\x7a\x01\xb3\x12\x07\x79\x90"
    "\xdc\x8b\x1c\x1b\xa8\x10\x8b\xe0\xca\x25\x9d\x9a\xac\xaa\xe7\x1b"
    "\x9c\x3e\x2f\x4e\xad\x7d\x71\x73\x5a\x01\x66\x55\xb9\xcf\x98\xa1"
    "\xc2\xa8\x1c\x5a\x8a\x34\xe3\xa0\xb1\x0b\x6c\xae\xe4\xf9\x80\x39"
    "\x91\x8b\xfa\xa4\x89\xa9\x81\x6e\xaa\xbc\xa9\x89\xf1\xf1\x2b\xe1"
    "\x95\x95\xef\x30\x45\x8b\x2e";
    const unsigned int M2len = 135;
    {
        UINT8 output[32];
        ReducedRoundKeccak keccak(1088, 512, 4);
        keccak.absorb(M1, M1len*8);
        keccak.squeeze(output, 256);
        for(unsigned int i=0; i<32; i++)
            cout << hex << (int)output[i] << " ";
        cout << endl;
    }
    {
        UINT8 output[32];
        ReducedRoundKeccak keccak(1088, 512, 4);
        keccak.absorb(M2, M2len*8);
        keccak.squeeze(output, 256);
        for(unsigned int i=0; i<32; i++)
            cout << hex << (int)output[i] << " ";
        cout << endl;
    }
    {
        KeccakFDCEquations keccakF(1600, 4);
        KeccakFPropagation DC(keccakF, KeccakFPropagation::DC);
        vector<LaneValue> m1lanes, m2lanes;
        {
            UINT8 temp[200];
            memset(temp, 0, 200);
            memcpy(temp, M1, M1len);
            temp[M1len] = 0x81;
            keccakF.fromBytesToLanes(temp, m1lanes);
        }
        {
            UINT8 temp[200];
            memset(temp, 0, 200);
            memcpy(temp, M2, M2len);
            temp[M2len] = 0x81;
            keccakF.fromBytesToLanes(temp, m2lanes);
        }
        vector<SliceValue> m1slices, m2slices;
        fromLanesToSlices(m1lanes, m1slices, 64);
        fromLanesToSlices(m2lanes, m2slices, 64);
        Trail trail;
        keccakF.buildDCTrailFromPair(m1slices, m2slices, trail);
        {
            ofstream fout("DinurEtAl.trail");
            trail.save(fout);
        }
        Trail::produceHumanReadableFile(DC, "DinurEtAl.trail");
    }
}