#include typedef unsigned long word; #define t1 0x5a827999 #define t2 0x6ed9eba1 #define t3 0x8f1bbcdc #define t4 0xca62c1d6 #define IVA_ 0x67452301 #define IVB_ 0xEFCDAB89 #define IVC_ 0x98BADCFE #define IVD_ 0x10325476 #define IVE_ 0xC3D2E1F0 #define IF(u, v, w) ((w) ^ ((u) & ((v) ^ (w)))) #define XOR(u, v, w) ((u) ^ (v) ^ (w)) #define MAJ(u, v, w) (((u) & (v)) | ((u) & (w)) | ((v) & (w))) #define rot(x, s) (((x)<<(s))^((x)>>(32-(s)))) #define rotr(x, s) (((x)<<(32-(s)))^((x)>>(s))) word IVA, IVB, IVC, IVD, IVE; word iva, ivb, ivc, ivd, ive; word Q[81], R[20], Q11, Q12, Q13, Q14, Q16, Q17, a, b; word m[80], mfirst[16]; int bad, chngd, ok; void sha0(void); void printbits(word x) { int i; char buf[40]; buf[39] = '\0'; for (i = 38; i >= 0; i--) { if ((i%5) != 4) { buf[i] = '0' + (x&1); x>>=1; } else buf[i] = ' '; } printf("%s\n", buf); } void first_block() { int i; word a, b; printf("Searching for 1st block..."); fflush(stdout); do { IVA = IVA_; IVB = IVB_; IVC = IVC_; IVD = IVD_; IVE = IVE_; for (i = 0; i < 16; i++) m[i] = mrand48(); sha0(); a = IVA&0x00bd25c0; b = (IVB^IVA)&0x00000608; if (b) continue; if (IVB&0x100) continue; b = ((IVA^IVB)>>1)&1; if (!b) continue; if (a == 0x00b12580) break; } while (1); for (i = 0; i < 16; i++) mfirst[i] = m[i]; iva = IVA; ivb = IVB; ivc = IVC; ivd = IVD; ive = IVE; printf(" OK\n"); printf("%08lx ", iva); printf("%08lx ", ivb); printf("%08lx ", ivc); printf("%08lx ", ivd); printf("%08lx\n", ive); } int search() { int i, j, l; word counter, stuck; word myIVA, myIVB, myIVC, myIVD, myIVE, tmp1, tmp2; bad = 1; do { if (bad) { first_block(); myIVC = ivc; myIVD = ivd; myIVE = ive; myIVA = rot(iva, 30); myIVB = rot(ivb, 30); tmp1 = rot(iva, 5) + IF(ivb, myIVC, myIVD) + myIVE + t1; tmp2 = IF(iva, myIVB, myIVC) + myIVD + t1; ok = 0; counter = 0; do { if (++counter > 0x7ff) break; Q[1] = mrand48(); Q[1] &= 0xff4efaff; Q[1] |= 0x800c28c2; Q[1] ^= (Q[1]^iva)&0x0042c200; m[0] = Q[1] - tmp1; if ((m[0]&0x42) != 0x2) continue; R[1] = rot(Q[1], 30); Q[2] = mrand48(); Q[2] &= 0x5fdfff2f; Q[2] |= 0x001ffd20; Q[2] ^= (Q[2]^Q[1])&0x00000008; m[1] = Q[2] - rot(Q[1], 5) - tmp2; if ((m[1]&0x42) != 0x42) continue; Q[3] = mrand48(); Q[3] &= 0xffd32ba9; Q[3] |= 0xa0032a28; Q[3] ^= (Q[3]^Q[2])&0x07c00000; m[2] = Q[3] - rot(Q[2], 5) - IF(Q[1], myIVA, myIVB) - myIVC - t1; if ((m[2]&0x42) != 0) continue; Q[4] = mrand48(); Q[4] &= 0xfef8fecf; Q[4] |= 0x80f83ccc; Q[4] ^= (Q[4]^Q[3])&0x04000000; m[3] = Q[4] - rot(Q[3], 5) - IF(Q[2], R[1], myIVA) - myIVB - t1; if ((m[3]&0x42) != 0x40) continue; ok = 1; break; } while (1); if (!ok) continue; R[2] = rot(Q[2], 30); R[3] = rot(Q[3], 30); R[4] = rot(Q[4], 30); ok = 0; counter = 0; do { if (++counter > 0x7ff) break; Q[5] = mrand48(); Q[5] &= 0x7e89256f; Q[5] |= 0x00092048; m[4] = Q[5] - rot(Q[4], 5) - IF(Q[3], R[2], R[1]) - myIVA - t1; if ((m[4]&0x42) != 0x42) continue; R[5] = rot(Q[5], 30); Q[6] = mrand48(); Q[6] &= 0xfede59b9; Q[6] |= 0x005e4808; m[5] = Q[6] - rot(Q[5], 5) - IF(Q[4], R[3], R[2]) - R[1] - t1; if ((m[5]&0x42) != 0) continue; Q[7] = mrand48(); Q[7] &= 0x7fdf4c7d; Q[7] |= 0x015f4004; Q[7] ^= (Q[7]^Q[6])&0x00800000; m[6] = Q[7] - rot(Q[6], 5) - IF(Q[5], R[4], R[3]) - R[2] - t1; if ((m[6]&0x42) != 0x2) continue; Q[8] = mrand48(); Q[8] &= 0xffc007ff; Q[8] |= 0x00400388; m[7] = Q[8] - rot(Q[7], 5) - IF(Q[6], R[5], R[4]) - R[3] - t1; if ((m[7]&0x42) != 0x40) continue; ok = 1; break; } while (1); if (!ok) continue; else bad = 0; printf(" OK\n"); R[6] = rot(Q[6], 30); R[7] = rot(Q[7], 30); R[8] = rot(Q[8], 30); } do { Q[9] = mrand48(); Q[9] &= 0xffe033f7; Q[9] |= 0x80003200; m[8] = Q[9] - rot(Q[8], 5) - IF(Q[7], R[6], R[5]) - R[4] - t1; Q[10] = mrand48(); Q[10] &= 0xfffffffd; Q[10] |= 0x001ffe00; m[9] = Q[10] - rot(Q[9], 5) - IF(Q[8], R[7], R[6]) - R[5] - t1; } while (((m[8]&0x42) != 0x40) || ((m[9]&0x42) != 0x2)); R[9] = rot(Q[9], 30); R[10] = rot(Q[10], 30); do { Q[11] = mrand48(); Q[11] &= 0x7ffffdff; Q[11] |= 0x00000008; m[10] = Q[11] - rot(Q[10], 5) - IF(Q[9], R[8], R[7]) - R[6] - t1; } while ((m[10]&0x42) != 0); R[11] = rot(Q[11], 30); do { Q[12] = mrand48(); Q[12] &= 0x7fffff77; m[11] = Q[12] - rot(Q[11], 5) - IF(Q[10], R[9], R[8]) - R[7] - t1; Q[13] = mrand48(); Q[13] &= 0xfffffff5; Q[13] |= 0x00000080; m[12] = Q[13] - rot(Q[12], 5) - IF(Q[11], R[10], R[9]) - R[8] - t1; } while (((m[11]&0x42) != 0) || ((m[12]&0x42) != 0)); R[12] = rot(Q[12], 30); R[13] = rot(Q[13], 30); do { Q[14] = mrand48(); Q[14] |= 0x80000008; m[13] = Q[14] - rot(Q[13], 5) - IF(Q[12], R[11], R[10]) - R[9] - t1; Q[15] = mrand48(); Q[15] &= 0x7fffffff; Q[15] |= 0x0000000a; Q[15] ^= (Q[14]^Q[15])&0x00800000; m[14] = Q[15] - rot(Q[14], 5) - IF(Q[13], R[12], R[11]) - R[10] - t1; } while ((m[13]&0x42) != 0x40 || (m[14]&0x42) != 0); R[14] = rot(Q[14], 30); R[15] = rot(Q[15], 30); m[16] = m[13]^m[8]^m[2]^m[0]; tmp1 = rot(Q[15], 5) + IF(Q[14], R[13], R[12]) + R[11] + t1; tmp2 = m[16] + IF(Q[15], R[14], R[13]) + R[12] + t1; m[17] = m[14]^m[9]^m[3]^m[1]; m[19] = m[0]^m[2]^m[3]^m[5]^m[8]^m[11]^m[13]; m[20] = m[1]^m[3]^m[4]^m[6]^m[9]^m[12]^m[14]; m[22] = m[0]^m[2]^m[3]^m[5]^m[6]^m[11]^m[13]^m[14]; m[25] = m[0]^m[1]^m[2]^m[5]^m[6]^m[13]; m[26] = m[1]^m[2]^m[3]^m[6]^m[7]^m[14]; m[28] = m[0]^m[2]^m[3]^m[4]^m[5]^m[9]^m[13]; m[29] = m[1]^m[3]^m[4]^m[5]^m[6]^m[10]^m[14]; m[31] = m[0]^m[2]^m[3]^m[5]^m[6]^m[7]^m[12]^m[13]; m[32] = m[1]^m[3]^m[4]^m[6]^m[7]^m[8]^m[13]^m[14]; m[35] = m[0]^m[2]^m[10]^m[11]^m[32]; m[38] = m[0]^m[1]^m[2]^m[4]^m[5]^m[6]^m[7]^m[8]^m[10]^m[11]; m[39] = m[1]^m[2]^m[3]^m[5]^m[6]^m[7]^m[8]^m[9]^m[11]^m[12]; m[40] = m[2]^m[3]^m[4]^m[6]^m[7]^m[8]^m[9]^m[10]^m[12]^m[13]; m[41] = m[3]^m[4]^m[5]^m[7]^m[8]^m[9]^m[10]^m[11]^m[13]^m[14]; m[44] = m[0]^m[1]^m[2]^m[3]^m[6]^m[7]^m[9]^m[10]^m[11]^m[12]; m[45] = m[1]^m[2]^m[3]^m[4]^m[7]^m[8]^m[10]^m[11]^m[12]^m[13]; m[46] = m[2]^m[3]^m[4]^m[5]^m[8]^m[9]^m[11]^m[12]^m[13]^m[14]; m[50] = m[0]^m[1]^m[3]^m[4]^m[6]^m[7]^m[10]^m[12]^m[14]; m[52] = m[0]^m[3]^m[5]^m[6]^m[9]^m[12]^m[13]^m[14]; m[58] = m[0]^m[1]^m[5]^m[8]^m[10]^m[13]^m[14]; m[61] = m[0]^m[1]^m[2]^m[4]^m[9]^m[11]^m[14]; m[63] = m[0]^m[3]^m[4]^m[6]^m[8]^m[11]; m[64] = m[1]^m[4]^m[5]^m[7]^m[9]^m[12]; m[65] = m[2]^m[5]^m[6]^m[8]^m[10]^m[13]; m[66] = m[3]^m[6]^m[7]^m[9]^m[11]^m[14]; m[68] = m[0]^m[2]^m[5]^m[9]^m[11]; m[69] = m[1]^m[3]^m[6]^m[10]^m[12]; m[70] = m[2]^m[4]^m[7]^m[11]^m[13]; m[71] = m[3]^m[5]^m[8]^m[12]^m[14]; m[73] = m[0]^m[2]^m[5]^m[7]^m[8]^m[10]^m[13]^m[14]; counter = 0; ok = 0; do { if (++counter > 0xffff) break; stuck = 0; ok = 1; do { if (++stuck > 0xfff) { ok = 0; break; } Q[16] = mrand48(); Q[16] &= 0xfffffff7; Q[16] |= 0x80000000; } while (((m[15] = Q[16] - tmp1)&0x42) != 0x40); if (!ok) break; ok = 0; Q[17] = rot(Q[16], 5) + tmp2; if (!((Q[17]>>1)&1)) { Q16 = Q[16]; Q[16] ^= 0x10000000; m[15] += Q[16]-Q16; Q[17] = rot(Q[16], 5) + tmp2; } Q[18] = m[17] + rot(Q[17], 5) + IF(Q[16], R[15], R[14]) + R[13] + t1; if (!(Q[18]>>31)) { Q16 = Q[16]; Q[16] ^= 0x00200000; m[15] += Q[16]-Q16; Q[17] = rot(Q[16], 5) + tmp2; Q[18] = m[17] + rot(Q[17], 5) + IF(Q[16], R[15], R[14]) + R[13] + t1; } if (Q[17]>>31) { Q16 = Q[16]; Q[16] ^= 0x04000000; m[15] += Q[16]-Q16; Q[17] = rot(Q[16], 5) + tmp2; Q[18] = m[17] + rot(Q[17], 5) + IF(Q[16], R[15], R[14]) + R[13] + t1; } R[16] = rot(Q[16], 30); R[17] = rot(Q[17], 30); R[18] = rot(Q[18], 30); m[18] = m[2]^m[4]^m[10]^m[15]; m[21] = m[5]^m[7]^m[13]^m[18]; Q[19] = m[18] + rot(Q[18], 5) + IF(Q[17], R[16], R[15]) + R[14] + t1; Q[20] = m[19] + rot(Q[19], 5) + IF(Q[18], R[17], R[16]) + R[15] + t1; Q[21] = m[20] + rot(Q[20], 5) + XOR(Q[19], R[18], R[17]) + R[16] + t2; Q[19] = rot(Q[19], 30); Q[22] = m[21] + rot(Q[21], 5) + XOR(Q[20], Q[19], R[18]) + R[17] + t2; if (((Q[22]^m[21])&0x2) || !((Q[21]^Q[20])&0x8)) continue; Q[20] = rot(Q[20], 30); Q[23] = m[22] + rot(Q[22], 5) + XOR(Q[21], Q[20], Q[19]) + R[18] + t2; if (((Q[23]^m[22])&0x2) || !((Q[22]^Q[21])&0x8)) continue; m[23] = m[7]^m[9]^m[15]^m[20]; m[24] = m[8]^m[10]^m[16]^m[21]; Q[21] = rot(Q[21], 30); Q[24] = m[23] + rot(Q[23], 5) + XOR(Q[22], Q[21], Q[20]) + Q[19] + t2; Q[22] = rot(Q[22], 30); Q[25] = m[24] + rot(Q[24], 5) + XOR(Q[23], Q[22], Q[21]) + Q[20] + t2; Q[23] = rot(Q[23], 30); Q[26] = m[25] + rot(Q[25], 5) + XOR(Q[24], Q[23], Q[22]) + Q[21] + t2; Q[24] = rot(Q[24], 30); Q[27] = m[26] + rot(Q[26], 5) + XOR(Q[25], Q[24], Q[23]) + Q[22] + t2; if (((Q[27]^m[26])&0x2) || ((Q[26]^Q[25])&0x8)) continue; m[27] = m[11]^m[13]^m[19]^m[24]; m[30] = m[14]^m[16]^m[22]^m[27]; Q[25] = rot(Q[25], 30); Q[28] = m[27] + rot(Q[27], 5) + XOR(Q[26], Q[25], Q[24]) + Q[23] + t2; Q[26] = rot(Q[26], 30); Q[29] = m[28] + rot(Q[28], 5) + XOR(Q[27], Q[26], Q[25]) + Q[24] + t2; Q[27] = rot(Q[27], 30); Q[30] = m[29] + rot(Q[29], 5) + XOR(Q[28], Q[27], Q[26]) + Q[25] + t2; Q[28] = rot(Q[28], 30); Q[31] = m[30] + rot(Q[30], 5) + XOR(Q[29], Q[28], Q[27]) + Q[26] + t2; if (((Q[31]^m[30])&0x2) || !((Q[30]^Q[29])&0x8)) continue; Q[29] = rot(Q[29], 30); Q[32] = m[31] + rot(Q[31], 5) + XOR(Q[30], Q[29], Q[28]) + Q[27] + t2; Q[30] = rot(Q[30], 30); Q[33] = m[32] + rot(Q[32], 5) + XOR(Q[31], Q[30], Q[29]) + Q[28] + t2; if (((Q[33]^m[32])&0x2) || ((Q[32]^Q[31])&0x8)) continue; m[33] = m[17]^m[19]^m[25]^m[30]; Q[31] = rot(Q[31], 30); Q[34] = m[33] + rot(Q[33], 5) + XOR(Q[32], Q[31], Q[30]) + Q[29] + t2; if (((Q[34]^m[33])&0x2) || !((Q[33]^Q[32])&0x8)) continue; m[34] = m[18]^m[20]^m[26]^m[31]; Q[32] = rot(Q[32], 30); Q[35] = m[34] + rot(Q[34], 5) + XOR(Q[33], Q[32], Q[31]) + Q[30] + t2; if (((Q[35]^m[34])&0x2) || !((Q[34]^Q[33])&0x8)) continue; m[36] = m[20]^m[22]^m[28]^m[33]; m[37] = m[21]^m[23]^m[29]^m[34]; Q[33] = rot(Q[33], 30); Q[36] = m[35] + rot(Q[35], 5) + XOR(Q[34], Q[33], Q[32]) + Q[31] + t2; Q[34] = rot(Q[34], 30); Q[37] = m[36] + rot(Q[36], 5) + XOR(Q[35], Q[34], Q[33]) + Q[32] + t2; Q[35] = rot(Q[35], 30); Q[38] = m[37] + rot(Q[37], 5) + XOR(Q[36], Q[35], Q[34]) + Q[33] + t2; Q[36] = rot(Q[36], 30); Q[39] = m[38] + rot(Q[38], 5) + XOR(Q[37], Q[36], Q[35]) + Q[34] + t2; Q[37] = rot(Q[37], 30); Q[40] = m[39] + rot(Q[39], 5) + XOR(Q[38], Q[37], Q[36]) + Q[35] + t2; Q[38] = rot(Q[38], 30); Q[41] = m[40] + rot(Q[40], 5) + MAJ(Q[39], Q[38], Q[37]) + Q[36] + t3; Q[39] = rot(Q[39], 30); Q[42] = m[41] + rot(Q[41], 5) + MAJ(Q[40], Q[39], Q[38]) + Q[37] + t3; if (((Q[42]^m[41])&0x2) || (!((Q[41]^Q[40])&0x8))) continue; m[42] = m[26]^m[28]^m[34]^m[39]; m[43] = m[27]^m[29]^m[35]^m[40]; Q[40] = rot(Q[40], 30); Q[43] = m[42] + rot(Q[42], 5) + MAJ(Q[41], Q[40], Q[39]) + Q[38] + t3; Q[41] = rot(Q[41], 30); Q[44] = m[43] + rot(Q[43], 5) + MAJ(Q[42], Q[41], Q[40]) + Q[39] + t3; if (!((Q[43]^Q[41])>>31) || (!(((Q[44]>>30)^Q[43])&0x2))) continue; m[47] = m[31]^m[33]^m[39]^m[44]; Q[42] = rot(Q[42], 30); Q[45] = m[44] + rot(Q[44], 5) + MAJ(Q[43], Q[42], Q[41]) + Q[40] + t3; Q[43] = rot(Q[43], 30); Q[46] = m[45] + rot(Q[45], 5) + MAJ(Q[44], Q[43], Q[42]) + Q[41] + t3; Q[44] = rot(Q[44], 30); Q[47] = m[46] + rot(Q[46], 5) + MAJ(Q[45], Q[44], Q[43]) + Q[42] + t3; Q[45] = rot(Q[45], 30); Q[48] = m[47] + rot(Q[47], 5) + MAJ(Q[46], Q[45], Q[44]) + Q[43] + t3; if (((Q[48]^m[47])&0x2) || (!((Q[47]^Q[46])&0x8))) continue; m[48] = m[32]^m[34]^m[40]^m[45]; m[49] = m[33]^m[35]^m[41]^m[46]; Q[46] = rot(Q[46], 30); Q[49] = m[48] + rot(Q[48], 5) + MAJ(Q[47], Q[46], Q[45]) + Q[44] + t3; Q[47] = rot(Q[47], 30); Q[50] = m[49] + rot(Q[49], 5) + MAJ(Q[48], Q[47], Q[46]) + Q[45] + t3; if (!((Q[49]^Q[47])>>31) || (!(((Q[50]>>30)^Q[49])&0x2))) continue; m[51] = m[35]^m[37]^m[43]^m[48]; m[53] = m[37]^m[39]^m[45]^m[50]; m[54] = m[38]^m[40]^m[46]^m[51]; m[55] = m[39]^m[41]^m[47]^m[52]; m[56] = m[40]^m[42]^m[48]^m[53]; m[57] = m[41]^m[43]^m[49]^m[54]; Q[48] = rot(Q[48], 30); Q[51] = m[50] + rot(Q[50], 5) + MAJ(Q[49], Q[48], Q[47]) + Q[46] + t3; Q[49] = rot(Q[49], 30); Q[52] = m[51] + rot(Q[51], 5) + MAJ(Q[50], Q[49], Q[48]) + Q[47] + t3; Q[50] = rot(Q[50], 30); Q[53] = m[52] + rot(Q[52], 5) + MAJ(Q[51], Q[50], Q[49]) + Q[48] + t3; Q[51] = rot(Q[51], 30); Q[54] = m[53] + rot(Q[53], 5) + MAJ(Q[52], Q[51], Q[50]) + Q[49] + t3; Q[52] = rot(Q[52], 30); Q[55] = m[54] + rot(Q[54], 5) + MAJ(Q[53], Q[52], Q[51]) + Q[50] + t3; Q[53] = rot(Q[53], 30); Q[56] = m[55] + rot(Q[55], 5) + MAJ(Q[54], Q[53], Q[52]) + Q[51] + t3; Q[54] = rot(Q[54], 30); Q[57] = m[56] + rot(Q[56], 5) + MAJ(Q[55], Q[54], Q[53]) + Q[52] + t3; Q[55] = rot(Q[55], 30); Q[58] = m[57] + rot(Q[57], 5) + MAJ(Q[56], Q[55], Q[54]) + Q[53] + t3; if (((Q[58]^m[57])&0x2) || (!((Q[57]^Q[56])&0x8))) continue; m[59] = m[43]^m[45]^m[51]^m[56]; m[60] = m[44]^m[46]^m[52]^m[57]; Q[56] = rot(Q[56], 30); Q[59] = m[58] + rot(Q[58], 5) + MAJ(Q[57], Q[56], Q[55]) + Q[54] + t3; Q[57] = rot(Q[57], 30); Q[60] = m[59] + rot(Q[59], 5) + MAJ(Q[58], Q[57], Q[56]) + Q[55] + t3; Q[58] = rot(Q[58], 30); Q[61] = m[60] + rot(Q[60], 5) + XOR(Q[59], Q[58], Q[57]) + Q[56] + t4; if (((Q[61]^m[60])&0x2) || !((Q[60]^Q[59])&0x8)) continue; Q[59] = rot(Q[59], 30); Q[62] = m[61] + rot(Q[61], 5) + XOR(Q[60], Q[59], Q[58]) + Q[57] + t4; if (((Q[62]^m[61])&0x2) || ((Q[61]^Q[60])&0x8)) continue; m[62] = m[46]^m[48]^m[54]^m[59]; Q[60] = rot(Q[60], 30); Q[63] = m[62] + rot(Q[62], 5) + XOR(Q[61], Q[60], Q[59]) + Q[58] + t4; Q[61] = rot(Q[61], 30); Q[64] = m[63] + rot(Q[63], 5) + XOR(Q[62], Q[61], Q[60]) + Q[59] + t4; Q[62] = rot(Q[62], 30); Q[65] = m[64] + rot(Q[64], 5) + XOR(Q[63], Q[62], Q[61]) + Q[60] + t4; if (((Q[65]^m[64])&0x2) || ((Q[64]^Q[63])&0x8)) continue; printf("c"); fflush(stdout); Q[63] = rot(Q[63], 30); Q[66] = m[65] + rot(Q[65], 5) + XOR(Q[64], Q[63], Q[62]) + Q[61] + t4; if (((Q[66]^m[65])&0x2) || ((Q[65]^Q[64])&0x8)) continue; printf("a"); fflush(stdout); m[67] = m[51]^m[53]^m[59]^m[64]; Q[64] = rot(Q[64], 30); Q[67] = m[66] + rot(Q[66], 5) + XOR(Q[65], Q[64], Q[63]) + Q[62] + t4; Q[65] = rot(Q[65], 30); Q[68] = m[67] + rot(Q[67], 5) + XOR(Q[66], Q[65], Q[64]) + Q[63] + t4; if (((Q[68]^m[67])&0x2) || !((Q[67]^Q[66])&0x8)) continue; printf("8"); fflush(stdout); Q[66] = rot(Q[66], 30); Q[69] = m[68] + rot(Q[68], 5) + XOR(Q[67], Q[66], Q[65]) + Q[64] + t4; Q[67] = rot(Q[67], 30); Q[70] = m[69] + rot(Q[69], 5) + XOR(Q[68], Q[67], Q[66]) + Q[65] + t4; if (((Q[70]^m[69])&0x2) || ((Q[69]^Q[68])&0x8)) continue; printf("6"); fflush(stdout); Q[68] = rot(Q[68], 30); Q[71] = m[70] + rot(Q[70], 5) + XOR(Q[69], Q[68], Q[67]) + Q[66] + t4; if (((Q[71]^m[70])&0x2) || !((Q[70]^Q[69])&0x8)) continue; printf("4"); fflush(stdout); Q[69] = rot(Q[69], 30); Q[72] = m[71] + rot(Q[71], 5) + XOR(Q[70], Q[69], Q[68]) + Q[67] + t4; if (((Q[72]^m[71])&0x2) || !((Q[71]^Q[70])&0x8)) continue; printf("2"); fflush(stdout); m[72] = m[56]^m[58]^m[64]^m[69]; Q[70] = rot(Q[70], 30); Q[73] = m[72] + rot(Q[72], 5) + XOR(Q[71], Q[70], Q[69]) + Q[68] + t4; Q[71] = rot(Q[71], 30); Q[74] = m[73] + rot(Q[73], 5) + XOR(Q[72], Q[71], Q[70]) + Q[69] + t4; if (((Q[74]^m[73])&0x2) || !((Q[73]^Q[72])&0x8)) continue; ok = 1; break; } while (1); } while (!ok); return 0; } void sha0() { int i; for (i = 16; i < 80; i++) m[i] = m[i-3]^m[i-8]^m[i-14]^m[i-16]; Q[1] = m[0] + rot(IVA, 5) + IF(IVB, IVC, IVD) + IVE + t1; IVB = rot(IVB, 30); Q[2] = m[1] + rot(Q[1], 5) + IF(IVA, IVB, IVC) + IVD + t1; IVA = rot(IVA, 30); Q[3] = m[2] + rot(Q[2], 5) + IF(Q[1], IVA, IVB) + IVC + t1; Q[1] = rot(Q[1], 30); Q[4] = m[3] + rot(Q[3], 5) + IF(Q[2], Q[1], IVA) + IVB + t1; Q[2] = rot(Q[2], 30); Q[5] = m[4] + rot(Q[4], 5) + IF(Q[3], Q[2], Q[1]) + IVA + t1; Q[3] = rot(Q[3], 30); Q[6] = m[5] + rot(Q[5], 5) + IF(Q[4], Q[3], Q[2]) + Q[1] + t1; Q[4] = rot(Q[4], 30); Q[7] = m[6] + rot(Q[6], 5) + IF(Q[5], Q[4], Q[3]) + Q[2] + t1; Q[5] = rot(Q[5], 30); Q[8] = m[7] + rot(Q[7], 5) + IF(Q[6], Q[5], Q[4]) + Q[3] + t1; Q[6] = rot(Q[6], 30); Q[9] = m[8] + rot(Q[8], 5) + IF(Q[7], Q[6], Q[5]) + Q[4] + t1; Q[7] = rot(Q[7], 30); Q[10] = m[9] + rot(Q[9], 5) + IF(Q[8], Q[7], Q[6]) + Q[5] + t1; Q[8] = rot(Q[8], 30); Q[11] = m[10] + rot(Q[10], 5) + IF(Q[9], Q[8], Q[7]) + Q[6] + t1; Q[9] = rot(Q[9], 30); Q[12] = m[11] + rot(Q[11], 5) + IF(Q[10], Q[9], Q[8]) + Q[7] + t1; Q[10] = rot(Q[10], 30); Q[13] = m[12] + rot(Q[12], 5) + IF(Q[11], Q[10], Q[9]) + Q[8] + t1; Q[11] = rot(Q[11], 30); Q[14] = m[13] + rot(Q[13], 5) + IF(Q[12], Q[11], Q[10]) + Q[9] + t1; Q[12] = rot(Q[12], 30); Q[15] = m[14] + rot(Q[14], 5) + IF(Q[13], Q[12], Q[11]) + Q[10] + t1; Q[13] = rot(Q[13], 30); Q[16] = m[15] + rot(Q[15], 5) + IF(Q[14], Q[13], Q[12]) + Q[11] + t1; Q[14] = rot(Q[14], 30); Q[17] = m[16] + rot(Q[16], 5) + IF(Q[15], Q[14], Q[13]) + Q[12] + t1; Q[15] = rot(Q[15], 30); Q[18] = m[17] + rot(Q[17], 5) + IF(Q[16], Q[15], Q[14]) + Q[13] + t1; Q[16] = rot(Q[16], 30); Q[19] = m[18] + rot(Q[18], 5) + IF(Q[17], Q[16], Q[15]) + Q[14] + t1; Q[17] = rot(Q[17], 30); Q[20] = m[19] + rot(Q[19], 5) + IF(Q[18], Q[17], Q[16]) + Q[15] + t1; Q[18] = rot(Q[18], 30); Q[21] = m[20] + rot(Q[20], 5) + XOR(Q[19], Q[18], Q[17]) + Q[16] + t2; Q[19] = rot(Q[19], 30); Q[22] = m[21] + rot(Q[21], 5) + XOR(Q[20], Q[19], Q[18]) + Q[17] + t2; Q[20] = rot(Q[20], 30); Q[23] = m[22] + rot(Q[22], 5) + XOR(Q[21], Q[20], Q[19]) + Q[18] + t2; Q[21] = rot(Q[21], 30); Q[24] = m[23] + rot(Q[23], 5) + XOR(Q[22], Q[21], Q[20]) + Q[19] + t2; Q[22] = rot(Q[22], 30); Q[25] = m[24] + rot(Q[24], 5) + XOR(Q[23], Q[22], Q[21]) + Q[20] + t2; Q[23] = rot(Q[23], 30); Q[26] = m[25] + rot(Q[25], 5) + XOR(Q[24], Q[23], Q[22]) + Q[21] + t2; Q[24] = rot(Q[24], 30); Q[27] = m[26] + rot(Q[26], 5) + XOR(Q[25], Q[24], Q[23]) + Q[22] + t2; Q[25] = rot(Q[25], 30); Q[28] = m[27] + rot(Q[27], 5) + XOR(Q[26], Q[25], Q[24]) + Q[23] + t2; Q[26] = rot(Q[26], 30); Q[29] = m[28] + rot(Q[28], 5) + XOR(Q[27], Q[26], Q[25]) + Q[24] + t2; Q[27] = rot(Q[27], 30); Q[30] = m[29] + rot(Q[29], 5) + XOR(Q[28], Q[27], Q[26]) + Q[25] + t2; Q[28] = rot(Q[28], 30); Q[31] = m[30] + rot(Q[30], 5) + XOR(Q[29], Q[28], Q[27]) + Q[26] + t2; Q[29] = rot(Q[29], 30); Q[32] = m[31] + rot(Q[31], 5) + XOR(Q[30], Q[29], Q[28]) + Q[27] + t2; Q[30] = rot(Q[30], 30); Q[33] = m[32] + rot(Q[32], 5) + XOR(Q[31], Q[30], Q[29]) + Q[28] + t2; Q[31] = rot(Q[31], 30); Q[34] = m[33] + rot(Q[33], 5) + XOR(Q[32], Q[31], Q[30]) + Q[29] + t2; Q[32] = rot(Q[32], 30); Q[35] = m[34] + rot(Q[34], 5) + XOR(Q[33], Q[32], Q[31]) + Q[30] + t2; Q[33] = rot(Q[33], 30); Q[36] = m[35] + rot(Q[35], 5) + XOR(Q[34], Q[33], Q[32]) + Q[31] + t2; Q[34] = rot(Q[34], 30); Q[37] = m[36] + rot(Q[36], 5) + XOR(Q[35], Q[34], Q[33]) + Q[32] + t2; Q[35] = rot(Q[35], 30); Q[38] = m[37] + rot(Q[37], 5) + XOR(Q[36], Q[35], Q[34]) + Q[33] + t2; Q[36] = rot(Q[36], 30); Q[39] = m[38] + rot(Q[38], 5) + XOR(Q[37], Q[36], Q[35]) + Q[34] + t2; Q[37] = rot(Q[37], 30); Q[40] = m[39] + rot(Q[39], 5) + XOR(Q[38], Q[37], Q[36]) + Q[35] + t2; Q[38] = rot(Q[38], 30); Q[41] = m[40] + rot(Q[40], 5) + MAJ(Q[39], Q[38], Q[37]) + Q[36] + t3; Q[39] = rot(Q[39], 30); Q[42] = m[41] + rot(Q[41], 5) + MAJ(Q[40], Q[39], Q[38]) + Q[37] + t3; Q[40] = rot(Q[40], 30); Q[43] = m[42] + rot(Q[42], 5) + MAJ(Q[41], Q[40], Q[39]) + Q[38] + t3; Q[41] = rot(Q[41], 30); Q[44] = m[43] + rot(Q[43], 5) + MAJ(Q[42], Q[41], Q[40]) + Q[39] + t3; Q[42] = rot(Q[42], 30); Q[45] = m[44] + rot(Q[44], 5) + MAJ(Q[43], Q[42], Q[41]) + Q[40] + t3; Q[43] = rot(Q[43], 30); Q[46] = m[45] + rot(Q[45], 5) + MAJ(Q[44], Q[43], Q[42]) + Q[41] + t3; Q[44] = rot(Q[44], 30); Q[47] = m[46] + rot(Q[46], 5) + MAJ(Q[45], Q[44], Q[43]) + Q[42] + t3; Q[45] = rot(Q[45], 30); Q[48] = m[47] + rot(Q[47], 5) + MAJ(Q[46], Q[45], Q[44]) + Q[43] + t3; Q[46] = rot(Q[46], 30); Q[49] = m[48] + rot(Q[48], 5) + MAJ(Q[47], Q[46], Q[45]) + Q[44] + t3; Q[47] = rot(Q[47], 30); Q[50] = m[49] + rot(Q[49], 5) + MAJ(Q[48], Q[47], Q[46]) + Q[45] + t3; Q[48] = rot(Q[48], 30); Q[51] = m[50] + rot(Q[50], 5) + MAJ(Q[49], Q[48], Q[47]) + Q[46] + t3; Q[49] = rot(Q[49], 30); Q[52] = m[51] + rot(Q[51], 5) + MAJ(Q[50], Q[49], Q[48]) + Q[47] + t3; Q[50] = rot(Q[50], 30); Q[53] = m[52] + rot(Q[52], 5) + MAJ(Q[51], Q[50], Q[49]) + Q[48] + t3; Q[51] = rot(Q[51], 30); Q[54] = m[53] + rot(Q[53], 5) + MAJ(Q[52], Q[51], Q[50]) + Q[49] + t3; Q[52] = rot(Q[52], 30); Q[55] = m[54] + rot(Q[54], 5) + MAJ(Q[53], Q[52], Q[51]) + Q[50] + t3; Q[53] = rot(Q[53], 30); Q[56] = m[55] + rot(Q[55], 5) + MAJ(Q[54], Q[53], Q[52]) + Q[51] + t3; Q[54] = rot(Q[54], 30); Q[57] = m[56] + rot(Q[56], 5) + MAJ(Q[55], Q[54], Q[53]) + Q[52] + t3; Q[55] = rot(Q[55], 30); Q[58] = m[57] + rot(Q[57], 5) + MAJ(Q[56], Q[55], Q[54]) + Q[53] + t3; Q[56] = rot(Q[56], 30); Q[59] = m[58] + rot(Q[58], 5) + MAJ(Q[57], Q[56], Q[55]) + Q[54] + t3; Q[57] = rot(Q[57], 30); Q[60] = m[59] + rot(Q[59], 5) + MAJ(Q[58], Q[57], Q[56]) + Q[55] + t3; Q[58] = rot(Q[58], 30); Q[61] = m[60] + rot(Q[60], 5) + XOR(Q[59], Q[58], Q[57]) + Q[56] + t4; Q[59] = rot(Q[59], 30); Q[62] = m[61] + rot(Q[61], 5) + XOR(Q[60], Q[59], Q[58]) + Q[57] + t4; Q[60] = rot(Q[60], 30); Q[63] = m[62] + rot(Q[62], 5) + XOR(Q[61], Q[60], Q[59]) + Q[58] + t4; Q[61] = rot(Q[61], 30); Q[64] = m[63] + rot(Q[63], 5) + XOR(Q[62], Q[61], Q[60]) + Q[59] + t4; Q[62] = rot(Q[62], 30); Q[65] = m[64] + rot(Q[64], 5) + XOR(Q[63], Q[62], Q[61]) + Q[60] + t4; Q[63] = rot(Q[63], 30); Q[66] = m[65] + rot(Q[65], 5) + XOR(Q[64], Q[63], Q[62]) + Q[61] + t4; Q[64] = rot(Q[64], 30); Q[67] = m[66] + rot(Q[66], 5) + XOR(Q[65], Q[64], Q[63]) + Q[62] + t4; Q[65] = rot(Q[65], 30); Q[68] = m[67] + rot(Q[67], 5) + XOR(Q[66], Q[65], Q[64]) + Q[63] + t4; Q[66] = rot(Q[66], 30); Q[69] = m[68] + rot(Q[68], 5) + XOR(Q[67], Q[66], Q[65]) + Q[64] + t4; Q[67] = rot(Q[67], 30); Q[70] = m[69] + rot(Q[69], 5) + XOR(Q[68], Q[67], Q[66]) + Q[65] + t4; Q[68] = rot(Q[68], 30); Q[71] = m[70] + rot(Q[70], 5) + XOR(Q[69], Q[68], Q[67]) + Q[66] + t4; Q[69] = rot(Q[69], 30); Q[72] = m[71] + rot(Q[71], 5) + XOR(Q[70], Q[69], Q[68]) + Q[67] + t4; Q[70] = rot(Q[70], 30); Q[73] = m[72] + rot(Q[72], 5) + XOR(Q[71], Q[70], Q[69]) + Q[68] + t4; Q[71] = rot(Q[71], 30); Q[74] = m[73] + rot(Q[73], 5) + XOR(Q[72], Q[71], Q[70]) + Q[69] + t4; Q[72] = rot(Q[72], 30); Q[75] = m[74] + rot(Q[74], 5) + XOR(Q[73], Q[72], Q[71]) + Q[70] + t4; Q[73] = rot(Q[73], 30); Q[76] = m[75] + rot(Q[75], 5) + XOR(Q[74], Q[73], Q[72]) + Q[71] + t4; Q[74] = rot(Q[74], 30); Q[77] = m[76] + rot(Q[76], 5) + XOR(Q[75], Q[74], Q[73]) + Q[72] + t4; Q[75] = rot(Q[75], 30); Q[78] = m[77] + rot(Q[77], 5) + XOR(Q[76], Q[75], Q[74]) + Q[73] + t4; Q[76] = rot(Q[76], 30); Q[79] = m[78] + rot(Q[78], 5) + XOR(Q[77], Q[76], Q[75]) + Q[74] + t4; Q[77] = rot(Q[77], 30); Q[80] = m[79] + rot(Q[79], 5) + XOR(Q[78], Q[77], Q[76]) + Q[75] + t4; Q[78] = rot(Q[78], 30); IVA = rot(IVA, 2) + Q[80]; IVB = rot(IVB, 2) + Q[79]; IVC += Q[78]; IVD += Q[77]; IVE += Q[76]; for (i = 1; i <= 78; i++) Q[i] = rot(Q[i], 2); } int main(int argc, char* argv[]) { int i; word m1[16]; int seed; if (argc>1) seed = atoi(argv[1]); else seed = time(0); printf("Seed: %d\n", seed); srand48(seed); search(); for (i = 0; i < 16; i++) m1[i] = m[i]; m[0] ^= 0x80000042; m[2] ^= 0x80000042; m[3] ^= 0x40; m[4] ^= 0x40; m[5] ^= 0x42; m[6] ^= 0x80000002; m[7] ^= 0x80000002; m[8] ^= 0x40; m[9] ^= 0x80000000; m[10] ^= 0x80000040; m[11] ^= 0x80000002; m[12] ^= 0x2; m[13] ^= 0x80000040; m[14] ^= 0x80000000; m[15] ^= 0x80000040; printf("\n//1st block:\n"); for (i = 0; i < 16; i++) printf("m[%2d] = 0x%08lx;\n", i, mfirst[i]); printf("//2nd block:\n"); for (i = 0; i < 16; i++) { printf("m1[%2d] = 0x%08lx; ", i, m1[i]); printf("m2[%2d] = 0x%08lx;\n", i, m[i]); } return 0; }