{"id":19864174,"url":"https://github.com/sr-lab/jump-mapper","last_synced_at":"2026-05-13T00:35:33.226Z","repository":{"id":75386299,"uuid":"122788178","full_name":"sr-lab/jump-mapper","owner":"sr-lab","description":"Approximating PIN guess numbers using keypad patterns.","archived":false,"fork":false,"pushed_at":"2018-10-25T15:05:26.000Z","size":37879,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-03-01T00:29:25.524Z","etag":null,"topics":["machine-learning","password-strength-estimator","pin","windows"],"latest_commit_sha":null,"homepage":null,"language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sr-lab.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-02-24T23:10:35.000Z","updated_at":"2019-05-12T10:57:21.000Z","dependencies_parsed_at":null,"dependency_job_id":"64a83e10-50cd-498e-99e0-e2afbceb6575","html_url":"https://github.com/sr-lab/jump-mapper","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/sr-lab/jump-mapper","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sr-lab%2Fjump-mapper","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sr-lab%2Fjump-mapper/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sr-lab%2Fjump-mapper/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sr-lab%2Fjump-mapper/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sr-lab","download_url":"https://codeload.github.com/sr-lab/jump-mapper/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sr-lab%2Fjump-mapper/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32963172,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-12T23:30:32.555Z","status":"ssl_error","status_checked_at":"2026-05-12T23:30:18.191Z","response_time":102,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["machine-learning","password-strength-estimator","pin","windows"],"created_at":"2024-11-12T15:17:42.651Z","updated_at":"2026-05-13T00:35:33.179Z","avatar_url":"https://github.com/sr-lab.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Jump Mapper\nApproximating PIN guess numbers using keypad patterns.\n\nBy training a model with an existing breached data set of 4-digit PINs and their frequencies, can we correctly predict the strength of previously unseen PINs using only keypad jumps?\n\n## Projects\nThis repository is a bit of a mixture. It's a Visual Studio solution containing several projects which are outlined below.\n\n### JumpMapper\nThis is the main event. By modelling PIN entry as a series of 'jumps' the model attempts to predict weaker PINs based on the pattern they form on the keyboard. The model is very simple, the following illustration shows the PINs `2369`, `4580` and `9851` being entered on an ATM-layout PIN pad next to the tree of jumps that is produced by training using these three PINs:\n\n![Model visualisation](assets/illustration.png)\n\nBriefly, use the program like this:\n\n```\n./JumpMapper.exe \u003ctraining_file\u003e \u003cinput_file\u003e [format]\n```\n\nThe options are quite straightforward:\n\n| Option        | Values              | Required? | Description                                               |\n|---------------|---------------------|-----------|-----------------------------------------------------------|\n| training_file | Any                 | Yes       | The file containing training data.                        |\n| input_file    | Any                 | Yes       | The file containing unseen data.                          |\n| layout        | `atm/numbar/numpad` | No        | The shape of the PIN pad model to use, defaults to `atm`. |\n| format        | `plain/coq`         | No        | The format of output, defaults to `plain`.                |\n\nResults are written to standard output. The `plain` format produced comma-delimited output with headings. The `coq` format option will produce a lookup structure compatible with [the Coq proof assistant](https://coq.inria.fr/).\n\n#### Training\nThe program accepts semicolon/newline delimited files in the format:\n\n```\npin1;frequency1\npin2;frequency2\npin3;frequency3\n...\n```\n\n\nOne such file can be found [here](http://jemore.free.fr/wordpress/?p=73\u0026t=most-common-pin-numbers-complete-list). If only four-digit PINs are provided as training data, unseen data should be limited to 4-digit PINS only or there'll be errors. Here's a sample:\n\n```\n1234;255\n1111;244\n0000;221\n1212;212\n7777;203\n...\n```\n\n#### Unseen Data\nUnseen data is provided as a text file with one PIN per line:\n\n```\n0000\n0001\n0002\n0003\n0004\n0005\n0006\n0007\n0008\n0009\n0010\n...\n```\n\n#### Output\nOutput is produced in the following `plain` format. Higher `vulnerability` means the PIN is a worse choice.\n\n```\npin, vulnerability\n0000, 118409\n0001, 116563\n0002, 116529\n0003, 116521\n0004, 116715\n0005, 116817\n...\n```\n\n#### The Example\nThe `/example` directory contains three files:\n\n- `target.txt` represents the target of the attack. Imagine this is a database of passwords waiting to be attacked. This has been generated by \"rehydrating\" [this file](http://jemore.free.fr/wordpress/?p=73\u0026t=most-common-pin-numbers-complete-list) using [Count Expander](https://github.com/sr-lab/count-expander), shuffling randomly and taking half the entries.\n- `random.txt` is a randomly generated set of 100 4-digit guesses.\n- `generated.txt` is a set of the 100 most likely 4-digit guesses according to the utility when trained on the other half of the data used to produce `target.txt`.\n\nYou can test the effectiveness of each of these attacks on `target.txt` using [Guesser](https://github.com/sr-lab/guesser). To save you doing that, however, `random.txt` guesses `5071/485009` correctly while `generated.txt` is more successful with `6060/485009` correct guesses (about 20% more effective).\n\n### JumpMapper.AscendingPinGenerator\nThis simple utility just generates PINs of a certain length in a certain range in ascending order. Use it like so:\n\n```\nAscendingPinGenerator [-?] [length=4] [count=100] [start=0]\n```\n\nOutput is printed to the console. The options are quite straightforward:\n\n| Option        | Values      | Required? | Description                                               |\n|---------------|-------------|-----------|-----------------------------------------------------------|\n| help          | Flag (`-?`) | No        | Shows usage information.                                  |\n| length        | Numeric     | No        | The length of PINs to generate.                           |\n| count         | Numeric     | No        | The number of PINs to generate.                           |\n| start         | Numeric     | No        | The PIN to start at (without leading zeroes).             |\n\n### JumpMapper.DateFilter\nAnother simple utility to remove PINs from a file that can be read as dates. Use it like this:\n\n```\nDateFilter \u003cin_file\u003e\n```\n\nOutput is printed to the console. There is only one option:\n\n| Option        | Values      | Required? | Description                                               |\n|---------------|-------------|-----------|-----------------------------------------------------------|\n| in_file       | Any         | Yes       | The path of the file to load PINs from.                   |\n\n### JumpMapper.PinHarvester\nThis utility harvests all contiguous numeric substrings from a given newline-delimited password dump file that are of a given length or longer. Use it like this:\n\n```\nPinHarvester \u003cin_file\u003e [length=4]\n```\n\nOutput is printed to the console. Options follow:\n\n| Option        | Values      | Required? | Description                                                                             |\n|---------------|-------------|-----------|-----------------------------------------------------------------------------------------|\n| in_file       | Any         | Yes       | The path of the file to load passwords from.                                            |\n| length        | Numeric     | No        | Continuous numeric substrings of this length or longer will be harvested. Default is 4. |\n\n### JumpMapper.RandomPinGenerator\nGenerates a specified number of unique random PINs of the specified length. Use it like this:\n\n```\nRandomPinGenerator [-?] [length=4] [count=100]\n```\n\nOutput is printed to the console. options follow:\n\n| Option        | Values      | Required? | Description                                               |\n|---------------|-------------|-----------|-----------------------------------------------------------|\n| help          | Flag (`-?`) | No        | Shows usage information.                                  |\n| length        | Numeric     | No        | The length of PINs to generate.                           |\n| count         | Numeric     | No        | The number of PINs to generate.                           |\n\n### JumpMapper.Shared\nJust some code shared between all utilities in the project. This is compiled into a seperate DLL, so make sure that stays in the same directory as the built utilities.\n\n## Credits\n- PIN numbers sorted by frequency: http://jemore.free.fr/wordpress/?p=73\u0026t=most-common-pin-numbers-complete-list\n- Original PIN number frequency analysis: http://www.datagenetics.com/blog/september32012/\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsr-lab%2Fjump-mapper","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsr-lab%2Fjump-mapper","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsr-lab%2Fjump-mapper/lists"}