/* Translated into C from Turbo Pascal, 23 Jan 2007 */ /******************************** MAKE_ID System PIN Encoder Beta Version 2.1 Arthur O'Dwyer, 6/2000 10^10 possible PINs over 10^77 (possible) codes ********************************/ #include "ImageFmtc.h" #include #include #define SIZE (31) /* no more than 2^sqr(SIZE) keys */ #define KEYS (14) /* number of possibilities for each PIN digit */ unsigned char Image[SIZE*SIZE]; void GetNextStage(void) { int i, j; int tmp[SIZE*SIZE]; for (j=0; j < SIZE; ++j) { for (i=0; i < SIZE; ++i) { int x = (j > 0) && Image[(j-1)*SIZE+i]; x ^= (j < SIZE-1) && Image[(j+1)*SIZE+i]; x ^= (i > 0) && Image[j*SIZE+(i-1)]; x ^= (i < SIZE-1) && Image[j*SIZE+(i+1)]; tmp[j*SIZE+i] = x; } } for (j=0; j < SIZE; ++j) { for (i=0; i < SIZE; ++i) { if (tmp[j*SIZE+i]) Image[j*SIZE+i] += (Image[j*SIZE+i] < 3); else Image[j*SIZE+i] = 0; } } } double MakeSeed(const char *idnum) { int i; double m = 1.; double seed = 0.; for (i=0; i < 10; ++i) { m *= 2.5; if (*idnum) { seed += (*idnum % KEYS) * m; ++idnum; } } return seed; } void SaveImage(const char *fname) { #define N (1) int i, j; int a, b; unsigned char tmp[N*SIZE * N*SIZE]; for (j=0; j < SIZE; ++j) { for (i=0; i < SIZE; ++i) { int t = Image[j*SIZE+i] + 1; if (t == 4) t = 3; t *= 60; for (a=0; a < N; ++a) for (b=0; b < N; ++b) tmp[(N*j+b)*(N*SIZE)+(N*i+a)] = t; } } WritePGM5(fname, tmp, N*SIZE, N*SIZE); #undef N } static int Randomizer(int n) { return (unsigned int)(52.*log((double)n)) % 4; } int main(int argc, char **argv) { char *id; double seed; int i, j; if (argc < 2) { puts("Usage: make_id password [output.pgm]"); return 0; } id = argv[1]; if (strlen(id) > 10) { puts("Password must be at most 10 characters"); return 0; } seed = MakeSeed(id); for (i=0; i < SIZE; ++i) for (j=0; j < SIZE; ++j) Image[j*SIZE+i] = Randomizer(seed + (i+1)+(j+1)*16); for (i=0; i < SIZE; ++i) { char buf[100]; sprintf(buf, "im%02d.pgm", i); SaveImage(buf); GetNextStage(); } SaveImage("output.pgm"); return 0; }