// gcc -o otp_prngcrack otp_prngcrack.c -Wall -std=c99 #include #include #include #include int main( int argc, char *argv[] ) { if( argc != 4 ) { printf("Usage: %s ciphertext beginTime endTime\n", argv[0] ); return 1; } if( strlen( argv[1] ) % 2 != 0 ) { printf( "Ciphertext has invalid length\n" ); return 1; } const int length = strlen( argv[1] ) / 2; char decoded[length]; for( int i = 0; i < length; i++ ) { unsigned int byte; if( sscanf( argv[1] + 2 * i, "%02x", &byte ) != 1 ) { printf( "Error parsing ciphertext\n" ); return 1; } decoded[i] = byte & 0xff; } unsigned int beginTime, endTime; if( sscanf( argv[2], "%d", &beginTime ) != 1 ) { printf( "Error parsing begin time\n" ); return 1; } if( sscanf( argv[3], "%d", &endTime ) != 1 ) { printf( "Error parsing end time\n" ); return 1; } if( beginTime > endTime ) { printf( "Begin time must not be greater than end time\n" ); return 1; } for( unsigned int i = beginTime; i <= endTime; i++ ) { int valid = 1; char decrypted[length + 1]; decrypted[length] = '\0'; srand( i ); for( int j = 0; j < length; j++ ) { char c = decoded[j] ^ ( rand() & 0xff ); if( !isprint( c ) ) { valid = 0; break; } decrypted[j] = c; } if( valid ) printf( "[%d]: %s\n", i, decrypted ); } return 0; }