[
  {
    "path": ".all-contributorsrc",
    "content": "{\n  \"files\": [\n    \"README.md\"\n  ],\n  \"imageSize\": 100,\n  \"commit\": false,\n  \"contributors\": [\n    {\n      \"login\": \"cyclic3\",\n      \"name\": \"cyclic3\",\n      \"avatar_url\": \"https://avatars1.githubusercontent.com/u/15613874?v=4\",\n      \"profile\": \"https://github.com/Cyclic3\",\n      \"contributions\": [\n        \"design\",\n        \"maintenance\",\n        \"code\",\n        \"ideas\"\n      ]\n    },\n    {\n      \"login\": \"brandonskerritt\",\n      \"name\": \"Brandon\",\n      \"avatar_url\": \"https://avatars3.githubusercontent.com/u/10378052?v=4\",\n      \"profile\": \"https://skerritt.blog\",\n      \"contributions\": [\n        \"design\",\n        \"maintenance\",\n        \"code\",\n        \"ideas\"\n      ]\n    },\n    {\n      \"login\": \"michalani\",\n      \"name\": \"michalani\",\n      \"avatar_url\": \"https://avatars0.githubusercontent.com/u/27767884?v=4\",\n      \"profile\": \"https://github.com/michalani\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"ashb07\",\n      \"name\": \"ashb07\",\n      \"avatar_url\": \"https://avatars2.githubusercontent.com/u/24845568?v=4\",\n      \"profile\": \"https://github.com/ashb07\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"TheAlcanian\",\n      \"name\": \"Shardion\",\n      \"avatar_url\": \"https://avatars3.githubusercontent.com/u/22127191?v=4\",\n      \"profile\": \"https://github.com/TheAlcanian\",\n      \"contributions\": [\n        \"bug\"\n      ]\n    },\n    {\n      \"login\": \"Bryzizzle\",\n      \"name\": \"Bryan\",\n      \"avatar_url\": \"https://avatars0.githubusercontent.com/u/57810197?v=4\",\n      \"profile\": \"https://github.com/Bryzizzle\",\n      \"contributions\": [\n        \"translation\",\n        \"doc\"\n      ]\n    },\n    {\n      \"login\": \"lukasgabriel\",\n      \"name\": \"Lukas Gabriel\",\n      \"avatar_url\": \"https://avatars0.githubusercontent.com/u/52338810?v=4\",\n      \"profile\": \"https://lukasgabriel.net\",\n      \"contributions\": [\n        \"code\",\n        \"bug\",\n        \"translation\",\n        \"ideas\"\n      ]\n    },\n    {\n      \"login\": \"DarshanBhoi\",\n      \"name\": \"Darshan\",\n      \"avatar_url\": \"https://avatars2.githubusercontent.com/u/70128281?v=4\",\n      \"profile\": \"https://github.com/DarshanBhoi\",\n      \"contributions\": [\n        \"bug\"\n      ]\n    },\n    {\n      \"login\": \"SkeletalDemise\",\n      \"name\": \"SkeletalDemise\",\n      \"avatar_url\": \"https://avatars1.githubusercontent.com/u/29117662?v=4\",\n      \"profile\": \"https://github.com/SkeletalDemise\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"cclauss\",\n      \"name\": \"Christian Clauss\",\n      \"avatar_url\": \"https://avatars3.githubusercontent.com/u/3709715?v=4\",\n      \"profile\": \"https://www.patreon.com/cclauss\",\n      \"contributions\": [\n        \"code\",\n        \"bug\"\n      ]\n    },\n    {\n      \"login\": \"machinexa2\",\n      \"name\": \"Machinexa2\",\n      \"avatar_url\": \"https://avatars1.githubusercontent.com/u/60662297?v=4\",\n      \"profile\": \"http://machinexa.xss.ht\",\n      \"contributions\": [\n        \"content\"\n      ]\n    },\n    {\n      \"login\": \"anantverma275\",\n      \"name\": \"Anant Verma\",\n      \"avatar_url\": \"https://avatars1.githubusercontent.com/u/18184503?v=4\",\n      \"profile\": \"https://github.com/anantverma275\",\n      \"contributions\": [\n        \"code\",\n        \"bug\"\n      ]\n    },\n    {\n      \"login\": \"XVXTOR\",\n      \"name\": \"XVXTOR\",\n      \"avatar_url\": \"https://avatars1.githubusercontent.com/u/40268197?v=4\",\n      \"profile\": \"https://github.com/XVXTOR\",\n      \"contributions\": [\n        \"doc\"\n      ]\n    },\n    {\n      \"login\": \"Itamikame\",\n      \"name\": \"Itamikame\",\n      \"avatar_url\": \"https://avatars2.githubusercontent.com/u/59034423?v=4\",\n      \"profile\": \"https://github.com/Itamikame\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"MikeMerz\",\n      \"name\": \"MikeMerz\",\n      \"avatar_url\": \"https://avatars3.githubusercontent.com/u/50526795?v=4\",\n      \"profile\": \"https://github.com/MikeMerz\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"jacobggman\",\n      \"name\": \"Jacob Galam\",\n      \"avatar_url\": \"https://avatars2.githubusercontent.com/u/30216976?v=4\",\n      \"profile\": \"https://github.com/jacobggman\",\n      \"contributions\": [\n        \"code\",\n        \"bug\"\n      ]\n    },\n    {\n      \"login\": \"TuxTheXplorer\",\n      \"name\": \"TuxTheXplorer\",\n      \"avatar_url\": \"https://avatars1.githubusercontent.com/u/37508897?v=4\",\n      \"profile\": \"https://tuxthexplorer.github.io/\",\n      \"contributions\": [\n        \"translation\"\n      ]\n    },\n    {\n      \"login\": \"Itamai\",\n      \"name\": \"Itamai\",\n      \"avatar_url\": \"https://avatars3.githubusercontent.com/u/53093696?v=4\",\n      \"profile\": \"https://github.com/Itamai\",\n      \"contributions\": [\n        \"code\",\n        \"bug\"\n      ]\n    },\n    {\n      \"login\": \"Termack\",\n      \"name\": \"Filipe\",\n      \"avatar_url\": \"https://avatars2.githubusercontent.com/u/26333901?v=4\",\n      \"profile\": \"https://github.com/Termack\",\n      \"contributions\": [\n        \"translation\"\n      ]\n    },\n    {\n      \"login\": \"malathit\",\n      \"name\": \"Malathi\",\n      \"avatar_url\": \"https://avatars0.githubusercontent.com/u/2684148?v=4\",\n      \"profile\": \"https://github.com/malathit\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"HexChaos\",\n      \"name\": \"Jack\",\n      \"avatar_url\": \"https://avatars1.githubusercontent.com/u/8947820?v=4\",\n      \"profile\": \"https://hexchaos.xyz/\",\n      \"contributions\": [\n        \"translation\"\n      ]\n    },\n    {\n      \"login\": \"yafkari\",\n      \"name\": \"Younes\",\n      \"avatar_url\": \"https://avatars3.githubusercontent.com/u/41365655?v=4\",\n      \"profile\": \"https://github.com/yafkari\",\n      \"contributions\": [\n        \"translation\"\n      ]\n    },\n    {\n      \"login\": \"Marnick39\",\n      \"name\": \"Marnick Vandecauter\",\n      \"avatar_url\": \"https://avatars2.githubusercontent.com/u/17315511?v=4\",\n      \"profile\": \"https://gitlab.com/Marnick39\",\n      \"contributions\": [\n        \"translation\"\n      ]\n    },\n    {\n      \"login\": \"mav8557\",\n      \"name\": \"Michael V\",\n      \"avatar_url\": \"https://avatars0.githubusercontent.com/u/47306745?v=4\",\n      \"profile\": \"https://github.com/mav8557\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"chuinzer\",\n      \"name\": \"chuinzer\",\n      \"avatar_url\": \"https://avatars2.githubusercontent.com/u/64257785?v=4\",\n      \"profile\": \"https://github.com/chuinzer\",\n      \"contributions\": [\n        \"translation\"\n      ]\n    },\n    {\n      \"login\": \"blackcat-917\",\n      \"name\": \"blackcat-917\",\n      \"avatar_url\": \"https://avatars1.githubusercontent.com/u/53786619?v=4\",\n      \"profile\": \"https://github.com/blackcat-917\",\n      \"contributions\": [\n        \"translation\",\n        \"doc\"\n      ]\n    },\n    {\n      \"login\": \"Ozzyz\",\n      \"name\": \"Åsmund Brekke\",\n      \"avatar_url\": \"https://avatars3.githubusercontent.com/u/6113447?v=4\",\n      \"profile\": \"https://github.com/Ozzyz\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"sashreek1\",\n      \"name\": \"Sashreek Shankar\",\n      \"avatar_url\": \"https://avatars1.githubusercontent.com/u/45600974?v=4\",\n      \"profile\": \"https://github.com/sashreek1\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"cryptobadger\",\n      \"name\": \"cryptobadger\",\n      \"avatar_url\": \"https://avatars2.githubusercontent.com/u/26308101?v=4\",\n      \"profile\": \"https://github.com/cryptobadger\",\n      \"contributions\": [\n        \"code\",\n        \"bug\"\n      ]\n    },\n    {\n      \"login\": \"e1fy\",\n      \"name\": \"elf\",\n      \"avatar_url\": \"https://avatars3.githubusercontent.com/u/61194758?v=4\",\n      \"profile\": \"https://github.com/e1fy\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"rogercyyu\",\n      \"name\": \"Roger Yu\",\n      \"avatar_url\": \"https://avatars0.githubusercontent.com/u/45835736?v=4\",\n      \"profile\": \"https://github.com/rogercyyu\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"JesseEmond\",\n      \"name\": \"dysleixa\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/1843555?v=4\",\n      \"profile\": \"https://github.com/JesseEmond\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"mohzulfikar\",\n      \"name\": \"Mohammad Zulfikar\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/48849323?v=4\",\n      \"profile\": \"http://mohzulfikar.me\",\n      \"contributions\": [\n        \"doc\"\n      ]\n    },\n    {\n      \"login\": \"AABur\",\n      \"name\": \"Alexander Burchenko\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/41373199?v=4\",\n      \"profile\": \"https://github.com/AABur\",\n      \"contributions\": [\n        \"translation\"\n      ]\n    },\n    {\n      \"login\": \"PunGrumpy\",\n      \"name\": \"Noppakorn Kaewsalabnil\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/108584943?v=4?s=100\",\n      \"profile\": \"https://github.com/PunGrumpy\",\n      \"contributions\": [\n        \"translation\"\n      ]\n    }\n  ],\n  \"contributorsPerLine\": 7,\n  \"projectName\": \"Ciphey\",\n  \"projectOwner\": \"Ciphey\",\n  \"repoType\": \"github\",\n  \"repoHost\": \"https://github.com\",\n  \"skipCi\": true\n}\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "content": "# These are supported funding model platforms\n\ngithub: bee-san\ncustom: [\"https://www.buymeacoffee.com/beecodes\", \"https://paypal.me/cipheydevs\"]\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "content": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: ''\nlabels: bug\n\n---\n\n**⚠️IMPORTANT⚠️ if you do not fill this out, we will automatically delete your issue. We will not help anyone that cannot fill out this template.**\n\n- [ ] Have you read our [Wiki page \"Common Issues & Their Solutions\"?](https://github.com/Ciphey/Ciphey/wiki/Common-Issues-&-Their-Solutions)\n\n**Describe the bug**\nA clear and concise description of what the bug is.\n\n**Plaintext**\n**⚠️IMPORTANT⚠️ The below code is non-negotiable for \"Ciphey didn't decrypt....\" problems. If you do not tell us your plaintext, we will not help you.** \n\n```\nInclude your plaintext here, replacing this \n```\n**Version**\n**⚠️IMPORTANT⚠️ We need this information because different environments will induce different bugs in Ciphey**\n - OS/Distro: [e.g. Windows, Debian 11.0, Arch, OS X El Capitan]\n - Python version: [python3 --version]\n - Ciphey versions: [python3 -m pip show ciphey cipheycore cipheydists]\n - Did you use Docker?\n\n**Verbose Output**\n**⚠️IMPORTANT⚠️ Verbose output will tell us why it's not working the way we expected it to be.**\nRun Ciphey with `ciphey -vvv` and paste the results into [Pastebin.com](https://pastebin.com) or a [GitHub Gist](https://gist.github.com/)\n\n**To Reproduce**\nSteps to reproduce the behavior:\n1. What input did you use?\n2. What flags / arguments did you use?\n\n**Expected behavior**\nA clear and concise description of what you expected to happen.\n\n**Any other information?**\nAdd any other context about the problem here.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "content": "blank_issues_enabled: false\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "content": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: ''\nlabels: enhancement\nassignees: brandonskerritt\n\n---\n### Problem:\n_What exactly do you think is missing? How does it impact you? Are there any hacks that people use instead?_\n\n### Solution:\n_How could this problem be solved? What could be added? How could it be integrated into the current system?_\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/maintenance_suggestion.md",
    "content": "---\nname: Maintenance suggestion\nabout: Suggest refactoring/restructuring that would help\ntitle: ''\nlabels: maintenance\nassignees: brandonskerritt\n\n---\n### Idea\n_What exactly do you want to do?_\n\n### Pros\n_How would it help the code? Does it make things faster, or the code more maintainable?_\n\n### Cons\n_Would this break anything? Would it mean a rewrite of all the code?_\n"
  },
  {
    "path": ".github/config.yml",
    "content": "todo:\n  keyword: \"@TODO\"\n"
  },
  {
    "path": ".github/dependabot.yml",
    "content": "version: 2\nupdates:\n- package-ecosystem: pip\n  directory: \"/\"\n  schedule:\n    interval: daily\n  open-pull-requests-limit: 10\n  ignore:\n  - dependency-name: black\n    versions:\n    - 21.4b0\n    - 21.4b1\n"
  },
  {
    "path": ".github/lock.yml",
    "content": "# Configuration for Lock Threads - https://github.com/dessant/lock-threads-app\n\n# Number of days of inactivity before a closed issue or pull request is locked\ndaysUntilLock: 60\n\n# Skip issues and pull requests created before a given timestamp. Timestamp must\n# follow ISO 8601 (`YYYY-MM-DD`). Set to `false` to disable\nskipCreatedBefore: false\n\n# Issues and pull requests with these labels will be ignored. Set to `[]` to disable\nexemptLabels: []\n\n# Label to add before locking, such as `outdated`. Set to `false` to disable\nlockLabel: false\n\n# Comment to post before locking. Set to `false` to disable\nlockComment: >\n  This thread has been automatically locked since there has not been\n  any recent activity after it was closed. Please open a new issue for\n  related bugs.\n\n# Assign `resolved` as the reason for locking. Set to `false` to disable\nsetLockReason: true\n\n# Limit to only `issues` or `pulls`\n# only: issues\n\n# Optionally, specify configuration settings just for `issues` or `pulls`\n# issues:\n#   exemptLabels:\n#     - help-wanted\n#   lockLabel: outdated\n\n# pulls:\n#   daysUntilLock: 30\n\n# Repository to extend settings from\n# _extends: repo\n"
  },
  {
    "path": ".github/release-drafter.yml",
    "content": "template: |\n  ## What’s Changed\n\n  $CHANGES\n"
  },
  {
    "path": ".github/workflows/coverage.yml",
    "content": "name: coverage\non: [push, pull_request]\njobs:\n  build:\n    runs-on: ${{ matrix.os }}\n    strategy:\n      matrix:\n        os: [ubuntu-latest, macos-latest, windows-latest]\n        python-version: [3.6, 3.7, pypy3]\n        # exclude:\n        #   - os: macos-latest\n        #     python-version: 3.8\n        #   - os: windows-latest\n        #     python-version: 3.6\n    steps:\n      - uses: actions/checkout@v2\n      - name: Set up Python\n        uses: actions/setup-python@v2\n        with:\n          python-version: ${{ matrix.python-version }}\n      - name: Tests with Nox\n\n  coverage:\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/checkout@v2\n    - uses: actions/setup-python@v2\n      with:\n        python-version: '3.8'\n        architecture: x64\n    - run: pip3 install nox==2019.11.9\n    - run: pip3 install poetry==1.0.5\n    - run: nox --sessions tests coverage\n      env:\n        CODECOV_TOKEN: ${{secrets.CODECOV_TOKEN}}\n\n\n"
  },
  {
    "path": ".github/workflows/release.yml",
    "content": "# .github/workflows/release.yml\nname: Release\non:\n  release:\n    types: [published]\njobs:\n  release:\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/checkout@v2\n    - uses: actions/setup-python@v1\n      with:\n        python-version: '3.8'\n        architecture: x64\n    - run: pip install nox\n    - run: pip install poetry\n    - run: nox\n    - run: poetry build\n    - run: poetry publish --username=__token__ --password=${{ secrets.PYPI_TOKEN }}\n"
  },
  {
    "path": ".github/workflows/releasetestpypi.yml",
    "content": "# .github/workflows/test-pypi.yml\nname: TestPyPI\non:\n  push:\n    branches:\n      - master\njobs:\n  test_pypi:\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/checkout@v2\n    - uses: actions/setup-python@v1\n      with:\n        python-version: '3.8'\n        architecture: x64\n    - run: pip install poetry\n    - run: >-\n        poetry version patch &&\n        version=$(poetry version | awk '{print $2}') &&\n        poetry version $version.dev.$(date +%s)\n    - run: poetry build\n    - uses: pypa/gh-action-pypi-publish@v1.0.0a0\n      with:\n        user: __token__\n        password: ${{ secrets.TEST_PYPI_TOKEN }}\n        repository_url: https://test.pypi.org/legacy/\n"
  },
  {
    "path": ".github/workflows/terminaltest.yml",
    "content": "on: pull_request\nname: Ciphey terminal test\njobs:\n  terminal_test:\n    name: On ubuntu-latest with python\n    runs-on: ubuntu-latest\n    strategy:\n      fail-fast: false\n      matrix:\n        python-version: [3.7, 3.8, 3.9]\n    steps:\n    - uses: actions/checkout@v2\n    - name: Set up Python ${{ matrix.python-version }}\n      uses: actions/setup-python@v2\n      with:\n        python-version: ${{ matrix.python-version }}\n    - name: Build ciphey\n      run: |\n        python -m pip install poetry\n        poetry install\n    - name: Test ciphey with plain text\n      run: |\n        plain_text=\"hello. Testing Ciphey.\"\n        ciphey_out=$(poetry run ciphey -q -t \"$plain_text\")\n        if [ \"$ciphey_out\" == \"$plain_text\" ]\n        then\n          exit 0\n        else\n          echo \"Ciphey decryption on plain text failed\"\n          exit 1\n        fi\n    - name: Test ciphey with base64 encoded text\n      run: |\n        plain_text=\"hello. Testing Ciphey.\"\n        base64_encoded=$(echo -n \"$plain_text\" | base64)\n        ciphey_out=$(poetry run ciphey -q -t \"$base64_encoded\")\n        if [ \"$ciphey_out\" == \"$plain_text\" ]\n        then\n          exit 0\n        else\n          echo \"Ciphey decryption on base64 encoded string failed\"\n          exit 1\n        fi \n"
  },
  {
    "path": ".github/workflows/tests2.yml",
    "content": "name: Tests\non: [push, pull_request]\njobs:\n  tests:\n    strategy:\n      fail-fast: false\n      matrix:\n        python-version: ['3.7', '3.8', '3.9']\n        os: [ubuntu-latest, windows-latest] #macos-latest,\n    runs-on: ${{ matrix.os }}\n    name: Python ${{ matrix.python-version }} on ${{ matrix.os }}\n    steps:\n    - uses: actions/checkout@v2\n    - uses: actions/setup-python@v2\n      with:\n        python-version: ${{ matrix.python-version }}\n        architecture: x64\n    - run: python -m pip install --upgrade pip\n    - run: pip install codespell flake8 nox poetry\n    - run: codespell --ignore-words-list=\"nd,te\" --skip=\"translations,*.archive\"\n    - run: flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics\n    - run: python -m nox\n"
  },
  {
    "path": ".gitignore",
    "content": "\r\n# Created by https://www.gitignore.io/api/git,python,virtualenv\r\n# Edit at https://www.gitignore.io/?templates=git,python,virtualenv\r\n\r\n### Git ###\r\n# Created by git for backups. To disable backups in Git:\r\n# $ git config --global mergetool.keepBackup false\r\n*.orig\r\n\r\n\r\n# Created by https://www.gitignore.io/api/venv\r\n# Edit at https://www.gitignore.io/?templates=venv\r\n\r\n### venv ###\r\n# Virtualenv\r\n# http://iamzed.com/2009/05/07/a-primer-on-virtualenv/\r\n.Python\r\npyvenv.cfg\r\n.env\r\n.venv\r\nenv/\r\nvenv/\r\nENV/\r\nenv.bak/\r\nvenv.bak/\r\npip-selfcheck.json\r\nciphey.egg-info\r\ndist/\r\ndist\r\n\r\nhansard.txt\r\npoetry.lock\r\n# End of https://www.gitignore.io/api/venv\r\n\r\n# Created by git when using merge tools for conflicts\r\n*.BACKUP.*\r\n*.BASE.*\r\n*.LOCAL.*\r\n*.REMOTE.*\r\n*_BACKUP_*.txt\r\n*_BASE_*.txt\r\n*_LOCAL_*.txt\r\n*_REMOTE_*.txt\r\n\r\n### Python ###\r\n# Byte-compiled / optimized / DLL files\r\n__pycache__/\r\n*.py[cod]\r\n*$py.class\r\n\r\n# C extensions\r\n*.so\r\n\r\n# Distribution / packaging\r\n.Python\r\nbuild/\r\ndevelop-eggs/\r\ndist/\r\ndownloads/\r\neggs/\r\n.eggs/\r\nlib/\r\nlib64/\r\nparts/\r\nsdist/\r\nvar/\r\nwheels/\r\npip-wheel-metadata/\r\nshare/python-wheels/\r\n*.egg-info/\r\n.installed.cfg\r\n*.egg\r\nMANIFEST\r\n\r\n# PyInstaller\r\n#  Usually these files are written by a python script from a template\r\n#  before PyInstaller builds the exe, so as to inject date/other infos into it.\r\n*.manifest\r\n\n\r\n# Installer logs\r\npip-log.txt\r\npip-delete-this-directory.txt\r\n\r\n# Unit test / coverage reports\r\nhtmlcov/\r\n.tox/\r\n.nox/\r\n.coverage\r\n.coverage.*\r\n.cache\r\nnosetests.xml\r\ncoverage.xml\r\n*.cover\r\n.hypothesis/\r\n.pytest_cache/\r\n\r\n# Translations\r\n*.mo\r\n*.pot\r\n\r\n# Django stuff:\r\n*.log\r\nlocal_settings.py\r\ndb.sqlite3\r\ndb.sqlite3-journal\r\n\r\n# Flask stuff:\r\ninstance/\r\n.webassets-cache\r\n\r\n# Scrapy stuff:\r\n.scrapy\r\n\r\n# Sphinx documentation\r\ndocs/_build/\r\n\r\n# PyBuilder\r\ntarget/\r\n\r\n# Jupyter Notebook\r\n.ipynb_checkpoints\r\n\r\n# IPython\r\nprofile_default/\r\nipython_config.py\r\n\r\n# pyenv\r\n.python-version\r\n\r\n# pipenv\r\n#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.\r\n#   However, in case of collaboration, if having platform-specific dependencies or dependencies\r\n#   having no cross-platform support, pipenv may install dependencies that don't work, or not\r\n#   install all needed dependencies.\r\n#Pipfile.lock\r\n\r\n# celery beat schedule file\r\ncelerybeat-schedule\r\n\r\n# SageMath parsed files\r\n*.sage.py\r\n\r\n# Environments\r\n.env\r\n.venv\r\nenv/\r\nvenv/\r\nENV/\r\nenv.bak/\r\nvenv.bak/\r\n\r\n# Spyder project settings\r\n.spyderproject\r\n.spyproject\r\n\r\n# Rope project settings\r\n.ropeproject\r\n\r\n# mkdocs documentation\r\n/site\r\n\r\n# mypy\r\n.mypy_cache/\r\n.dmypy.json\r\ndmypy.json\r\n\r\n# Pyre type checker\r\n.pyre/\r\n\r\n### VirtualEnv ###\r\n# Virtualenv\r\n# http://iamzed.com/2009/05/07/a-primer-on-virtualenv/\r\n[Bb]in\r\n[Ii]nclude\r\n[Ll]ib\r\n[Ll]ib64\r\n[Ll]ocal\r\n[Ss]cripts\r\npyvenv.cfg\r\npip-selfcheck.json\r\n\r\n# End of https://www.gitignore.io/api/git,python,virtualenv\r\n.vscode/\r\n\r\n.vim/coc-settings.json\r\n\r\n# Poetry stuff\r\ndist/\r\npoetry.lock\r\n\r\n# Nano\r\n*.swp\r\n\r\n# PyCharm\r\n.idea/\r\n\nciphey/LanguageChecker/create\\?max_size=60&spelling=US&spelling=GBs&max_variant=2&diacritic=both&special=hacker&special=roman-numerals&download=wordlist&encoding=utf-8&format=inline\n\nciphey/LanguageChecker/create\\?max_size=80&spelling=US&spelling=GBs&spelling=GBz&spelling=CA&spelling=AU&max_variant=2&diacritic=both&special=hacker&special=roman-numerals&download=wordlist&encoding=utf-8&format=inline\n\nciphey/LanguageChecker/aspell.txt\ndictionary.txt\naspell.txt\n\nciphey.spec\n\nciphey/__main__.spec\n\n__main__.spec\n\n.entry_point.spec/entry_point.spec\n\nBEANOS INVADES THE FORTNITE ITEM SHOP AT 8_00 PM.EXE-uG0WJcr-cuI.f299.mp4.part\n\nrun.yml\n\ntests/interface.rst\n\r\n\r\n# Test Generator\r\ntest_main_generated.py\r\n\nrun.yml\n\ntests/interface.rst\n\ntest.py\n\n# Mac OS Files\n.DS_Store\n.AppleDouble\n.LSOverride\nIcon\n._*\n"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "content": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, we as\ncontributors and maintainers pledge to making participation in our project and\nour community a harassment-free experience for everyone, regardless of age, body\nsize, disability, ethnicity, sex characteristics, gender identity and expression,\nlevel of experience, education, socio-economic status, nationality, personal\nappearance, race, religion, or sexual identity and orientation.\n\n## Our Standards\n\nExamples of behavior that contributes to creating a positive environment\ninclude:\n\n* Using welcoming and inclusive language\n* Being respectful of differing viewpoints and experiences\n* Gracefully accepting constructive criticism\n* Focusing on what is best for the community\n* Showing empathy towards other community members\n\nExamples of unacceptable behavior by participants include:\n\n* The use of sexualized language or imagery and unwelcome sexual attention or\n advances\n* Trolling, insulting/derogatory comments, and personal or political attacks\n* Public or private harassment\n* Publishing others' private information, such as a physical or electronic\n address, without explicit permission\n* Other conduct which could reasonably be considered inappropriate in a\n professional setting\n\n## Our Responsibilities\n\nProject maintainers are responsible for clarifying the standards of acceptable\nbehavior and are expected to take appropriate and fair corrective action in\nresponse to any instances of unacceptable behavior.\n\nProject maintainers have the right and responsibility to remove, edit, or\nreject comments, commits, code, wiki edits, issues, and other contributions\nthat are not aligned to this Code of Conduct, or to ban temporarily or\npermanently any contributor for other behaviors that they deem inappropriate,\nthreatening, offensive, or harmful.\n\n## Scope\n\nThis Code of Conduct applies both within project spaces and in public spaces\nwhen an individual is representing the project or its community. Examples of\nrepresenting a project or community include using an official project e-mail\naddress, posting via an official social media account, or acting as an appointed\nrepresentative at an online or offline event. Representation of a project may be\nfurther defined and clarified by project maintainers.\n\n## Enforcement\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be\nreported by contacting the project team at brandon_skerrit. All\ncomplaints will be reviewed and investigated and will result in a response that\nis deemed necessary and appropriate to the circumstances. The project team is\nobligated to maintain confidentiality with regard to the reporter of an incident.\nFurther details of specific enforcement policies may be posted separately.\n\nProject maintainers who do not follow or enforce the Code of Conduct in good\nfaith may face temporary or permanent repercussions as determined by other\nmembers of the project's leadership.\n\n## Attribution\n\nThis Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,\navailable at <https://www.contributor-covenant.org/version/1/4/code-of-conduct.html>\n\n[homepage]: https://www.contributor-covenant.org\n\nFor answers to common questions about this code of conduct, see\n<https://www.contributor-covenant.org/faq>\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "<p align=\"center\">\nTranslations <br>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/de/CONTRIBUTING.md>🇩🇪 DE   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/hu/CONTRIBUTING.md>🇭🇺 HU   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/id/CONTRIBUTING.md>🇮🇩 ID   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/it/CONTRIBUTING.md>🇮🇹 IT   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/nl/CONTRIBUTING.md>🇳🇱 NL   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/pt-br/CONTRIBUTING.md>🇧🇷 PT-BR   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/ru/CONTRIBUTING.md>🇷🇺 RU   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/zh/CONTRIBUTING.md>🇨🇳 ZH   </a>\n</p>\n\nHowdy!\n\nSo, you're interested in contributing to Ciphey? 🤔\n\nPerhaps you're confused as to where to start, or you believe your coding skills aren't \"good enough\"? Well, for the latter - that's ridiculous! We're perfectly okay with \"bad code\" and even then if you're reading this document you're probably a great programmer. I mean, newbies don't often learn to contribute to GitHub projects 😉\n\nHere are some ways you can contribute to Ciphey:\n\n- Add a new language 🧏\n- Add more encryption methods 📚\n- Create more documentation (very important! We would be eternally grateful)\n- Fix bugs submitted via GitHub issues (we can support you in this 😊)\n- Refactor the code base 🥺\n\nIf these sound hard, do not worry! This document will walk you through exactly how to achieve any of these. Also, your name will be added to Ciphey's contributors list, and we'll be eternally grateful! 🙏\n\nWe have a small Discord chat for you to talk to the developers and get some help. Alternatively, you can write a GitHub issue for your suggestion. If you want to be added to the Discord, DM us or ask us somehow.\n\n[Discord Server](https://discord.gg/KfyRUWw)\n\n# How to contribute\n\nCiphey is always in need of more decryption tools! To learn how to integrate code into ciphey, check out:\n\n- <https://github.com/Ciphey/Ciphey/wiki/Adding-your-own-ciphers> for a simple tutorial\n- <https://github.com/Ciphey/Ciphey/wiki/Extending-Ciphey> for a API reference\n\nIt would be nice if you wrote some tests for it, by simply copying a function in the Ciphey/tests/test_main.py and replacing the ciphertext with something encoded with your cipher. If you don't add tests, we will probably still merge it, but it will be much harder for us to diagnose bugs!\n\nIt goes without saying that we will add you to the list of contributors for your hard work!\n\n# Add a new language 🧏\n\nThe default language checker, `brandon`, works with multiple languages. Now, this may sound daunting.\nBut honestly, all you've got to do is take a dictionary, do a little analysis (we've written code to help you with this), add the dictionaries and analysis to a repo. And then add the option to `settings.yml`.\n\n# Create more documentation\n\nDocumentation is the most important part of Ciphey. No documentation is extreme code debt, and we don't want that.\n\nTrust me when I say if you contribute to great documentation you will be seen on the same level as code contributors. Documentation is absolutely vital.\n\nThere are lots of ways you can add documentation.\n\n- Doc strings in the code\n- Improving our current documentation (README, this file, our Ciphey Wiki pages)\n- Translating documentation\n\nAnd much more!\n\n# Fix bugs\n\nVisit our GitHub issues page to find all the bugs that Ciphey has! Squash them, and you'll be added to the contributors list. ;)\n\n# Refactor the code base\n\nNot all of Ciphey follows PEP8, and some of the code is repeated.\n"
  },
  {
    "path": "Pictures_for_README/.gitattributes",
    "content": "render1596301769504.gif filter=lfs diff=lfs merge=lfs -text\n"
  },
  {
    "path": "README.md",
    "content": "<p align=\"center\">\nTranslations <br>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/de/README.md>🇩🇪 DE   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/fr/README.md>🇫🇷 FR   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/hu/README.md>🇭🇺 HU   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/id/README.md>🇮🇩 ID   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/it/README.md>🇮🇹 IT   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/nl/README.md>🇳🇱 NL   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/pt-br/README.md>🇧🇷 PT-BR   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/ru/README.md>🇷🇺 RU   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/zh/README.md>🇨🇳 ZH   </a>\n<a href=\"https://github.com/Ciphey/Ciphey/tree/master/translations/th/README.md\">🇹🇭 TH   </a>\n <br><br>\n➡️\n<a href=\"https://github.com/Ciphey/Ciphey/wiki\">Documentation</a> |\n<a href=\"https://discord.gg/zYTM3rZM4T\">Discord</a> |\n <a href=\"https://github.com/Ciphey/Ciphey/wiki/Installation\">Installation Guide</a>\n ⬅️\n\n<br>\n  <img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/binoculars.png\" alt=\"Ciphey\">\n</p>\n\n<p align=\"center\">\n<img src=\"https://pepy.tech/badge/ciphey\">\n <img src=\"https://pepy.tech/badge/ciphey/month\">\n  <a href=\"https://discord.gg/zYTM3rZM4T\"><img alt=\"Discord\" src=\"https://img.shields.io/discord/754001738184392704\"></a>\n<a href=\"https://pypi.org/project/ciphey/\"><img src=\"https://img.shields.io/pypi/v/ciphey.svg\"></a>\n  <img src=\"https://img.shields.io/badge/License-MIT-yellow.svg\" alt=\"Ciphey\">\n\n<br>\nFully automated decryption/decoding/cracking tool using natural language processing & artificial intelligence, along with some common sense.\n</p>\n<hr>\n\n## [Installation Guide](https://github.com/Ciphey/Ciphey/wiki/Installation)\n\n| <p align=\"center\"><a href=\"https://pypi.org/project/ciphey\">🐍 Python | <p align=\"center\"><a href=\"https://hub.docker.com/r/remnux/ciphey\">🐋 Docker (Universal) | <p align=\"center\"><a href=\"https://ports.macports.org/port/ciphey/summary\">🍎 MacPorts (macOS) | <p align=\"center\"><a href=\"https://formulae.brew.sh/formula/ciphey\">🍺 Homebrew (macOS/Linux) |\n| --------------------------------------------------------------------- | --------------------------------------------------------------------------------- | --------------------------------------------------------------------------------- |--------------------------------------------------------------------------------- |\n| <p align=\"center\"><img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/python.png\" /></p>    | <p align=\"center\"><img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/docker.png\" /></p> | <p align=\"center\"><img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/macports.png\" /></p> | <p align=\"center\"><img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/homebrew.png\" /></p> |\n| `python3 -m pip install ciphey --upgrade` | `docker run -it --rm remnux/ciphey` | `sudo port install ciphey` | `brew install ciphey` |\n\n| Linux                                                                                                                   | Mac OS                                                                                                                     | Windows                                                                                                                   |\n| ----------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- |\n| ![GitHub Workflow Status](https://img.shields.io/github/workflow/status/ciphey/ciphey/Python%20application?label=Linux) | ![GitHub Workflow Status](https://img.shields.io/github/workflow/status/ciphey/ciphey/Python%20application?label=Mac%20OS) | ![GitHub Workflow Status](https://img.shields.io/github/workflow/status/ciphey/ciphey/Python%20application?label=Windows) |\n\n<hr>\n\n# 🤔 What is this?\n\nInput encrypted text, get the decrypted text back.\n\n> \"What type of encryption?\"\n\nThat's the point. You don't know, you just know it's possibly encrypted. Ciphey will figure it out for you.\n\nCiphey can solve most things in 3 seconds or less.\n\n<p align=\"center\" href=\"https://asciinema.org/a/336257\">\n  <img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/index.gif\" alt=\"Ciphey demo\">\n</p>\n\nCiphey aims to be a tool to automate a lot of decryptions & decodings such as multiple base encodings, classical ciphers, hashes or more advanced cryptography.\n\nIf you don't know much about cryptography, or you want to quickly check the ciphertext before working on it yourself, Ciphey is for you.\n\n**The technical part.** Ciphey uses a custom built artificial intelligence module (_AuSearch_) with a _Cipher Detection Interface_ to approximate what something is encrypted with. And then a custom-built, customisable natural language processing _Language Checker Interface_, which can detect when the given text becomes plaintext.\n\nNo neural networks or bloated AI here. We only use what is fast and minimal.\n\nAnd that's just the tip of the iceberg. For the full technical explanation, check out our [documentation](https://github.com/Ciphey/Ciphey/wiki).\n\n# ✨ Features\n\n- **50+ encryptions/encodings supported** such as binary, Morse code and Base64. Classical ciphers like the Caesar cipher, Affine cipher and the Vigenere cipher. Along with modern encryption like repeating-key XOR and more. **[For the full list, click here](https://github.com/Ciphey/Ciphey/wiki/Supported-Ciphers)**\n- **Custom Built Artificial Intelligence with Augmented Search (AuSearch) for answering the question \"what encryption was used?\"** Resulting in decryptions taking less than 3 seconds.\n- **Custom built natural language processing module** Ciphey can determine whether something is plaintext or not. Whether that plaintext is JSON, a CTF flag, or English, Ciphey can get it in a couple of milliseconds.\n- **Multi Language Support** at present, only German & English (with AU, UK, CAN, USA variants).\n- **Supports encryptions and hashes** Which the alternatives such as CyberChef Magic do not.\n- **[C++ core](https://github.com/Ciphey/CipheyCore)** Blazingly fast.\n\n# 🔭 Ciphey vs CyberChef\n\n## 🔁 Base64 Encoded 42 times\n\n<table>\n  <tr>\n  <th>Name</th>\n    <th>⚡ Ciphey ⚡ </th>\n    <th>🐢 CyberChef 🐢</th>\n  </tr>\n  <tr>\n  <th>Gif</th>\n    <td><img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/ciphey_gooder_cyberchef.gif\" alt=\"The guy she tells you not to worry about\"></td>\n    <td><img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/not_dying.gif\" alt=\"You\"></td>\n  </tr>\n  <tr>\n  <th>Time</th>\n    <td>2 seconds</td>\n    <td>6 seconds</td>\n  </tr>\n    <tr>\n  <th>Setup</th>\n    <td><ul><li>Run ciphey on the file</li></ul></td>\n    <td><ul><li>Set the regex param to \"{\"</li><li>You need to know how many times to recurse</li><li>You need to know it's Base64 all the way down</li><li>You need to load CyberChef (it's a bloated JS app)</li><li>Know enough about CyberChef to create this pipeline</li><li>Invert the match</li></ul></td>\n  </tr>\n</table>\n\n<sub><b>Note</b> The gifs may load at different times, so one may appear significantly faster than another.</sub><br>\n<sub><b>A note on magic </b>CyberChef's most similar feature to Ciphey is Magic. Magic fails instantly on this input and crashes. The only way we could force CyberChef to compete was to manually define it.</sub>\n\nWe also tested CyberChef and Ciphey with a **6gb file**. Ciphey cracked it in **5 minutes and 54 seconds**. CyberChef crashed before it even started.\n\n## 📊 Ciphey vs Katana vs CyberChef Magic\n\n| **Name**                                   | ⚡ Ciphey ⚡ | 🗡️ Katana 🗡️ | 🐢 CyberChef Magic 🐢 |\n| ------------------------------------------ | ------------ | ------------ | --------------------- |\n| Advanced Language Checker                  | ✅           | ❌           | ✅                    |\n| Supports Encryptions                       | ✅           | ✅           | ❌                    |\n| Releases named after Dystopian themes 🌃   | ✅           | ❌           | ❌                    |\n| Supports hashes                            | ✅           | ✅           | ❌                    |\n| Easy to set up                             | ✅           | ❌           | ✅                    |\n| Can guess what something is encrypted with | ✅           | ❌           | ❌                    |\n| Created for hackers by hackers             | ✅           | ✅           | ❌                    |\n\n# 🎬 Getting Started\n\nIf you're having trouble with installing Ciphey, [read this.](https://github.com/Ciphey/Ciphey/wiki/Common-Issues-&-Their-Solutions)\n\n## ‼️ Important Links (Docs, Installation guide, Discord Support)\n\n| Installation Guide                                                          | Documentation                                             | Discord                                     | Docker Image (from REMnux)                                                                          |\n| --------------------------------------------------------------------------- | --------------------------------------------------------- | ------------------------------------------- | --------------------------------------------------------------------------------------------------- |\n| 📖 [Installation Guide](https://github.com/Ciphey/Ciphey/wiki/Installation) | 📚 [Documentation](https://github.com/Ciphey/Ciphey/wiki) | 🦜 [Discord](https://discord.gg/zYTM3rZM4T) | 🐋 [Docker Documentation](https://docs.remnux.org/run-tools-in-containers/remnux-containers#ciphey) |\n\n## 🏃‍♀️Running Ciphey\n\nThere are 3 ways to run Ciphey.\n\n1. File Input `ciphey -f encrypted.txt`\n2. Unqualified input `ciphey -- \"Encrypted input\"`\n3. Normal way `ciphey -t \"Encrypted input\"`\n\n![Gif showing 3 ways to run Ciphey](https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/3ways.gif)\n\nTo get rid of the progress bars, probability table, and all the noise use the quiet mode.\n\n`ciphey -t \"encrypted text here\" -q`\n\nFor a full list of arguments, run `ciphey --help`.\n\n### ⚗️ Importing Ciphey\n\nYou can import Ciphey\\'s main and use it in your own programs and code. `from Ciphey.__main__ import main`\n\n# 🎪 Contributors\n\nCiphey was invented by [Bee](https://github.com/bee-san) in 2008, and revived in 2019. Ciphey wouldn't be where it was today without [Cyclic3](https://github.com/Cyclic3) - president of UoL's Cyber Security Society.\n\nCiphey was revived & recreated by the [Cyber Security Society](https://www.cybersoc.cf/) for use in CTFs. If you're ever in Liverpool, consider giving a talk or sponsoring our events. Email us at `cybersecurity@society.liverpoolguild.org` to find out more 🤠\n\n**Major Credit** to George H for working out how we could use proper algorithms to speed up the search process.\n**Special thanks** to [varghalladesign](https://www.facebook.com/varghalladesign) for designing the logo. Check out their other design work!\n\n## 🐕‍🦺 [Contributing](https://github.com/Ciphey/Ciphey/wiki/Contributing)\n\nDon't be afraid to contribute! We have many, many things you can do to help out. Each of them labelled and easily explained with examples. If you're trying to contribute but stuck, tag @bee-san ✨\n\nAlternatively, join the Discord group and send a message there (link in [contrib file](https://github.com/Ciphey/Ciphey/wiki/Contributing)) or at the top of this README as a badge.\n\nPlease read the [contributing file](https://github.com/Ciphey/Ciphey/wiki/Contributing) for exact details on how to contribute ✨\n\nBy doing so, you'll get your name added to the README below and get to be apart of an ever-growing project!\n[![Stargazers over time](https://starchart.cc/Ciphey/Ciphey.svg)](https://starchart.cc/Ciphey/Ciphey)\n\n## 💰 Financial Contributors\n\nThe contributions will be used to fund not only the future of Ciphey and its authors, but also Cyber Security Society at the University of Liverpool.\n\nGitHub doesn't support \"sponsor this project and we'll evenly distribute the money\", so pick a link and we'll sort it out on our end 🥰\n\n## ✨ Contributors\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://github.com/Cyclic3\"><img src=\"https://avatars1.githubusercontent.com/u/15613874?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>cyclic3</b></sub></a><br /><a href=\"#design-cyclic3\" title=\"Design\">🎨</a> <a href=\"#maintenance-cyclic3\" title=\"Maintenance\">🚧</a> <a href=\"https://github.com/Ciphey/Ciphey/commits?author=cyclic3\" title=\"Code\">💻</a> <a href=\"#ideas-cyclic3\" title=\"Ideas, Planning, & Feedback\">🤔</a></td>\n    <td align=\"center\"><a href=\"https://skerritt.blog\"><img src=\"https://avatars3.githubusercontent.com/u/10378052?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Brandon</b></sub></a><br /><a href=\"#design-brandonskerritt\" title=\"Design\">🎨</a> <a href=\"#maintenance-brandonskerritt\" title=\"Maintenance\">🚧</a> <a href=\"https://github.com/Ciphey/Ciphey/commits?author=brandonskerritt\" title=\"Code\">💻</a> <a href=\"#ideas-brandonskerritt\" title=\"Ideas, Planning, & Feedback\">🤔</a></td>\n    <td align=\"center\"><a href=\"https://github.com/michalani\"><img src=\"https://avatars0.githubusercontent.com/u/27767884?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>michalani</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=michalani\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/ashb07\"><img src=\"https://avatars2.githubusercontent.com/u/24845568?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>ashb07</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=ashb07\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/TheAlcanian\"><img src=\"https://avatars3.githubusercontent.com/u/22127191?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Shardion</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/issues?q=author%3ATheAlcanian\" title=\"Bug reports\">🐛</a></td>\n    <td align=\"center\"><a href=\"https://github.com/Bryzizzle\"><img src=\"https://avatars0.githubusercontent.com/u/57810197?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Bryan</b></sub></a><br /><a href=\"#translation-Bryzizzle\" title=\"Translation\">🌍</a> <a href=\"https://github.com/Ciphey/Ciphey/commits?author=Bryzizzle\" title=\"Documentation\">📖</a></td>\n    <td align=\"center\"><a href=\"https://lukasgabriel.net\"><img src=\"https://avatars0.githubusercontent.com/u/52338810?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Lukas Gabriel</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=lukasgabriel\" title=\"Code\">💻</a> <a href=\"https://github.com/Ciphey/Ciphey/issues?q=author%3Alukasgabriel\" title=\"Bug reports\">🐛</a> <a href=\"#translation-lukasgabriel\" title=\"Translation\">🌍</a> <a href=\"#ideas-lukasgabriel\" title=\"Ideas, Planning, & Feedback\">🤔</a></td>\n  </tr>\n  <tr>\n    <td align=\"center\"><a href=\"https://github.com/DarshanBhoi\"><img src=\"https://avatars2.githubusercontent.com/u/70128281?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Darshan</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/issues?q=author%3ADarshanBhoi\" title=\"Bug reports\">🐛</a></td>\n    <td align=\"center\"><a href=\"https://github.com/SkeletalDemise\"><img src=\"https://avatars1.githubusercontent.com/u/29117662?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>SkeletalDemise</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=SkeletalDemise\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://www.patreon.com/cclauss\"><img src=\"https://avatars3.githubusercontent.com/u/3709715?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Christian Clauss</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=cclauss\" title=\"Code\">💻</a> <a href=\"https://github.com/Ciphey/Ciphey/issues?q=author%3Acclauss\" title=\"Bug reports\">🐛</a></td>\n    <td align=\"center\"><a href=\"http://machinexa.xss.ht\"><img src=\"https://avatars1.githubusercontent.com/u/60662297?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Machinexa2</b></sub></a><br /><a href=\"#content-machinexa2\" title=\"Content\">🖋</a></td>\n    <td align=\"center\"><a href=\"https://github.com/anantverma275\"><img src=\"https://avatars1.githubusercontent.com/u/18184503?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Anant Verma</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=anantverma275\" title=\"Code\">💻</a> <a href=\"https://github.com/Ciphey/Ciphey/issues?q=author%3Aanantverma275\" title=\"Bug reports\">🐛</a></td>\n    <td align=\"center\"><a href=\"https://github.com/XVXTOR\"><img src=\"https://avatars1.githubusercontent.com/u/40268197?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>XVXTOR</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=XVXTOR\" title=\"Documentation\">📖</a></td>\n    <td align=\"center\"><a href=\"https://github.com/Itamikame\"><img src=\"https://avatars2.githubusercontent.com/u/59034423?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Itamikame</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=Itamikame\" title=\"Code\">💻</a></td>\n  </tr>\n  <tr>\n    <td align=\"center\"><a href=\"https://github.com/MikeMerz\"><img src=\"https://avatars3.githubusercontent.com/u/50526795?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>MikeMerz</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=MikeMerz\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/jacobggman\"><img src=\"https://avatars2.githubusercontent.com/u/30216976?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Jacob Galam</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=jacobggman\" title=\"Code\">💻</a> <a href=\"https://github.com/Ciphey/Ciphey/issues?q=author%3Ajacobggman\" title=\"Bug reports\">🐛</a></td>\n    <td align=\"center\"><a href=\"https://tuxthexplorer.github.io/\"><img src=\"https://avatars1.githubusercontent.com/u/37508897?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>TuxTheXplorer</b></sub></a><br /><a href=\"#translation-TuxTheXplorer\" title=\"Translation\">🌍</a></td>\n    <td align=\"center\"><a href=\"https://github.com/Itamai\"><img src=\"https://avatars3.githubusercontent.com/u/53093696?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Itamai</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=Itamai\" title=\"Code\">💻</a> <a href=\"https://github.com/Ciphey/Ciphey/issues?q=author%3AItamai\" title=\"Bug reports\">🐛</a></td>\n    <td align=\"center\"><a href=\"https://github.com/Termack\"><img src=\"https://avatars2.githubusercontent.com/u/26333901?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Filipe</b></sub></a><br /><a href=\"#translation-Termack\" title=\"Translation\">🌍</a></td>\n    <td align=\"center\"><a href=\"https://github.com/malathit\"><img src=\"https://avatars0.githubusercontent.com/u/2684148?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Malathi</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=malathit\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://hexchaos.xyz/\"><img src=\"https://avatars1.githubusercontent.com/u/8947820?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Jack</b></sub></a><br /><a href=\"#translation-HexChaos\" title=\"Translation\">🌍</a></td>\n  </tr>\n  <tr>\n    <td align=\"center\"><a href=\"https://github.com/yafkari\"><img src=\"https://avatars3.githubusercontent.com/u/41365655?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Younes</b></sub></a><br /><a href=\"#translation-yafkari\" title=\"Translation\">🌍</a></td>\n    <td align=\"center\"><a href=\"https://gitlab.com/Marnick39\"><img src=\"https://avatars2.githubusercontent.com/u/17315511?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Marnick Vandecauter</b></sub></a><br /><a href=\"#translation-Marnick39\" title=\"Translation\">🌍</a></td>\n    <td align=\"center\"><a href=\"https://github.com/mav8557\"><img src=\"https://avatars0.githubusercontent.com/u/47306745?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Michael V</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=mav8557\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/chuinzer\"><img src=\"https://avatars2.githubusercontent.com/u/64257785?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>chuinzer</b></sub></a><br /><a href=\"#translation-chuinzer\" title=\"Translation\">🌍</a></td>\n    <td align=\"center\"><a href=\"https://github.com/blackcat-917\"><img src=\"https://avatars1.githubusercontent.com/u/53786619?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>blackcat-917</b></sub></a><br /><a href=\"#translation-blackcat-917\" title=\"Translation\">🌍</a> <a href=\"https://github.com/Ciphey/Ciphey/commits?author=blackcat-917\" title=\"Documentation\">📖</a></td>\n    <td align=\"center\"><a href=\"https://github.com/Ozzyz\"><img src=\"https://avatars3.githubusercontent.com/u/6113447?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Åsmund Brekke</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=Ozzyz\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/sashreek1\"><img src=\"https://avatars1.githubusercontent.com/u/45600974?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Sashreek Shankar</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=sashreek1\" title=\"Code\">💻</a></td>\n  </tr>\n  <tr>\n    <td align=\"center\"><a href=\"https://github.com/cryptobadger\"><img src=\"https://avatars2.githubusercontent.com/u/26308101?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>cryptobadger</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=cryptobadger\" title=\"Code\">💻</a> <a href=\"https://github.com/Ciphey/Ciphey/issues?q=author%3Acryptobadger\" title=\"Bug reports\">🐛</a></td>\n    <td align=\"center\"><a href=\"https://github.com/e1fy\"><img src=\"https://avatars3.githubusercontent.com/u/61194758?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>elf</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=e1fy\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/rogercyyu\"><img src=\"https://avatars0.githubusercontent.com/u/45835736?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Roger Yu</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=rogercyyu\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/JesseEmond\"><img src=\"https://avatars.githubusercontent.com/u/1843555?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>dysleixa</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=JesseEmond\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"http://mohzulfikar.me\"><img src=\"https://avatars.githubusercontent.com/u/48849323?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Mohammad Zulfikar</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=mohzulfikar\" title=\"Documentation\">📖</a></td>\n    <td align=\"center\"><a href=\"https://github.com/AABur\"><img src=\"https://avatars.githubusercontent.com/u/41373199?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Alexander Burchenko</b></sub></a><br /><a href=\"#translation-AABur\" title=\"Translation\">🌍</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n"
  },
  {
    "path": "ciphey/__init__.py",
    "content": "from . import basemods, common, iface\nfrom .ciphey import decrypt\n"
  },
  {
    "path": "ciphey/__main__.py",
    "content": "#! /usr/bin/env python3\n\n\"\"\"\nCiphey: https://github.com/Ciphey/Ciphey\n\"\"\"\n\nimport platform\nimport sys\n\nif __name__ == \"__main__\":\n    major = sys.version_info[0]\n    minor = sys.version_info[1]\n\n    python_version = (\n        str(sys.version_info[0])\n        + \".\"\n        + str(sys.version_info[1])\n        + \".\"\n        + str(sys.version_info[2])\n    )\n\n    if major != 3 or minor < 6:\n        print(\n            f\"Ciphey requires Python 3.6+, you are using {python_version}. Please install a higher Python version. https://www.python.org/downloads/\"\n        )\n        print(\n            \"Alternatively, visit our Discord and use the Ciphey bot in #bots http://discord.skerritt.blog\"\n        )\n        sys.exit(1)\n    if platform.system() == \"Windows\":\n        if minor > 8:\n            print(\n                \"Ciphey does not currently support Python 3.9 on Windows. Please use the Discord bot at http://discord.skerritt.blog\"\n            )\n            sys.exit(1)\n\n        if sys.maxsize > 2 ** 32 is False:\n            print(\n                \"You are using Python 32 bit and Windows, Ciphey does not support this. Please upgrade to Python 64-bit here https://www.python.org/downloads/\"\n            )\n            sys.exit(1)\n    from .ciphey import main\n\n    main()\n"
  },
  {
    "path": "ciphey/basemods/Checkers/__init__.py",
    "content": "from . import any, brandon, ezcheck, format, human, quadgrams, quorum, regex, what\n"
  },
  {
    "path": "ciphey/basemods/Checkers/any.py",
    "content": "from typing import Dict, Optional\n\nfrom ciphey.iface import Config, ParamSpec, PolymorphicChecker, registry\n\n\n@registry.register\nclass Any(PolymorphicChecker):\n    \"\"\"Should only be used for debugging, frankly\"\"\"\n\n    def getExpectedRuntime(self, text) -> float:\n        return 0  # TODO: actually calculate this\n\n    def __init__(self, config: Config):\n        super().__init__(config)\n\n    def check(self, text: str) -> Optional[str]:\n        return \"\"\n\n    @staticmethod\n    def getParams() -> Optional[Dict[str, ParamSpec]]:\n        pass\n"
  },
  {
    "path": "ciphey/basemods/Checkers/brandon.py",
    "content": "\"\"\"\r\n ██████╗██╗██████╗ ██╗  ██╗███████╗██╗   ██╗\r\n██╔════╝██║██╔══██╗██║  ██║██╔════╝╚██╗ ██╔╝\r\n██║     ██║██████╔╝███████║█████╗   ╚████╔╝\r\n██║     ██║██╔═══╝ ██╔══██║██╔══╝    ╚██╔╝\r\n╚██████╗██║██║     ██║  ██║███████╗   ██║\r\n© Brandon Skerritt\r\nGithub: brandonskerritt\r\n\r\nClass to determine whether something is English or not.\r\n1. Calculate the Chi Squared score of a sentence\r\n2. If the score is significantly lower than the average score, it _might_ be English\r\n    2.1. If the score _might_ be English, then take the text and compare it to the sorted dictionary\r\n    in O(n log n) time.\r\n    It creates a percentage of \"How much of this text is in the dictionary?\"\r\n    The dictionary contains:\r\n        * 20,000 most common US words\r\n        * 10,000 most common UK words (there's no repetition between the two)\r\n        * The top 10,000 passwords\r\n    If the word \"Looks like\" English (chi-squared) and if it contains English words, we can conclude it is\r\n    very likely English. The alternative is doing the dictionary thing but with an entire 479k word dictionary (slower)\r\n    2.2. If the score is not English, but we haven't tested enough to create an average, then test it against\r\n     the dictionary\r\n\r\nThings to optimise:\r\n* We only run the dictionary if it's 20% smaller than the average for chi squared\r\n* We consider it \"English\" if 45% of the text matches the dictionary\r\n* We run the dictionary if there is less than 10 total chisquared test\r\n\r\nHow to add a language:\r\n* Download your desired dictionary. Try to make it the most popular words, for example. Place this file into this\r\n folder with languagename.txt\r\nAs an example, this comes built in with english.txt\r\nFind the statistical frequency of each letter in that language.\r\nFor English, we have:\r\nself.languages = {\r\n    \"English\":\r\n    [0.0855, 0.0160, 0.0316, 0.0387, 0.1210,0.0218, 0.0209, 0.0496, 0.0733, 0.0022,0.0081, 0.0421, 0.0253, 0.0717,\r\n    0.0747,0.0207, 0.0010, 0.0633, 0.0673, 0.0894,0.0268, 0.0106, 0.0183, 0.0019, 0.0172,0.0011]\r\n}\r\nIn chisquared.py\r\nTo add your language, do:\r\nself.languages = {\r\n    \"English\":\r\n    [0.0855, 0.0160, 0.0316, 0.0387, 0.1210,0.0218, 0.0209, 0.0496, 0.0733, 0.0022,0.0081, 0.0421, 0.0253, 0.0717,\r\n    0.0747,0.0207, 0.0010, 0.0633, 0.0673, 0.0894,0.0268, 0.0106, 0.0183, 0.0019, 0.0172,0.0011]\r\n    \"German\": [0.0973]\r\n}\r\nIn alphabetical order\r\nAnd you're.... Done! Make sure the name of the two match up\r\n\"\"\"\r\nimport sys\r\nfrom math import ceil\r\nfrom typing import Dict, Optional\r\n\r\nimport logging\r\nfrom rich.logging import RichHandler\r\n\r\nfrom ciphey.iface import Checker, Config, ParamSpec, T, registry\r\n\r\nsys.path.append(\"..\")\r\ntry:\r\n    import mathsHelper as mh\r\nexcept ModuleNotFoundError:\r\n    import ciphey.mathsHelper as mh\r\n\r\n\r\n@registry.register\r\nclass Brandon(Checker[str]):\r\n    \"\"\"\r\n    Class designed to confirm whether something is **language** based on how many words of **language** appears\r\n    Call confirmLanguage(text, language)\r\n    * text: the text you want to confirm\r\n    * language: the language you want to confirm\r\n\r\n    Find out what language it is by using chisquared.py, the highest chisquared score is the language\r\n    languageThreshold = 45\r\n    if a string is 45% **language** words, then it's confirmed to be english\r\n    \"\"\"\r\n\r\n    def getExpectedRuntime(self, text: T) -> float:\r\n        # TODO: actually work this out\r\n        # TODO its 0.2 seconds on average\r\n        return 1e-4  # 100 µs\r\n\r\n    wordlist: set\r\n\r\n    def clean_text(self, text: str) -> set:\r\n        \"\"\"Cleans the text ready to be checked\r\n\r\n        Strips punctuation, makes it lower case, turns it into a set separated by spaces, removes duplicate words\r\n\r\n        Args:\r\n            text -> The text we use to perform analysis on\r\n\r\n        Returns:\r\n            text -> the text as a list, now cleaned\r\n\r\n        \"\"\"\r\n        # makes the text unique words and readable\r\n        text = text.lower()\r\n        text = self.mh.strip_punctuation(text)\r\n        text = text.split(\" \")\r\n        text = filter(lambda x: len(x) > 2, text)\r\n        text = set(text)\r\n        return text\r\n\r\n    def checker(self, text: str, threshold: float, text_length: int, var: set) -> bool:\r\n        \"\"\"Given text determine if it passes checker\r\n\r\n        The checker uses the variable passed to it. I.E. Stopwords list, 1k words, dictionary\r\n\r\n        Args:\r\n            text -> The text to check\r\n            threshold -> at what point do we return True? The percentage of text that is in var before we return True\r\n            text_length -> the length of the text\r\n            var -> the variable we are checking against. Stopwords list, 1k words list, dictionary list.\r\n        Returns:\r\n            boolean -> True for it passes the test, False for it fails the test.\"\"\"\r\n        if text is None:\r\n            logging.debug(\"Checker's text is None, so returning False\")\r\n            return False\r\n        if var is None:\r\n            logging.debug(\"Checker's input var is None, so returning False\")\r\n            return False\r\n\r\n        percent = ceil(text_length * threshold)\r\n        logging.debug(f\"Checker's chunks are size {percent}\")\r\n        meet_threshold = 0\r\n        location = 0\r\n        end = percent\r\n\r\n        if text_length <= 0:\r\n            return False\r\n\r\n        while location <= text_length:\r\n            # chunks the text, so only gets THRESHOLD chunks of text at a time\r\n            text = list(text)\r\n            to_analyse = text[location:end]\r\n            logging.debug(f\"To analyse is {to_analyse}\")\r\n            for word in to_analyse:\r\n                # if word is a stopword, + 1 to the counter\r\n                if word in var:\r\n                    logging.debug(\r\n                        f\"{word} is in var, which means I am +=1 to the meet_threshold which is {meet_threshold}\"\r\n                    )\r\n                    meet_threshold += 1\r\n                meet_threshold_percent = meet_threshold / text_length\r\n                if meet_threshold_percent >= threshold:\r\n                    logging.debug(\r\n                        f\"Returning true since the percentage is {meet_threshold / text_length} and the threshold is {threshold}\"\r\n                    )\r\n                    # if we meet the threshold, return True\r\n                    # otherwise, go over again until we do\r\n                    # We do this in the for loop because if we're at 24% and THRESHOLD is 25\r\n                    # we don't want to wait THRESHOLD to return true, we want to return True ASAP\r\n                    return True\r\n            location = end\r\n            end = end + percent\r\n        logging.debug(\r\n            f\"The language proportion {meet_threshold_percent} is under the threshold {threshold}\"\r\n        )\r\n        return False\r\n\r\n    def __init__(self, config: Config):\r\n        # Suppresses warning\r\n        super().__init__(config)\r\n        self.mh = mh.mathsHelper()\r\n\r\n        phases = config.get_resource(self._params()[\"phases\"])\r\n\r\n        self.thresholds_phase1 = phases[\"1\"]\r\n        self.thresholds_phase2 = phases[\"2\"]\r\n        self.top1000Words = config.get_resource(self._params().get(\"top1000\"))\r\n        self.wordlist = config.get_resource(self._params()[\"wordlist\"])\r\n        self.stopwords = config.get_resource(self._params().get(\"stopwords\"))\r\n\r\n        self.len_phase1 = len(self.thresholds_phase1)\r\n        self.len_phase2 = len(self.thresholds_phase2)\r\n\r\n    def check(self, text: str) -> Optional[str]:\r\n        \"\"\"Checks to see if the text is in English\r\n\r\n        Performs a decryption, but mainly parses the internal data packet and prints useful information.\r\n\r\n        Args:\r\n            text -> The text we use to perform analysis on\r\n\r\n        Returns:\r\n            bool -> True if the text is English, False otherwise.\r\n\r\n        \"\"\"\r\n        logging.debug(f'In Language Checker with \"{text}\"')\r\n        text = self.clean_text(text)\r\n        logging.debug(f'Text split to \"{text}\"')\r\n        if text == \"\":\r\n            logging.debug(\"Returning None from Brandon as the text cleaned is none.\")\r\n            return None\r\n\r\n        length_text = len(text)\r\n\r\n        what_to_use = {}\r\n\r\n        # this code decides what checker / threshold to use\r\n        # if text is over or equal to maximum size, just use the maximum possible checker\r\n        what_to_use = self.calculateWhatChecker(\r\n            length_text, self.thresholds_phase1.keys()\r\n        )\r\n        logging.debug(self.thresholds_phase1)\r\n        what_to_use = self.thresholds_phase1[str(what_to_use)]\r\n        # def checker(self, text: str, threshold: float, text_length: int, var: set) -> bool:\r\n        if \"check\" in what_to_use:\r\n            # perform check 1k words\r\n            result = self.checker(\r\n                text, what_to_use[\"check\"], length_text, self.top1000Words\r\n            )\r\n        elif \"stop\" in what_to_use:\r\n            # perform stopwords\r\n            result = self.checker(\r\n                text, what_to_use[\"stop\"], length_text, self.stopwords\r\n            )\r\n        elif \"dict\" in what_to_use:\r\n            result = self.checker(text, what_to_use[\"dict\"], length_text, self.wordlist)\r\n            # If result is None, no point doing it again in phase2\r\n            if not result:\r\n                return None\r\n        else:\r\n            logging.info(f\"It is neither stop or check, but instead {what_to_use}\")\r\n\r\n        # return False if phase 1 fails\r\n        if not result:\r\n            return None\r\n        else:\r\n            what_to_use = self.calculateWhatChecker(\r\n                length_text, self.thresholds_phase2.keys()\r\n            )\r\n            what_to_use = self.thresholds_phase2[str(what_to_use)]\r\n            result = self.checker(text, what_to_use[\"dict\"], length_text, self.wordlist)\r\n        return \"\" if result else None\r\n\r\n    def calculateWhatChecker(self, length_text, key):\r\n        \"\"\"Calculates what threshold / checker to use\r\n\r\n        If the length of the text is over the maximum sentence length, use the last checker / threshold\r\n        Otherwise, traverse the keys backwards until we find a key range that does not fit.\r\n        So we traverse backwards and see if the sentence length is between current - 1 and current\r\n        In this way, we find the absolute lowest checker / percentage threshold.\r\n        We traverse backwards because if the text is longer than the max sentence length, we already know.\r\n        In total, the keys are only 5 items long or so. It is not expensive to move backwards, nor is it expensive to move forwards.\r\n\r\n        Args:\r\n            length_text -> The length of the text\r\n            key -> What key we want to use. I.E. Phase1 keys, Phase2 keys.\r\n        Returns:\r\n            what_to_use -> the key of the lowest checker.\"\"\"\r\n\r\n        _keys = list(key)\r\n        _keys = list(map(int, _keys))\r\n        if length_text >= int(_keys[-1]):\r\n            what_to_use = list(key)[_keys.index(_keys[-1])]\r\n        else:\r\n            # this algorithm finds the smallest possible fit for the text\r\n            for counter, i in reversed(list(enumerate(_keys))):\r\n                #  [0, 110, 150]\r\n                if i <= length_text:\r\n                    what_to_use = i\r\n        return what_to_use\r\n\r\n    @staticmethod\r\n    def getParams() -> Optional[Dict[str, ParamSpec]]:\r\n        return {\r\n            \"top1000\": ParamSpec(\r\n                desc=\"A wordlist of the top 1000 words\",\r\n                req=False,\r\n                default=\"cipheydists::list::english1000\",\r\n            ),\r\n            \"wordlist\": ParamSpec(\r\n                desc=\"A wordlist of all the words\",\r\n                req=False,\r\n                default=\"cipheydists::list::english\",\r\n            ),\r\n            \"stopwords\": ParamSpec(\r\n                desc=\"A wordlist of StopWords\",\r\n                req=False,\r\n                default=\"cipheydists::list::englishStopWords\",\r\n            ),\r\n            \"threshold\": ParamSpec(\r\n                desc=\"The minimum proportion (between 0 and 1) that must be in the dictionary\",\r\n                req=False,\r\n                default=0.45,\r\n            ),\r\n            \"phases\": ParamSpec(\r\n                desc=\"Language-specific phase thresholds\",\r\n                req=False,\r\n                default=\"cipheydists::brandon::english\",\r\n            ),\r\n        }\r\n"
  },
  {
    "path": "ciphey/basemods/Checkers/entropy.py",
    "content": "from typing import Dict, Optional\n\nimport logging\nfrom rich.logging import RichHandler\n\nfrom ciphey.iface import Checker, Config, ParamSpec, T, registry\n\n\n@registry.register\nclass Entropy(Checker[str]):\n\n    \"\"\"\n    Uses entropy to determine plaintext\n    \"\"\"\n\n    def check(self, text: T) -> Optional[str]:\n        logging.debug(\"Trying entropy checker\")\n        pass\n\n    def getExpectedRuntime(self, text: T) -> float:\n        # TODO: actually bench this\n        # Uses benchmark from Discord\n        return 2e-7 * len(text)\n\n    def __init__(self, config: Config):\n        super().__init__(config)\n\n    @staticmethod\n    def getParams() -> Optional[Dict[str, ParamSpec]]:\n        pass\n"
  },
  {
    "path": "ciphey/basemods/Checkers/ezcheck.py",
    "content": "from typing import Dict, List, Optional\n\nfrom ciphey.iface import Checker, Config, ParamSpec, T, registry\n\nfrom .brandon import Brandon\nfrom .format import JsonChecker\nfrom .human import HumanChecker\nfrom .quadgrams import Quadgrams\nfrom .regex import RegexList\nfrom .what import What\n\n\n@registry.register\nclass EzCheck(Checker[str]):\n    \"\"\"\n    This object is effectively a prebuilt quorum (with requirement 1) of common patterns, followed by a human check\n    \"\"\"\n\n    def check(self, text: str) -> Optional[str]:\n        for checker in self.checkers:\n            res = checker.check(text)\n            if (\n                res is not None\n                and (self.decider is None or self.decider.check(text)) is not None\n            ):\n                return res\n        return None\n\n    def getExpectedRuntime(self, text: T) -> float:\n        return sum(\n            i.getExpectedRuntime(text) for i in self.checkers\n        ) + self.decider.getExpectedRuntime(text)\n\n    def __init__(self, config: Config):\n        super().__init__(config)\n\n        self.checkers: List[Checker[str]] = []\n        # Disable human checker for automated systems\n        if config.verbosity >= 0:\n            self.decider = config(HumanChecker)\n        else:\n            self.decider = None\n\n        # We need to modify the config for each of the objects\n\n        # First PyWhat, as it's the fastest\n        self.checkers.append(config(What))\n\n        # Next, the json checker\n        self.checkers.append(config(JsonChecker))\n\n        # Second to last, the quadgrams checker\n        self.checkers.append(config(Quadgrams))\n\n        # Finally, the Brandon checker, as it is the slowest\n        self.checkers.append(config(Brandon))\n\n    @staticmethod\n    def getParams() -> Optional[Dict[str, ParamSpec]]:\n        pass\n"
  },
  {
    "path": "ciphey/basemods/Checkers/format.py",
    "content": "import json\nfrom typing import Dict, Optional\n\nimport logging\nfrom rich.logging import RichHandler\n\nfrom ciphey.iface import Checker, Config, ParamSpec, T, registry\n\n\n@registry.register\nclass JsonChecker(Checker[str]):\n\n    \"\"\"\n    This object is effectively a prebuilt quorum (with requirement 1) of common patterns\n    \"\"\"\n\n    def check(self, text: T) -> Optional[str]:\n        logging.debug(\"Trying json checker\")\n\n        # https://github.com/Ciphey/Ciphey/issues/389\n        if text.isdigit():\n            return None\n\n        try:\n            json.loads(text)\n            return \"\"\n        except ValueError:\n            return None\n\n    def getExpectedRuntime(self, text: T) -> float:\n        # TODO: actually bench this\n        return 1e-7 * len(text)  # From benchmarks I found online\n\n    def __init__(self, config: Config):\n        super().__init__(config)\n\n    @staticmethod\n    def getParams() -> Optional[Dict[str, ParamSpec]]:\n        pass\n"
  },
  {
    "path": "ciphey/basemods/Checkers/gtest.py",
    "content": "from typing import Dict, Optional\n\nimport logging\nfrom rich.logging import RichHandler\n\nfrom ciphey.iface import Checker, Config, ParamSpec, T, registry\n\n\n@registry.register\nclass GTestChecker(Checker[str]):\n\n    \"\"\"\n    G-test of fitness, similar to Chi squared.\n    \"\"\"\n\n    def check(self, text: T) -> Optional[str]:\n        logging.debug(\"Trying entropy checker\")\n        pass\n\n    def getExpectedRuntime(self, text: T) -> float:\n        # TODO: actually bench this\n        return 4e-7 * len(text)\n\n    def __init__(self, config: Config):\n        super().__init__(config)\n\n    @staticmethod\n    def getParams() -> Optional[Dict[str, ParamSpec]]:\n        pass\n"
  },
  {
    "path": "ciphey/basemods/Checkers/human.py",
    "content": "from typing import Dict, Optional\n\nfrom ciphey.iface import Checker, Config, ParamSpec, registry\nfrom rich.console import Console\nfrom rich.markup import escape\n\nconsole = Console()\n\n\n@registry.register\nclass HumanChecker(Checker[str]):\n\n    \"\"\"\n    Uses the person's decision to determine plaintext\n    \"\"\"\n\n    def check(self, ctext: str) -> Optional[str]:\n        with self._config().pause_spinner_handle():\n            response = console.input(\n                f\"Possible plaintext: [blue bold]{escape(ctext.__repr__())}[/blue bold] ([green]y[/green]/[red]N[/red]): \"\n            )\n        if response == \"y\":\n            return \"\"\n        elif response in (\"n\", \"\"):\n            return None\n        else:\n            return self.check(ctext)\n\n    def getExpectedRuntime(self, text: str) -> float:\n        return 1  # About a second\n\n    @staticmethod\n    def getParams() -> Optional[Dict[str, ParamSpec]]:\n        return None\n\n    def __init__(self, config: Config):\n        super().__init__(config)\n"
  },
  {
    "path": "ciphey/basemods/Checkers/quadgrams.py",
    "content": "import logging\nimport re\nfrom math import log10\nfrom typing import Dict, Optional\n\nfrom ciphey.iface import Checker, Config, ParamSpec, T, Translation, registry\nfrom rich.logging import RichHandler\n\n\n@registry.register\nclass Quadgrams(Checker[str]):\n\n    \"\"\"\n    Uses Quadgrams to determine plaintext\n    \"\"\"\n\n    def check(self, ctext: T) -> Optional[str]:\n        logging.debug(\"Trying Quadgrams checker\")\n        # Capitalize and remove everything that's not a letter\n        ctext = re.sub(\"[^A-Z]\", \"\", ctext.upper())\n        quadgrams = self.QUADGRAMS_DICT\n        quadgrams_sum = sum(quadgrams.values())\n        score = 0\n        for key in quadgrams.keys():\n            quadgrams[key] = float(quadgrams[key]) / quadgrams_sum\n        floor = log10(0.01 / quadgrams_sum)\n        for i in range(len(ctext) - 4 + 1):\n            # Get all quadgrams from ctext and check if they're in the dict\n            # If yes then add the score of those quadgrams to the total score\n            if ctext[i : i + 4] in quadgrams:\n                score += quadgrams[ctext[i : i + 4]]\n            else:\n                score += floor\n        if len(ctext) > 0:\n            score = score / len(ctext)\n        logging.info(f\"Quadgrams is {score}\")\n        # The default threshold was found to work the best from lots of testing\n        if score > self.threshold:\n            return \"\"\n        return None\n\n    def getExpectedRuntime(self, text: T) -> float:\n        # TODO: actually bench this\n        return 2e-7 * len(text)\n\n    @staticmethod\n    def getParams() -> Optional[Dict[str, ParamSpec]]:\n        return {\n            \"dict\": ParamSpec(\n                desc=\"The quadgrams dictionary to use\",\n                req=False,\n                default=\"cipheydists::dist::quadgrams\",\n            ),\n            \"score\": ParamSpec(\n                desc=\"The score threshold to use\",\n                req=False,\n                default=0.00011,\n            ),\n        }\n\n    def __init__(self, config: Config):\n        super().__init__(config)\n        self.QUADGRAMS_DICT = config.get_resource(self._params()[\"dict\"], Translation)\n        self.threshold = float(self._params()[\"score\"])\n"
  },
  {
    "path": "ciphey/basemods/Checkers/quorum.py",
    "content": "from typing import Dict, Generic, Optional\n\nfrom ciphey.iface import Checker, Config, ParamSpec, T, _registry\n\n\nclass Quorum(Generic[T], Checker[T]):\n    def check(self, text: T) -> Optional[str]:\n        left = self._params().k\n        results = []\n        for checker in self.checkers:\n            results.append(checker.check(text))\n            if results[-1] is None:\n                continue\n            left -= 1\n            # Early return check\n            if left == 0:\n                return str(results)\n\n    def __init__(self, config: Config):\n        super().__init__(config)\n\n        if self._params().k is None:\n            k = len(self._params()[\"checker\"])\n        # These checks need to be separate, to make sure that we do not have zero members\n        if self._params().k == 0 or self._params().k > len(self._params()[\"checker\"]):\n            raise IndexError(\n                \"k must be between 0 and the number of checkers (inclusive)\"\n            )\n\n        self.checkers = []\n        for i in self._params()[\"checker\"]:\n            # This enforces type consistency\n            self.checkers.append(_registry.get_named(i, Checker[T]))\n\n    @staticmethod\n    def getParams() -> Optional[Dict[str, ParamSpec]]:\n        return {\n            \"checker\": ParamSpec(\n                req=True, desc=\"The checkers to be used for analysis\", list=True\n            ),\n            \"k\": ParamSpec(\n                req=False,\n                desc=\"The minimum quorum size. Defaults to the number of checkers\",\n            ),\n        }\n"
  },
  {
    "path": "ciphey/basemods/Checkers/regex.py",
    "content": "import re\nfrom typing import Dict, Optional\n\nimport logging\nfrom rich.logging import RichHandler\n\nfrom ciphey.iface import Checker, Config, ParamSpec, T, registry\n\n\n@registry.register\nclass Regex(Checker[str]):\n    def getExpectedRuntime(self, text: T) -> float:\n        return 1e-5  # TODO: actually calculate this\n\n    def __init__(self, config: Config):\n        super().__init__(config)\n        self.regexes = list(map(re.compile, self._params()[\"regex\"]))\n        logging.debug(f\"There are {len(self.regexes)} regexes\")\n\n    def check(self, text: str) -> Optional[str]:\n        for regex in self.regexes:\n            logging.debug(f\"Trying regex {regex} on {text}\")\n            res = regex.search(text)\n            logging.debug(f\"Results: {res}\")\n            if res:\n                return f\"Passed with regex {regex}. Want to contribute to Ciphey? Submit your regex here to allow Ciphey to automatically get this next time https://github.com/bee-san/pyWhat/wiki/Adding-your-own-Regex\\n\"\n\n    @staticmethod\n    def getParams() -> Optional[Dict[str, ParamSpec]]:\n        return {\n            \"regex\": ParamSpec(\n                req=True,\n                desc=\"The regex that must be matched (in a substring)\",\n                list=True,\n            )\n        }\n\n\n@registry.register\nclass RegexList(Checker[str]):\n    def getExpectedRuntime(self, text: T) -> float:\n        return 1e-5  # TODO: actually calculate this\n\n    def __init__(self, config: Config):\n        super().__init__(config)\n        self.regexes = []\n        for i in self._params()[\"resource\"]:\n            self.regexes += [re.compile(regex) for regex in config.get_resource(i)]\n        logging.debug(f\"There are {len(self.regexes)} regexes\")\n\n    def check(self, text: str) -> Optional[str]:\n        for regex in self.regexes:\n            logging.debug(f\"Trying regex {regex} on {text}\")\n            res = regex.search(text)\n            logging.debug(f\"Results: {res}\")\n            if res:\n                return f\"passed with regex {regex}\"\n\n    @staticmethod\n    def getParams() -> Optional[Dict[str, ParamSpec]]:\n        return {\n            \"resource\": ParamSpec(\n                req=True,\n                desc=\"A list of regexes that could be matched\",\n                list=True,\n            )\n        }\n"
  },
  {
    "path": "ciphey/basemods/Checkers/what.py",
    "content": "from typing import Dict, Optional\r\n\r\nfrom ciphey.iface import Checker, Config, ParamSpec, T, registry\r\nimport logging\r\nfrom rich.logging import RichHandler\r\nfrom pywhat import identifier\r\nfrom rich.console import Console\r\n\r\nconsole = Console()\r\n\r\n\r\n@registry.register\r\nclass What(Checker[str]):\r\n\r\n    \"\"\"\r\n    Uses PyWhat to determine plaintext with regexes\r\n    https://github.com/bee-san/pyWhat\r\n    \"\"\"\r\n\r\n    def check(self, ctext: T) -> Optional[str]:\r\n        logging.debug(\"Trying PyWhat checker\")\r\n        returned_regexes = self.id.identify(ctext)\r\n        if returned_regexes[\"Regexes\"]:\r\n            matched_regex = returned_regexes[\"Regexes\"]['text'][0][\"Regex Pattern\"]\r\n\r\n            ret = f'The plaintext is a [yellow]{matched_regex[\"Name\"]}[/yellow]'\r\n            human = (\r\n                f'\\nI think the plaintext is a [yellow]{matched_regex[\"Name\"]}[/yellow]'\r\n            )\r\n\r\n            if \"Description\" in matched_regex and matched_regex[\"Description\"]:\r\n                s = matched_regex[\"Description\"]\r\n                # lowercases first letter so it doesn't look weird\r\n                s = f\", which is {s[0].lower() + s[1:]}\\n\"\r\n                ret += s\r\n                human += s\r\n\r\n            # if URL is attached, include that too.\r\n            if \"URL\" in matched_regex and matched_regex[\"URL\"]:\r\n                link = matched_regex[\"URL\"] + ctext.replace(\" \", \"\")\r\n                ret += f\"\\nClick here to view in browser [#CAE4F1][link={link}]{link}[/link][/#CAE4F1]\\n\"\r\n\r\n            # If greppable mode is on, don't print this\r\n            if self.config.verbosity >= 0:\r\n                # Print with full stop\r\n                console.print(human)\r\n            return ret\r\n        return None\r\n\r\n    def getExpectedRuntime(self, text: T) -> float:\r\n        # TODO: actually bench this\r\n        return 2e-7 * len(text)\r\n\r\n    @staticmethod\r\n    def getParams() -> Optional[Dict[str, ParamSpec]]:\r\n        return None\r\n\r\n    def __init__(self, config: Config):\r\n        super().__init__(config)\r\n        self.config = config\r\n        self.id = identifier.Identifier()\r\n"
  },
  {
    "path": "ciphey/basemods/Crackers/__init__.py",
    "content": "from . import (\n    affine,\n    ascii_shift,\n    baconian,\n    caesar,\n    rot47,\n    soundex,\n    vigenere,\n    xandy,\n    xortool,\n)\n"
  },
  {
    "path": "ciphey/basemods/Crackers/affine.py",
    "content": "# Community\n# by https://github.com/Ozzyz\n\nfrom typing import Dict, List, Optional\n\nimport cipheycore\nimport logging\nfrom rich.logging import RichHandler\n\nfrom ciphey.common import fix_case\nfrom ciphey.iface import Config, Cracker, CrackInfo, CrackResult, ParamSpec, registry\nfrom ciphey.mathsHelper import mathsHelper\n\n\n@registry.register\nclass Affine(Cracker[str]):\n    \"\"\"\n    Each character in the Affine Cipher is encoded with the rule E(x) = (ax + b) mod m\n    m is the size of the alphabet, while a and b are the keys in the cipher. a must be coprime to b.\n    The Caesar cipher is a specific case of the Affine Cipher, with a=1 and b being the shift of the cipher.\n    Decryption is performed by D(x) = a_inv (x - b) mod m where a_inv is the modular multiplicative inverse of a mod m.\n\n    In this version of the Affine Cipher, we do not allow alphabets with several instances of the same letter in different cases.\n    For instance, the alphabet 'ABCdef123' is allowed, but 'AaBbCc' is not.\n    \"\"\"\n\n    def getInfo(self, ctext: str) -> CrackInfo:\n        return CrackInfo(\n            success_likelihood=0.1,\n            success_runtime=1e-5,\n            failure_runtime=1e-5,\n        )\n\n    @staticmethod\n    def getTarget() -> str:\n        return \"affine\"\n\n    def attemptCrack(self, ctext: str) -> List[CrackResult]:\n        \"\"\"\n        Brute forces all the possible combinations of a and b to attempt to crack the cipher.\n        \"\"\"\n        logging.debug(\"Attempting affine\")\n        candidates = []\n\n        # a and b are coprime if gcd(a,b) is 1.\n        possible_a = [\n            a\n            for a in range(1, self.alphabet_length)\n            if mathsHelper.gcd(a, self.alphabet_length) == 1\n        ]\n        logging.info(\n            f\"Trying Affine Cracker with {len(possible_a)} a-values and {self.alphabet_length} b-values\"\n        )\n\n        for a in possible_a:\n            a_inv = mathsHelper.mod_inv(a, self.alphabet_length)\n            # If there is no inverse, we cannot decrypt the text\n            if a_inv is None:\n                continue\n            for b in range(self.alphabet_length):\n                # Pass in lowered text. This means that we expect alphabets to not contain both 'a' and 'A'.\n                translated = self.decrypt(ctext.lower(), a_inv, b, self.alphabet_length)\n\n                candidate_probability = self.plaintext_probability(translated)\n                if candidate_probability > self.plaintext_prob_threshold:\n                    candidates.append(\n                        CrackResult(\n                            value=fix_case(translated, ctext), key_info=f\"a={a}, b={b}\"\n                        )\n                    )\n        logging.info(f\"Affine Cipher returned {len(candidates)} candidates\")\n        return candidates\n\n    def plaintext_probability(self, translated: str) -> float:\n        \"\"\"\n        Analyses the translated text and applies the chi squared test to see if it is a probable plaintext candidate\n        Returns the probability of the chi-squared test.\n        \"\"\"\n        analysis = cipheycore.analyse_string(translated)\n        return cipheycore.chisq_test(analysis, self.expected)\n\n    def decrypt(self, text: str, a_inv: int, b: int, m: int) -> str:\n        \"\"\"\n        Each letter is decrypted at D(x) = a_inv (x - b) mod m where x is the char\n        We treat the char value as its index in the alphabet, so if\n        the alphabet is 'abcd....' and the char is 'b', it has the value 1.\n        \"\"\"\n        return \"\".join([self.decryptChar(char, a_inv, b, m) for char in text])\n\n    def decryptChar(self, char: str, a_inv: int, b: int, m: int) -> str:\n\n        # We lower the alphabet since both ctext and alphabet need to be in the same case in order\n        # to perform the shifts. The translated text will have fixed case after the translation anyways.\n        # This is only necessary if the specified alphabet is uppercase.\n        alphabet = [x.lower() for x in self.group]\n\n        # Preserve characters that are not in alphabet\n        if char not in alphabet:\n            return char\n        char_idx = alphabet.index(char)\n        decrypted_char_idx = (a_inv * (char_idx - b)) % m\n        return alphabet[decrypted_char_idx]\n\n    @staticmethod\n    def getParams() -> Optional[Dict[str, ParamSpec]]:\n        return {\n            \"expected\": ParamSpec(\n                desc=\"The expected distribution of the plaintext\",\n                req=False,\n                config_ref=[\"default_dist\"],\n            ),\n            \"group\": ParamSpec(\n                desc=\"An ordered sequence of chars that make up the alphabet\",\n                req=False,\n                default=\"abcdefghijklmnopqrstuvwxyz\",\n            ),\n        }\n\n    def __init__(self, config: Config):\n        super().__init__(config)\n        self.group = list(self._params()[\"group\"])\n        self.expected = config.get_resource(self._params()[\"expected\"])\n        self.alphabet_length = len(self.group)\n        self.cache = config.cache\n        self.plaintext_prob_threshold = 0.01\n"
  },
  {
    "path": "ciphey/basemods/Crackers/ascii_shift.py",
    "content": "\"\"\"\n ██████╗██╗██████╗ ██╗  ██╗███████╗██╗   ██╗\n██╔════╝██║██╔══██╗██║  ██║██╔════╝╚██╗ ██╔╝\n██║     ██║██████╔╝███████║█████╗   ╚████╔╝\n██║     ██║██╔═══╝ ██╔══██║██╔══╝    ╚██╔╝\n╚██████╗██║██║     ██║  ██║███████╗   ██║\n© Brandon Skerritt\nGithub: brandonskerritt\n\"\"\"\n\nfrom typing import Dict, List, Optional\n\nimport cipheycore\nimport logging\nfrom rich.logging import RichHandler\n\nfrom ciphey.iface import Config, Cracker, CrackInfo, CrackResult, ParamSpec, registry\n\n\n@registry.register\nclass Ascii_shift(Cracker[str]):\n    def getInfo(self, ctext: str) -> CrackInfo:\n        analysis = self.cache.get_or_update(\n            ctext,\n            \"cipheycore::simple_analysis\",\n            lambda: cipheycore.analyse_string(ctext),\n        )\n\n        return CrackInfo(\n            success_likelihood=cipheycore.caesar_detect(analysis, self.expected),\n            # TODO: actually calculate runtimes\n            success_runtime=1e-5,\n            failure_runtime=1e-5,\n        )\n\n    @staticmethod\n    def getTarget() -> str:\n        return \"ascii_shift\"\n\n    def attemptCrack(self, ctext: str) -> List[CrackResult]:\n        logging.info(f\"Trying ASCII shift cipher on {ctext}\")\n\n        logging.debug(\"Beginning cipheycore simple analysis\")\n\n        # Hand it off to the core\n        analysis = self.cache.get_or_update(\n            ctext,\n            \"cipheycore::simple_analysis\",\n            lambda: cipheycore.analyse_string(ctext),\n        )\n        logging.debug(\"Beginning cipheycore::caesar\")\n        possible_keys = cipheycore.caesar_crack(\n            analysis, self.expected, self.group, self.p_value\n        )\n\n        n_candidates = len(possible_keys)\n        logging.info(f\"ASCII shift returned {n_candidates} candidates\")\n\n        if n_candidates == 0:\n            logging.debug(\"Filtering for better results\")\n            analysis = cipheycore.analyse_string(ctext, self.group)\n            possible_keys = cipheycore.caesar_crack(\n                analysis, self.expected, self.group, self.p_value\n            )\n\n        candidates = []\n\n        for candidate in possible_keys:\n            logging.debug(f\"Candidate {candidate.key} has prob {candidate.p_value}\")\n            translated = cipheycore.caesar_decrypt(ctext, candidate.key, self.group)\n            candidates.append(CrackResult(value=translated, key_info=candidate.key))\n\n        return candidates\n\n    @staticmethod\n    def getParams() -> Optional[Dict[str, ParamSpec]]:\n        return {\n            \"expected\": ParamSpec(\n                desc=\"The expected distribution of the plaintext\",\n                req=False,\n                config_ref=[\"default_dist\"],\n            ),\n            \"group\": ParamSpec(\n                desc=\"An ordered sequence of chars that make up the ASCII shift cipher alphabet\",\n                req=False,\n                default=\"\"\"\\x00\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\x08\\t\\n\\x0b\\x0c\\r\\x0e\\x0f\\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17\\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f !\"#$%&\\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\\x7f\"\"\",\n            ),\n            \"p_value\": ParamSpec(\n                desc=\"The p-value to use for standard frequency analysis\",\n                req=False,\n                default=0.01,\n            )\n            # TODO: add \"filter\" param\n        }\n\n    def __init__(self, config: Config):\n        super().__init__(config)\n        self.group = list(self._params()[\"group\"])\n        self.expected = config.get_resource(self._params()[\"expected\"])\n        self.cache = config.cache\n        self.p_value = float(self._params()[\"p_value\"])\n"
  },
  {
    "path": "ciphey/basemods/Crackers/baconian.py",
    "content": "import re\nfrom typing import Dict, List, Optional\n\nfrom ciphey.iface import (\n    Config,\n    Cracker,\n    CrackInfo,\n    CrackResult,\n    ParamSpec,\n    Translation,\n    registry,\n)\nimport logging\nfrom rich.logging import RichHandler\n\n\n@registry.register\nclass Baconian(Cracker[str]):\n    def getInfo(self, ctext: str) -> CrackInfo:\n        return CrackInfo(\n            success_likelihood=0.1,\n            success_runtime=1e-5,\n            failure_runtime=1e-5,\n        )\n\n    @staticmethod\n    def getTarget() -> str:\n        return \"baconian\"\n\n    def attemptCrack(self, ctext: str) -> List[CrackResult]:\n        \"\"\"\n        Attempts to decode both variants of the Baconian cipher.\n        \"\"\"\n        logging.debug(\"Attempting Baconian cracker\")\n        candidates = []\n        result = []\n        ctext_decoded = \"\"\n        ctext_decoded2 = \"\"\n\n        # Convert to uppercase and replace delimiters and whitespace with nothing\n        ctext = re.sub(r\"[,;:\\-\\s]\", \"\", ctext.upper())\n\n        # Make sure ctext only contains A and B\n        if bool(re.search(r\"[^AB]\", ctext)) is True:\n            logging.debug(\"Failed to crack baconian due to non baconian character(s)\")\n            return None\n\n        # Make sure ctext is divisible by 5\n        ctext_len = len(ctext)\n        if ctext_len % 5:\n            logging.debug(\n                f\"Failed to decode Baconian because length must be a multiple of 5, not '{ctext_len}'\"\n            )\n            return None\n\n        # Split ctext into groups of 5\n        ctext = \" \".join(ctext[i : i + 5] for i in range(0, len(ctext), 5))\n        ctext_split = ctext.split(\" \")\n        baconian_keys = self.BACONIAN_DICT.keys()\n\n        # Decode I=J and U=V variant\n        for i in ctext_split:\n            if i in baconian_keys:\n                ctext_decoded += self.BACONIAN_DICT[i]\n\n        # Decode variant that assigns each letter a unique code\n        for i in ctext_split:\n            if \"+\" + i in baconian_keys:\n                ctext_decoded2 += self.BACONIAN_DICT[\"+\" + i]\n\n        candidates.append(ctext_decoded)\n        candidates.append(ctext_decoded2)\n        for candidate in candidates:\n            if candidate != \"\":\n                if candidate == candidates[0]:\n                    result.append(CrackResult(value=candidate, key_info=\"I=J & U=V\"))\n                else:\n                    result.append(CrackResult(value=candidate))\n        logging.debug(f\"Baconian cracker - Returning results: {result}\")\n        return result\n\n    @staticmethod\n    def getParams() -> Optional[Dict[str, ParamSpec]]:\n        return {\n            \"expected\": ParamSpec(\n                desc=\"The expected distribution of the plaintext\",\n                req=False,\n                config_ref=[\"default_dist\"],\n            ),\n            \"dict\": ParamSpec(\n                desc=\"The Baconian alphabet dictionary to use\",\n                req=False,\n                default=\"cipheydists::translate::baconian\",\n            ),\n        }\n\n    def __init__(self, config: Config):\n        super().__init__(config)\n        self.BACONIAN_DICT = config.get_resource(self._params()[\"dict\"], Translation)\n        self.expected = config.get_resource(self._params()[\"expected\"])\n        self.cache = config.cache\n"
  },
  {
    "path": "ciphey/basemods/Crackers/caesar.py",
    "content": "\"\"\"\n ██████╗██╗██████╗ ██╗  ██╗███████╗██╗   ██╗\n██╔════╝██║██╔══██╗██║  ██║██╔════╝╚██╗ ██╔╝\n██║     ██║██████╔╝███████║█████╗   ╚████╔╝\n██║     ██║██╔═══╝ ██╔══██║██╔══╝    ╚██╔╝\n╚██████╗██║██║     ██║  ██║███████╗   ██║\n© Brandon Skerritt\nGithub: brandonskerritt\n\"\"\"\nfrom distutils import util\nfrom typing import Dict, List, Optional, Union\n\nimport cipheycore\nimport logging\nfrom rich.logging import RichHandler\n\nfrom ciphey.common import fix_case\nfrom ciphey.iface import Config, Cracker, CrackInfo, CrackResult, ParamSpec, registry\n\n\n@registry.register\nclass Caesar(Cracker[str]):\n    def getInfo(self, ctext: str) -> CrackInfo:\n        analysis = self.cache.get_or_update(\n            ctext,\n            \"cipheycore::simple_analysis\",\n            lambda: cipheycore.analyse_string(ctext),\n        )\n\n        return CrackInfo(\n            success_likelihood=cipheycore.caesar_detect(analysis, self.expected),\n            # TODO: actually calculate runtimes\n            success_runtime=1e-5,\n            failure_runtime=1e-5,\n        )\n\n    @staticmethod\n    def getTarget() -> str:\n        return \"caesar\"\n\n    def attemptCrack(self, ctext: str) -> List[CrackResult]:\n        logging.info(f\"Trying caesar cipher on {ctext}\")\n        # Convert it to lower case\n        #\n        # TODO: handle different alphabets\n        if self.lower:\n            message = ctext.lower()\n        else:\n            message = ctext\n\n        logging.debug(\"Beginning cipheycore simple analysis\")\n\n        # Hand it off to the core\n        analysis = self.cache.get_or_update(\n            ctext,\n            \"cipheycore::simple_analysis\",\n            lambda: cipheycore.analyse_string(ctext),\n        )\n        logging.debug(\"Beginning cipheycore::caesar\")\n        possible_keys = cipheycore.caesar_crack(\n            analysis, self.expected, self.group, self.p_value\n        )\n\n        n_candidates = len(possible_keys)\n        logging.info(f\"Caesar returned {n_candidates} candidates\")\n\n        if n_candidates == 0:\n            logging.debug(\"Filtering for better results\")\n            analysis = cipheycore.analyse_string(ctext, self.group)\n            possible_keys = cipheycore.caesar_crack(\n                analysis, self.expected, self.group, self.p_value\n            )\n\n        candidates = []\n\n        for candidate in possible_keys:\n            logging.debug(f\"Candidate {candidate.key} has prob {candidate.p_value}\")\n            translated = cipheycore.caesar_decrypt(message, candidate.key, self.group)\n            candidates.append(\n                CrackResult(value=fix_case(translated, ctext), key_info=candidate.key)\n            )\n\n        return candidates\n\n    @staticmethod\n    def getParams() -> Optional[Dict[str, ParamSpec]]:\n        return {\n            \"expected\": ParamSpec(\n                desc=\"The expected distribution of the plaintext\",\n                req=False,\n                config_ref=[\"default_dist\"],\n            ),\n            \"group\": ParamSpec(\n                desc=\"An ordered sequence of chars that make up the caesar cipher alphabet\",\n                req=False,\n                default=\"abcdefghijklmnopqrstuvwxyz\",\n            ),\n            \"lower\": ParamSpec(\n                desc=\"Whether or not the ciphertext should be converted to lowercase first\",\n                req=False,\n                default=True,\n            ),\n            \"p_value\": ParamSpec(\n                desc=\"The p-value to use for standard frequency analysis\",\n                req=False,\n                default=0.01,\n            )\n            # TODO: add \"filter\" param\n        }\n\n    def __init__(self, config: Config):\n        super().__init__(config)\n        self.lower: Union[str, bool] = self._params()[\"lower\"]\n        if not isinstance(self.lower, bool):\n            self.lower = util.strtobool(self.lower)\n        self.group = list(self._params()[\"group\"])\n        self.expected = config.get_resource(self._params()[\"expected\"])\n        self.cache = config.cache\n        self.p_value = float(self._params()[\"p_value\"])\n"
  },
  {
    "path": "ciphey/basemods/Crackers/hash.py",
    "content": "\"\"\"\nThis is Hashbuster but slightly modified to work with Ciphey.\nWhy reinvent the wheel?\nChanges (that I can remember)\n* timeout set, as hashbuster took AGES before timeout was set.\nhttps://github.com/s0md3v/Hash-Buster\n\"\"\"\n\nimport re\nfrom typing import Dict, List, Optional\n\nimport requests\nimport logging\nfrom rich.logging import RichHandler\n\nfrom ciphey.iface import Config, Cracker, CrackInfo, CrackResult, ParamSpec, T, registry\n\nthread_count = 4\n\n\ndef alpha(ctext, hashtype):\n    return None\n\n\ndef beta(ctext, hashtype):\n    try:\n        response = requests.get(\n            \"https://hashtoolkit.com/reverse-hash/?hash=\", ctext, timeout=5\n        ).text\n    except requests.exceptions.ReadTimeout as e:\n        logging.info(f\"Beta failed timeout {e}\")\n    match = re.search(r'/generate-hash/?text=.*?\"', response)\n    if match:\n        return match.group(1)\n    return None\n\n\ndef gamma(ctext, hashtype):\n    try:\n        response = requests.get(\n            \"https://www.nitrxgen.net/md5db/\" + ctext, timeout=5\n        ).text\n    except requests.exceptions.ReadTimeout as e:\n        logging.info(f\"Gamma failed with {e}\")\n    if response:\n        return response\n    else:\n        return None\n\n\ndef delta(ctext, hashtype):\n    return None\n\n\ndef theta(ctext, hashtype):\n    try:\n        response = requests.get(\n            \"https://md5decrypt.net/Api/api.php?hash=%s&hash_type=%s&email=deanna_abshire@proxymail.eu&code=1152464b80a61728\"\n            % (ctext, hashtype),\n            timeout=5,\n        ).text\n    except requests.exceptions.ReadTimeout as e:\n        logging.info(f\"Gamma failed with {e}\")\n    if len(response) != 0:\n        return response\n    else:\n        return None\n\n\nmd5 = [gamma, alpha, beta, theta, delta]\nsha1 = [alpha, beta, theta, delta]\nsha256 = [alpha, beta, theta]\nsha384 = [alpha, beta, theta]\nsha512 = [alpha, beta, theta]\n\n\nresult = {}\n\n\ndef crack(ctext):\n    raise \"Error Crack is called\"\n\n\ndef threaded(ctext):\n    resp = crack(ctext)\n    if resp:\n        print(ctext + \" : \" + resp)\n        result[ctext] = resp\n\n\n@registry.register\nclass HashBuster(Cracker[str]):\n    @staticmethod\n    def getTarget() -> str:\n        return \"hash\"\n\n    @staticmethod\n    def getParams() -> Optional[Dict[str, ParamSpec]]:\n        return None\n\n    @staticmethod\n    def priority() -> float:\n        return 0.05\n\n    def getInfo(self, ctext: T) -> CrackInfo:\n        # TODO calculate these properly\n        return CrackInfo(\n            success_likelihood=0.5,\n            success_runtime=5,\n            failure_runtime=5,\n        )\n\n    def attemptCrack(self, ctext: T) -> List[CrackResult]:\n        logging.info(\"Starting to crack hashes\")\n        result = False\n\n        candidates = []\n        if len(ctext) == 32:\n            for api in md5:\n                r = api(ctext, \"md5\")\n                if result is not None or r is not None:\n                    logging.debug(\"MD5 returns True {r}\")\n                    candidates.append(result, \"MD5\")\n        elif len(ctext) == 40:\n            for api in sha1:\n                r = api(ctext, \"sha1\")\n                if result is not None and r is not None:\n                    logging.debug(\"sha1 returns true\")\n                    candidates.append(result, \"SHA1\")\n        elif len(ctext) == 64:\n            for api in sha256:\n                r = api(ctext, \"sha256\")\n                if result is not None and r is not None:\n                    logging.debug(\"sha256 returns true\")\n                    candidates.append(result, \"SHA256\")\n        elif len(ctext) == 96:\n            for api in sha384:\n                r = api(ctext, \"sha384\")\n                if result is not None and r is not None:\n                    logging.debug(\"sha384 returns true\")\n                    candidates.append(result, \"SHA384\")\n        elif len(ctext) == 128:\n            for api in sha512:\n                r = api(ctext, \"sha512\")\n                if result is not None and r is not None:\n                    logging.debug(\"sha512 returns true\")\n                    candidates.append(result, \"SHA512\")\n\n        # TODO what the fuck is this code?\n        logging.debug(f\"Hash buster returning {result}\")\n        # TODO add to 5.1 make this return multiple possible candidates\n        return [CrackResult(value=candidates[0][0], misc_info=candidates[1][1])]\n\n    def __init__(self, config: Config):\n        super().__init__(config)\n"
  },
  {
    "path": "ciphey/basemods/Crackers/rot47.py",
    "content": "\"\"\"\n ██████╗██╗██████╗ ██╗  ██╗███████╗██╗   ██╗\n██╔════╝██║██╔══██╗██║  ██║██╔════╝╚██╗ ██╔╝\n██║     ██║██████╔╝███████║█████╗   ╚████╔╝\n██║     ██║██╔═══╝ ██╔══██║██╔══╝    ╚██╔╝\n╚██████╗██║██║     ██║  ██║███████╗   ██║\n© Brandon Skerritt\nGithub: brandonskerritt\n\"\"\"\n\nfrom typing import Dict, List, Optional\n\nimport cipheycore\nimport logging\nfrom rich.logging import RichHandler\n\nfrom ciphey.iface import Config, Cracker, CrackInfo, CrackResult, ParamSpec, registry\n\n\n@registry.register\nclass Rot47(Cracker[str]):\n    def getInfo(self, ctext: str) -> CrackInfo:\n        analysis = self.cache.get_or_update(\n            ctext,\n            \"cipheycore::simple_analysis\",\n            lambda: cipheycore.analyse_string(ctext),\n        )\n\n        return CrackInfo(\n            success_likelihood=cipheycore.caesar_detect(analysis, self.expected),\n            # TODO: actually calculate runtimes\n            success_runtime=1e-5,\n            failure_runtime=1e-5,\n        )\n\n    @staticmethod\n    def getTarget() -> str:\n        return \"rot47\"\n\n    def attemptCrack(self, ctext: str) -> List[CrackResult]:\n        logging.info(f\"Trying ROT47 cipher on {ctext}\")\n\n        logging.debug(\"Beginning cipheycore simple analysis\")\n\n        # Hand it off to the core\n        analysis = self.cache.get_or_update(\n            ctext,\n            \"cipheycore::simple_analysis\",\n            lambda: cipheycore.analyse_string(ctext),\n        )\n        logging.debug(\"Beginning cipheycore::caesar\")\n        possible_keys = cipheycore.caesar_crack(\n            analysis, self.expected, self.group, self.p_value\n        )\n\n        n_candidates = len(possible_keys)\n        logging.info(f\"ROT47 returned {n_candidates} candidates\")\n\n        if n_candidates == 0:\n            logging.debug(\"Filtering for better results\")\n            analysis = cipheycore.analyse_string(ctext, self.group)\n            possible_keys = cipheycore.caesar_crack(\n                analysis, self.expected, self.group, self.p_value\n            )\n\n        candidates = []\n\n        for candidate in possible_keys:\n            logging.debug(f\"Candidate {candidate.key} has prob {candidate.p_value}\")\n            translated = cipheycore.caesar_decrypt(ctext, candidate.key, self.group)\n            candidates.append(CrackResult(value=translated, key_info=candidate.key))\n\n        return candidates\n\n    @staticmethod\n    def getParams() -> Optional[Dict[str, ParamSpec]]:\n        return {\n            \"expected\": ParamSpec(\n                desc=\"The expected distribution of the plaintext\",\n                req=False,\n                config_ref=[\"default_dist\"],\n            ),\n            \"group\": ParamSpec(\n                desc=\"An ordered sequence of chars that make up the ROT47 cipher alphabet\",\n                req=False,\n                default=\"\"\"!\"#$%&\\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\"\"\",\n            ),\n            \"p_value\": ParamSpec(\n                desc=\"The p-value to use for standard frequency analysis\",\n                req=False,\n                default=0.01,\n            )\n            # TODO: add \"filter\" param\n        }\n\n    def __init__(self, config: Config):\n        super().__init__(config)\n        self.group = list(self._params()[\"group\"])\n        self.expected = config.get_resource(self._params()[\"expected\"])\n        self.cache = config.cache\n        self.p_value = float(self._params()[\"p_value\"])\n"
  },
  {
    "path": "ciphey/basemods/Crackers/soundex.py",
    "content": "import re\nfrom typing import Dict, List, Optional\n\nimport logging\nfrom rich.logging import RichHandler\n\nfrom ciphey.iface import (\n    Config,\n    Cracker,\n    CrackInfo,\n    CrackResult,\n    ParamSpec,\n    Translation,\n    registry,\n)\n\n\n@registry.register\nclass Soundex(Cracker[str]):\n    def getInfo(self, ctext: str) -> CrackInfo:\n        return CrackInfo(\n            success_likelihood=0.1,\n            success_runtime=1e-5,\n            failure_runtime=1e-5,\n        )\n\n    @staticmethod\n    def getTarget() -> str:\n        return \"soundex\"\n\n    def attemptCrack(self, ctext: str) -> List[CrackResult]:\n        \"\"\"\n        Attempts to crack Soundex by generating all possible combinations.\n        \"\"\"\n        logging.debug(\"Attempting Soundex cracker\")\n        word_list = []\n        sentences = []\n        result = []\n\n        # Convert to uppercase and replace delimiters and whitespace with nothing\n        ctext = re.sub(r\"[,;:\\-\\s]\", \"\", ctext.upper())\n\n        # Make sure ctext contains only A-Z and 0-9\n        if bool(re.search(r\"[^A-Z0-9]\", ctext)) is True:\n            logging.debug(\"Failed to crack soundex due to non soundex character(s)\")\n            return None\n\n        # Make sure ctext is divisible by 4\n        ctext_len = len(ctext)\n        if ctext_len % 4:\n            logging.debug(\n                f\"Failed to decode Soundex because length must be a multiple of 4, not '{ctext_len}'\"\n            )\n            return None\n\n        # Split ctext into groups of 4\n        ctext = \" \".join(ctext[i : i + 4] for i in range(0, len(ctext), 4))\n        ctext_split = ctext.split(\" \")\n        soundex_keys = self.SOUNDEX_DICT.keys()\n\n        # Find all words that correspond to each given soundex code\n        for code in ctext_split:\n            if code in soundex_keys:\n                word_list.append(self.SOUNDEX_DICT[code])\n\n        logging.info(f\"Possible words for given encoded text: {word_list}\")\n\n        # Find all possible sentences\n        self.getSentenceCombo(\n            word_list,\n            sentences,\n            self.frequency_dict,\n            self.sentence_freq,\n            self.word_freq,\n        )\n\n        sorted_sentences = self.sortlistwithdict(sentences, self.frequency_dict)\n\n        for sentence in sorted_sentences:\n            result.append(CrackResult(value=sentence))\n\n        logging.debug(f\"Soundex cracker - Returning results: {result}\")\n        return result\n\n    def sortlistwithdict(self, listtosort, hashes):\n        \"\"\"\n        This function uses the sum of ranks (based on frequency) of each word in each\n        sentence and sorts them according to it.\n        \"\"\"\n        return sorted(listtosort, key=lambda x: hashes[x])\n\n    def getSentenceCombo(\n        self, A, sentences, frequency_dict, sentence_freq, word_freq, result=\"\", n=0\n    ):\n        \"\"\"\n        This function uses recursion to generate a list of sentences from all possible\n        words for a given set of soundex codes.\n        \"\"\"\n        logging.debug(\"Creating all possible sentences from Soundex\")\n        if n == len(A):\n            sentences.append(result[1:])\n            for word in result[1:].split():\n                # Adding the rank of each word to find out the sentence's net frequency\n                if word in word_freq:\n                    sentence_freq += word_freq.index(word)\n                # If the word isn't in the frequency list then it's a very uncommon word\n                # so we add a large number (5000)\n                else:\n                    sentence_freq += 5000\n            frequency_dict[result[1:]] = sentence_freq\n            sentence_freq = 0\n            return\n\n        for word in A[n]:\n            out = result + \" \" + word\n            self.getSentenceCombo(\n                A, sentences, frequency_dict, sentence_freq, word_freq, out, n + 1\n            )\n\n    @staticmethod\n    def getParams() -> Optional[Dict[str, ParamSpec]]:\n        return {\n            \"dict\": ParamSpec(\n                desc=\"The Soundex dictionary to use\",\n                req=False,\n                default=\"cipheydists::translate::soundex\",\n            ),\n            \"freq\": ParamSpec(\n                desc=\"The word frequency dictionary to use\",\n                req=False,\n                default=\"cipheydists::list::English5000Freq\",\n            ),\n        }\n\n    def __init__(self, config: Config):\n        super().__init__(config)\n        self.SOUNDEX_DICT = config.get_resource(self._params()[\"dict\"], Translation)\n        self.word_freq = config.get_resource(self._params()[\"freq\"], Translation)\n        self.frequency_dict = {}\n        self.sentence_freq = 0\n"
  },
  {
    "path": "ciphey/basemods/Crackers/vigenere.py",
    "content": "\"\"\"\n ██████╗██╗██████╗ ██╗  ██╗███████╗██╗   ██╗\n██╔════╝██║██╔══██╗██║  ██║██╔════╝╚██╗ ██╔╝\n██║     ██║██████╔╝███████║█████╗   ╚████╔╝\n██║     ██║██╔═══╝ ██╔══██║██╔══╝    ╚██╔╝\n╚██████╗██║██║     ██║  ██║███████╗   ██║\n© Brandon Skerritt\nGithub: brandonskerritt\n\"\"\"\nfrom distutils import util\nfrom typing import Dict, List, Optional, Union\n\nimport cipheycore\nimport logging\nfrom rich.logging import RichHandler\n\nfrom ciphey.common import fix_case\nfrom ciphey.iface import Config, Cracker, CrackInfo, CrackResult, ParamSpec, registry\n\n\n@registry.register\nclass Vigenere(Cracker[str]):\n    def getInfo(self, ctext: str) -> CrackInfo:\n        if self.keysize is not None:\n            analysis = self.cache.get_or_update(\n                ctext,\n                f\"vigenere::{self.keysize}\",\n                lambda: cipheycore.analyse_string(\n                    ctext.lower(), self.keysize, self.group\n                ),\n            )\n\n            val = cipheycore.vigenere_detect(analysis, self.expected)\n\n            logging.info(f\"Vigenere has likelihood {val}\")\n\n            return CrackInfo(\n                success_likelihood=val,\n                # TODO: actually calculate runtimes\n                success_runtime=1e-3,\n                failure_runtime=1e-2,\n            )\n\n        likely_lens = self.cache.get_or_update(\n            ctext,\n            \"vigenere::likely_lens\",\n            lambda: cipheycore.vigenere_likely_key_lens(\n                ctext.lower(), self.expected, self.group, self.detect_p_value\n            ),\n        )\n\n        # Filter out the lens that make no sense\n        likely_lens = [i for i in likely_lens if i.len <= self.max_key_length]\n\n        for keysize in likely_lens:\n            # Store the analysis\n            analysis = self.cache.get_or_update(\n                ctext, f\"vigenere::{keysize.len}\", lambda: keysize.tab\n            )\n        if len(likely_lens) == 0:\n            return CrackInfo(\n                success_likelihood=0,\n                # TODO: actually calculate runtimes\n                success_runtime=2e-3,\n                failure_runtime=2e-2,\n            )\n\n        logging.info(\n            f\"Vigenere has likelihood {likely_lens[0].p_value} with lens {[i.len for i in likely_lens]}\"\n        )\n\n        return CrackInfo(\n            success_likelihood=likely_lens[0].p_value,\n            # TODO: actually calculate runtimes\n            success_runtime=2e-4,\n            failure_runtime=2e-4,\n        )\n\n    @staticmethod\n    def getTarget() -> str:\n        return \"vigenere\"\n\n    def crackOne(\n        self, ctext: str, analysis: cipheycore.windowed_analysis_res, real_ctext: str\n    ) -> List[CrackResult]:\n        possible_keys = cipheycore.vigenere_crack(\n            analysis, self.expected, self.group, self.p_value\n        )\n        if len(possible_keys) > self.clamp:\n            possible_keys = possible_keys[: self.clamp]\n        logging.debug(\n            f\"Vigenere crack got keys: {[[i for i in candidate.key] for candidate in possible_keys]}\"\n        )\n        return [\n            CrackResult(\n                value=fix_case(\n                    cipheycore.vigenere_decrypt(ctext, candidate.key, self.group),\n                    real_ctext,\n                ),\n                key_info=\"\".join([self.group[i] for i in candidate.key]),\n                misc_info=f\"p-value was {candidate.p_value}\",\n            )\n            for candidate in possible_keys[: min(len(possible_keys), 10)]\n        ]\n\n    def attemptCrack(self, ctext: str) -> List[CrackResult]:\n        logging.info(\"Trying vigenere cipher\")\n        # Convert it to lower case\n        if self.lower:\n            message = ctext.lower()\n        else:\n            message = ctext\n\n        # Analysis must be done here, where we know the case for the cache\n        if self.keysize is not None:\n            return self.crackOne(\n                message,\n                self.cache.get_or_update(\n                    ctext,\n                    f\"vigenere::{self.keysize}\",\n                    lambda: cipheycore.analyse_string(\n                        message, self.keysize, self.group\n                    ),\n                ),\n                ctext,\n            )\n\n        arrs = []\n        likely_lens = self.cache.get_or_update(\n            ctext,\n            \"vigenere::likely_lens\",\n            lambda: cipheycore.vigenere_likely_key_lens(\n                message, self.expected, self.group\n            ),\n        )\n        possible_lens = [i for i in likely_lens]\n        possible_lens.sort(key=lambda i: i.p_value)\n        logging.debug(f\"Got possible lengths {[i.len for i in likely_lens]}\")\n        # TODO: work out length\n        for i in possible_lens:\n            arrs.extend(\n                self.crackOne(\n                    message,\n                    self.cache.get_or_update(\n                        ctext,\n                        f\"vigenere::{i.len}\",\n                        lambda: cipheycore.analyse_string(message, i.len, self.group),\n                    ),\n                    ctext,\n                )\n            )\n\n        logging.info(f\"Vigenere returned {len(arrs)} candidates\")\n        return arrs\n\n    @staticmethod\n    def getParams() -> Optional[Dict[str, ParamSpec]]:\n        return {\n            \"expected\": ParamSpec(\n                desc=\"The expected distribution of the plaintext\",\n                req=False,\n                config_ref=[\"default_dist\"],\n            ),\n            \"group\": ParamSpec(\n                desc=\"An ordered sequence of chars that make up the caesar cipher alphabet\",\n                req=False,\n                default=\"abcdefghijklmnopqrstuvwxyz\",\n            ),\n            \"lower\": ParamSpec(\n                desc=\"Whether or not the ciphertext should be converted to lowercase first\",\n                req=False,\n                default=True,\n            ),\n            \"keysize\": ParamSpec(\n                desc=\"A key size that should be used. If not given, will attempt to work it out\",\n                req=False,\n            ),\n            \"p_value\": ParamSpec(\n                desc=\"The p-value to use for windowed frequency analysis\",\n                req=False,\n                default=0.5,\n            ),\n            \"detect_p_value\": ParamSpec(\n                desc=\"The p-value to use for the detection of Vigenere length\",\n                req=False,\n                default=0.01,\n            ),\n            \"clamp\": ParamSpec(\n                desc=\"The maximum number of candidates that can be returned per key len\",\n                req=False,\n                default=10,\n            ),\n        }\n\n    def __init__(self, config: Config):\n        super().__init__(config)\n        self.lower: Union[str, bool] = self._params()[\"lower\"]\n        if not isinstance(self.lower, bool):\n            self.lower = util.strtobool(self.lower)\n        self.group = list(self._params()[\"group\"])\n        self.expected = config.get_resource(self._params()[\"expected\"])\n        self.cache = config.cache\n        self.keysize = self._params().get(\"keysize\")\n        if self.keysize is not None:\n            self.keysize = int(self.keysize)\n        self.p_value = float(self._params()[\"p_value\"])\n        self.detect_p_value = float(self._params()[\"detect_p_value\"])\n        self.clamp = int(self._params()[\"clamp\"])\n        self.max_key_length = 16\n"
  },
  {
    "path": "ciphey/basemods/Crackers/xandy.py",
    "content": "import re\nfrom typing import Dict, List, Optional\n\nimport logging\nfrom rich.logging import RichHandler\n\nfrom ciphey.iface import Config, Cracker, CrackInfo, CrackResult, ParamSpec, registry\n\n\n@registry.register\nclass Xandy(Cracker[str]):\n    def getInfo(self, ctext: str) -> CrackInfo:\n        return CrackInfo(\n            success_likelihood=0.1,\n            success_runtime=1e-5,\n            failure_runtime=1e-5,\n        )\n\n    @staticmethod\n    def binary_to_ascii(variant):\n        # Convert the binary string to an integer with base 2\n        binary_int = int(variant, 2)\n        byte_number = binary_int.bit_length() + 7 // 8\n\n        # Convert the resulting int to a bytearray and then decode it to ASCII text\n        binary_array = binary_int.to_bytes(byte_number, \"big\")\n        try:\n            ascii_text = binary_array.decode()\n            logging.debug(f\"Found possible solution: {ascii_text[:32]}\")\n            return ascii_text\n        except UnicodeDecodeError as e:\n            logging.debug(f\"Failed to crack X-Y due to a UnicodeDecodeError: {e}\")\n            return \"\"\n\n    @staticmethod\n    def getTarget() -> str:\n        return \"xandy\"\n\n    def attemptCrack(self, ctext: str) -> List[CrackResult]:\n        \"\"\"\n        Checks an input if it only consists of two or three different letters.\n        If this is the case, it attempts to regard those letters as\n        0 and 1 (with the third characters as an optional delimiter) and then\n        converts it to ASCII text.\n        \"\"\"\n        logging.debug(\"Attempting X-Y replacement\")\n        variants = []\n        candidates = []\n        result = []\n\n        # Convert the ctext to all-lowercase and regex-match & replace all whitespace\n        ctext = re.sub(r\"\\s+\", \"\", ctext.lower(), flags=re.UNICODE)\n\n        # cset contains every unique value in the ctext\n        cset = list(set(list(ctext)))\n        cset_len = len(cset)\n\n        if not 1 < cset_len < 4:\n            # We only consider inputs with two or three unique values\n            logging.debug(\n                \"Failed to crack X-Y due to not containing two or three unique values\"\n            )\n            return None\n\n        logging.debug(f\"String contains {cset_len} unique values: {cset}\")\n\n        # In case of three unique values, we regard the least frequent character as the delimiter\n        if cset_len == 3:\n            # Count each unique character in the set to determine the least frequent one\n            counting_list = []\n            for char in cset:\n                counting_list.append(ctext.count(char))\n            val, index = min((val, index) for (index, val) in enumerate(counting_list))\n            delimiter = cset[index]\n            logging.debug(\n                f\"{delimiter} occurs {val} times and is the probable delimiter\"\n            )\n            # Remove the delimiter from the ctext and compute new cset\n            ctext = ctext.replace(delimiter, \"\")\n            cset = list(set(list(ctext)))\n\n        # Form both variants of the substitution\n        for i in range(2):\n            if i:\n                variants.append(ctext.replace(cset[0], \"1\").replace(cset[1], \"0\"))\n            else:\n                variants.append(ctext.replace(cset[0], \"0\").replace(cset[1], \"1\"))\n\n        # Apply function to both variants and strip stray NULL characters\n        for variant in variants:\n            candidates.append(self.binary_to_ascii(variant).strip(\"\\x00\"))\n        for i, candidate in enumerate(candidates):\n            if candidate != \"\":\n                keyinfo = f\"{cset[0]} -> {i} & {cset[1]} -> {str(int(not i))}\"\n                result.append(CrackResult(value=candidate, key_info=keyinfo))\n                logging.debug(f\"X-Y cracker - Returning results: {result}\")\n                return result\n\n    @staticmethod\n    def getParams() -> Optional[Dict[str, ParamSpec]]:\n        return {\n            \"expected\": ParamSpec(\n                desc=\"The expected distribution of the plaintext\",\n                req=False,\n                config_ref=[\"default_dist\"],\n            )\n        }\n\n    def __init__(self, config: Config):\n        super().__init__(config)\n        self.expected = config.get_resource(self._params()[\"expected\"])\n        self.cache = config.cache\n"
  },
  {
    "path": "ciphey/basemods/Crackers/xortool.py",
    "content": "\"\"\"\n ██████╗██╗██████╗ ██╗  ██╗███████╗██╗   ██╗\n██╔════╝██║██╔══██╗██║  ██║██╔════╝╚██╗ ██╔╝\n██║     ██║██████╔╝███████║█████╗   ╚████╔╝\n██║     ██║██╔═══╝ ██╔══██║██╔══╝    ╚██╔╝\n╚██████╗██║██║     ██║  ██║███████╗   ██║\n© Brandon Skerritt\nGithub: bee-san\n\"\"\"\nfrom typing import Dict, List, Optional\n\nimport logging\nfrom rich.logging import RichHandler\n\nfrom xortool_ciphey import tool_main\n\nfrom ciphey.iface import Config, Cracker, CrackInfo, CrackResult, ParamSpec, registry\n\n\n@registry.register\nclass XorTool(Cracker[str]):\n    def getInfo(self, ctext: str) -> CrackInfo:\n        return CrackInfo(\n            success_likelihood=0.1,\n            # TODO: actually calculate runtimes\n            success_runtime=1e-8,\n            failure_runtime=1e-8,\n        )\n\n    @staticmethod\n    def getTarget() -> str:\n        return \"xortool\"\n\n    def attemptCrack(self, ctext: str) -> List[CrackResult]:\n        logging.debug(\"Trying xortool cipher\")\n        # TODO handle different charsets\n        # TODO allow more config over xortool\n\n        logging.debug(f\"{ctext}\")\n\n        # https://github.com/Ciphey/xortool/discussions/4\n        # for docs on this function\n        try:\n            result = tool_main.api(str.encode(ctext))\n        except:\n            logging.debug(\"Xor failed.\")\n            return\n\n        result = CrackResult(value=result[1][\"Dexored\"], key_info=result[0][\"keys\"])\n\n        return [result]\n\n    @staticmethod\n    def getParams() -> Optional[Dict[str, ParamSpec]]:\n        return {\n            \"expected\": ParamSpec(\n                desc=\"The expected distribution of the plaintext\",\n                req=False,\n                config_ref=[\"default_dist\"],\n            ),\n            \"p_value\": ParamSpec(\n                desc=\"The p-value to use for standard frequency analysis\",\n                req=False,\n                default=0.01,\n            ),\n        }\n\n    @staticmethod\n    def score_utility() -> float:\n        return 1.5\n\n    def __init__(self, config: Config):\n        super().__init__(config)\n        self.expected = config.get_resource(self._params()[\"expected\"])\n        self.cache = config.cache\n        self.p_value = self._params()[\"p_value\"]\n"
  },
  {
    "path": "ciphey/basemods/Decoders/__init__.py",
    "content": "from . import (\n    a1z26,\n    atbash,\n    base58_bitcoin,\n    base58_ripple,\n    base62,\n    base69,\n    base91,\n    bases,\n    baudot,\n    binary,\n    braille,\n    brainfuck,\n    decimal,\n    dna,\n    dtmf,\n    galactic,\n    gzip,\n    hexadecimal,\n    leetspeak,\n    morse_code,\n    multi_tap,\n    octal,\n    reverse,\n    tap_code,\n    unicode,\n    url,\n    uuencode,\n)\n"
  },
  {
    "path": "ciphey/basemods/Decoders/a1z26.py",
    "content": "import re\nfrom typing import Dict, Optional\n\nimport logging\nfrom rich.logging import RichHandler\n\nfrom ciphey.iface import Config, Decoder, ParamSpec, T, U, registry\n\n\n@registry.register\nclass A1z26(Decoder[str]):\n    def decode(self, ctext: T) -> Optional[U]:\n        \"\"\"\n        Performs A1Z26 decoding\n        \"\"\"\n        logging.debug(\"Attempting A1Z26\")\n        ctext_converted = []\n        ctext_split = re.split(r\"[ ,;:\\-\\n]\", ctext)\n        delimiters = set(sorted(re.sub(r\"[^ ,;:\\-\\n]\", \"\", ctext)))\n        ctext_num = re.sub(r\"[,;:\\-\\s]\", \"\", ctext)\n        ctext_decoded = \"\"\n        if ctext_num.isnumeric() is False:\n            logging.debug(\"Failed to decode A1Z26 due to non numeric character(s)\")\n            return None\n        try:\n            for i in ctext_split:\n                val = int(i)\n                if val > 26 or val < 1:\n                    logging.debug(\n                        f\"Failed to decode A1Z26 due to invalid number '{val}'\"\n                    )\n                    return None\n                val2 = int(i) + 96\n                ctext_converted.append(chr(val2))\n            ctext_decoded = \"\".join(ctext_converted)\n            logging.info(\n                f\"A1Z26 successful, returning '{ctext_decoded}' with delimiter(s) {delimiters}\"\n            )\n            return ctext_decoded\n        except Exception:\n            return None\n\n    @staticmethod\n    def priority() -> float:\n        return 0.05\n\n    def __init__(self, config: Config):\n        super().__init__(config)\n\n    @staticmethod\n    def getParams() -> Optional[Dict[str, ParamSpec]]:\n        return None\n\n    @staticmethod\n    def getTarget() -> str:\n        return \"a1z26\"\n"
  },
  {
    "path": "ciphey/basemods/Decoders/atbash.py",
    "content": "from typing import Dict, Optional\n\nfrom ciphey.common import fix_case\nfrom ciphey.iface import Config, Decoder, ParamSpec, T, U, WordList, registry\n\n\n@registry.register\nclass Atbash(Decoder[str]):\n    def decode(self, ctext: T) -> Optional[U]:\n        \"\"\"\n        Takes an encoded string and attempts to decode it according to the Atbash cipher.\n\n        The Atbash cipher is a very simple substitution cipher without a key.\n        It operates by replacing every letter in the input by its 'counterpoint'\n        in the alphabet. Example: A -> Z, B -> Y, ... , M -> N and vice versa.\n        \"\"\"\n\n        result = \"\"\n        atbash_dict = {self.ALPHABET[i]: self.ALPHABET[::-1][i] for i in range(26)}\n\n        for letter in ctext.lower():\n            if letter in atbash_dict.keys():\n                # Match every letter of the input to its atbash counterpoint\n                result += atbash_dict[letter]\n            else:\n                # If the current character is not in the defined alphabet,\n                # just accept it as-is (useful for numbers, punctuation, etc.)\n                result += letter\n        return fix_case(result, ctext)\n\n    @staticmethod\n    def priority() -> float:\n        # Not expected to show up often, but also very fast to check.\n        return 0.1\n\n    def __init__(self, config: Config):\n        super().__init__(config)\n        self.ALPHABET = config.get_resource(self._params()[\"dict\"], WordList)\n\n    @staticmethod\n    def getParams() -> Optional[Dict[str, ParamSpec]]:\n        return {\n            \"dict\": ParamSpec(\n                desc=\"The alphabet used for the atbash operation.\",\n                req=False,\n                default=\"cipheydists::list::englishAlphabet\",\n            )\n        }\n\n    @staticmethod\n    def getTarget() -> str:\n        return \"atbash\"\n"
  },
  {
    "path": "ciphey/basemods/Decoders/base58_bitcoin.py",
    "content": "from typing import Dict, Optional\n\nimport base58\n\nfrom ciphey.iface import Config, Decoder, ParamSpec, T, U, registry\n\n\n@registry.register\nclass Base58_bitcoin(Decoder[str]):\n    def decode(self, ctext: T) -> Optional[U]:\n        \"\"\"\n        Performs Base58 (Bitcoin) decoding\n        \"\"\"\n        try:\n            return base58.b58decode(ctext).decode(\"utf-8\")\n        except Exception:\n            return None\n\n    @staticmethod\n    def priority() -> float:\n        # Not expected to show up often, but also very fast to check.\n        return 0.05\n\n    def __init__(self, config: Config):\n        super().__init__(config)\n\n    @staticmethod\n    def getParams() -> Optional[Dict[str, ParamSpec]]:\n        return None\n\n    @staticmethod\n    def getTarget() -> str:\n        return \"base58_bitcoin\"\n"
  },
  {
    "path": "ciphey/basemods/Decoders/base58_flickr.py",
    "content": "from typing import Dict, Optional\n\nimport base58\n\nfrom ciphey.iface import Config, Decoder, ParamSpec, T, U, registry\n\n\n@registry.register\nclass Base58_flickr(Decoder[str]):\n    def decode(self, ctext: T) -> Optional[U]:\n        \"\"\"\n        Performs Base58 (Flickr) decoding\n        \"\"\"\n        FLICKR_ALPHABET = b\"123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ\"\n        try:\n            return base58.b58decode(ctext, alphabet=FLICKR_ALPHABET).decode(\"utf-8\")\n        except Exception:\n            return None\n\n    @staticmethod\n    def priority() -> float:\n        # Not expected to show up often, but also very fast to check.\n        return 0.05\n\n    def __init__(self, config: Config):\n        super().__init__(config)\n\n    @staticmethod\n    def getParams() -> Optional[Dict[str, ParamSpec]]:\n        return None\n\n    @staticmethod\n    def getTarget() -> str:\n        return \"base58_flickr\"\n"
  },
  {
    "path": "ciphey/basemods/Decoders/base58_ripple.py",
    "content": "from typing import Dict, Optional\n\nimport base58\n\nfrom ciphey.iface import Config, Decoder, ParamSpec, T, U, registry\n\n\n@registry.register\nclass Base58_ripple(Decoder[str]):\n    def decode(self, ctext: T) -> Optional[U]:\n        \"\"\"\n        Performs Base58 (Ripple) decoding\n        \"\"\"\n        try:\n            return base58.b58decode(ctext, alphabet=base58.RIPPLE_ALPHABET).decode(\n                \"utf-8\"\n            )\n        except Exception:\n            return None\n\n    @staticmethod\n    def priority() -> float:\n        # Not expected to show up often, but also very fast to check.\n        return 0.05\n\n    def __init__(self, config: Config):\n        super().__init__(config)\n\n    @staticmethod\n    def getParams() -> Optional[Dict[str, ParamSpec]]:\n        return None\n\n    @staticmethod\n    def getTarget() -> str:\n        return \"base58_ripple\"\n"
  },
  {
    "path": "ciphey/basemods/Decoders/base62.py",
    "content": "from typing import Dict, Optional\n\nimport base62\n\nfrom ciphey.iface import Config, Decoder, ParamSpec, T, U, registry\n\n\n@registry.register\nclass Base62(Decoder[str]):\n    def decode(self, ctext: T) -> Optional[U]:\n        \"\"\"\n        Performs Base62 decoding\n        \"\"\"\n        try:\n            return base62.decodebytes(ctext).decode(\"utf-8\")\n        except Exception:\n            return None\n\n    @staticmethod\n    def priority() -> float:\n        # Not expected to show up often, but also very fast to check.\n        return 0.05\n\n    def __init__(self, config: Config):\n        super().__init__(config)\n\n    @staticmethod\n    def getParams() -> Optional[Dict[str, ParamSpec]]:\n        return None\n\n    @staticmethod\n    def getTarget() -> str:\n        return \"base62\"\n"
  },
  {
    "path": "ciphey/basemods/Decoders/base64_url.py",
    "content": "import base64\nfrom typing import Dict, Optional\n\nfrom ciphey.iface import Config, Decoder, ParamSpec, T, U, registry\n\n\n@registry.register\nclass Base64_url(Decoder[str]):\n    def decode(self, ctext: T) -> Optional[U]:\n        \"\"\"\n        Performs Base64 URL decoding\n        \"\"\"\n        ctext_padding = ctext + \"=\" * (4 - len(ctext) % 4)\n        try:\n            return base64.urlsafe_b64decode(ctext_padding).decode(\"utf-8\")\n        except Exception:\n            return None\n\n    @staticmethod\n    def priority() -> float:\n        # Not expected to show up often, but also very fast to check.\n        return 0.05\n\n    def __init__(self, config: Config):\n        super().__init__(config)\n\n    @staticmethod\n    def getParams() -> Optional[Dict[str, ParamSpec]]:\n        return None\n\n    @staticmethod\n    def getTarget() -> str:\n        return \"base64_url\"\n"
  },
  {
    "path": "ciphey/basemods/Decoders/base65536.py",
    "content": "from typing import Dict, Optional\n\nimport base65536\n\nfrom ciphey.iface import Config, Decoder, ParamSpec, T, U, registry\n\n\n@registry.register\nclass Base65536(Decoder[str]):\n    def decode(self, ctext: T) -> Optional[U]:\n        \"\"\"\n        Performs Base65536 decoding\n        \"\"\"\n        try:\n            return base65536.decode(ctext).decode(\"utf-8\")\n        except Exception:\n            return None\n\n    @staticmethod\n    def priority() -> float:\n        # Not expected to show up often, but also very fast to check.\n        return 0.05\n\n    def __init__(self, config: Config):\n        super().__init__(config)\n\n    @staticmethod\n    def getParams() -> Optional[Dict[str, ParamSpec]]:\n        return None\n\n    @staticmethod\n    def getTarget() -> str:\n        return \"base65536\"\n"
  },
  {
    "path": "ciphey/basemods/Decoders/base69.py",
    "content": "# Translated to Python and adapted for Ciphey from the JS original at https://github.com/pshihn/base69\n\n\nimport re\nfrom math import ceil\nfrom typing import Dict, Optional\n\nfrom ciphey.iface import Config, Decoder, ParamSpec, T, U, WordList, registry\n\n\n@registry.register\nclass Base69(Decoder[str]):\n    def decode(self, ctext: T) -> Optional[U]:\n        \"\"\"\n        Performs Base69 decoding\n        \"\"\"\n        # Remove whitespace\n        try:\n            ctext = re.sub(r\"\\s+\", \"\", ctext, flags=re.UNICODE)\n            extra_bytes = 0\n            clen = len(ctext)\n\n            if ctext[:-1] == \"=\":\n                extra_bytes = int(ctext[clen - 2])\n\n            CHUNK_COUNT = ceil(clen / 16)\n            result = [0 for _ in range(CHUNK_COUNT * 7 - extra_bytes)]\n\n            for i in range(CHUNK_COUNT):\n                chunk_string = ctext[i * 16 : (i + 1) * 16]\n                if extra_bytes and (i == CHUNK_COUNT - 1):\n                    insert = self.decode_chunk(chunk_string)\n                    for n, elem in enumerate(insert[0 : 7 - extra_bytes]):\n                        result[n + i * 7] = elem\n                else:\n                    insert = self.decode_chunk(chunk_string)\n                    for n, elem in enumerate(insert):\n                        result[n + i * 7] = elem % 256\n            return bytearray(result).decode().strip(\"\\x00\")\n        except Exception:\n            return None\n\n    def decode_chunk(self, s: str):\n        padded_bytes = s.endswith(\"=\")\n\n        decoded = [0 for _ in range(8)]\n        for i in range(8):\n            decoded[i] = (\n                0\n                if i == 7 and padded_bytes\n                else self.chars_to_byte(s[i * 2 : i * 2 + 2])\n            )\n\n        result = [0 for _ in range(7)]\n        for i in range(7):\n            t1 = decoded[i] << (i + 1)\n            t2 = decoded[i + 1] >> (7 - i - 1)\n            result[i] = t1 | t2\n        return result\n\n    def chars_to_byte(self, s: str):\n        return (69 * self.CHARS.index(s[1])) + (self.CHARS.index(s[0]))\n\n    @staticmethod\n    def priority() -> float:\n        # If this becomes lower or equal to the reverse, it breaks.\n        # So I'll set it to 0.2 for now since it is very fast anyways.\n        return 0.2\n\n    def __init__(self, config: Config):\n        super().__init__(config)\n        self.CHARS = config.get_resource(self._params()[\"dict\"], WordList)\n\n    @staticmethod\n    def getParams() -> Optional[Dict[str, ParamSpec]]:\n        return {\n            \"dict\": ParamSpec(\n                desc=\"The charset used for the decoder.\",\n                req=False,\n                default=\"cipheydists::list::base69\",\n            )\n        }\n\n    @staticmethod\n    def getTarget() -> str:\n        return \"base69\"\n"
  },
  {
    "path": "ciphey/basemods/Decoders/base91.py",
    "content": "from typing import Dict, Optional\n\nimport base91\n\nfrom ciphey.iface import Config, Decoder, ParamSpec, T, U, registry\n\n\n@registry.register\nclass Base91(Decoder[str]):\n    def decode(self, ctext: T) -> Optional[U]:\n        \"\"\"\n        Performs Base91 decoding\n        \"\"\"\n        try:\n            return base91.decode(ctext).decode(\"utf-8\")\n        except Exception:\n            return None\n\n    @staticmethod\n    def priority() -> float:\n        # Not expected to show up often, but also very fast to check.\n        return 0.05\n\n    def __init__(self, config: Config):\n        super().__init__(config)\n\n    @staticmethod\n    def getParams() -> Optional[Dict[str, ParamSpec]]:\n        return None\n\n    @staticmethod\n    def getTarget() -> str:\n        return \"base91\"\n"
  },
  {
    "path": "ciphey/basemods/Decoders/bases.py",
    "content": "import base64\nimport types\nfrom typing import Any, Callable, Optional\n\nimport logging\nfrom rich.logging import RichHandler\nimport re\n\nfrom ciphey.common import id_lambda\nfrom ciphey.iface import Decoder, registry\n\n\ndef _dispatch(self: Any, ctext: str, func: Callable[[str], bytes]) -> Optional[bytes]:\n    logging.debug(f\"Attempting {self.getTarget()}\")\n\n    try:\n        # remove all whitespace\n        ctext = re.sub(r\"\\s+\", \"\", ctext, re.UNICODE)\n        result = func(ctext)\n        logging.info(f\"{self.getTarget()} successful, returning {result}\")\n        return result\n    except ValueError:\n        logging.debug(f\"Failed to decode {self.getTarget()}\")\n        return None\n\n\n_bases = {\n    \"base16\": (base64.b16decode, 0.4),\n    \"base32\": (base64.b32decode, 0.01),\n    \"base64\": (base64.b64decode, 0.4),\n    \"base85\": (base64.b85decode, 0.01),\n    \"ascii85\": (base64.a85decode, 0.1),\n}\n\n\ndef gen_class(name, decoder, priority, ns):\n    ns[\"_get_func\"] = id_lambda(decoder)\n    ns[\"decode\"] = lambda self, ctext: _dispatch(self, ctext, self._get_func())\n    ns[\"getParams\"] = id_lambda(None)\n    ns[\"getTarget\"] = id_lambda(name)\n    ns[\"priority\"] = id_lambda(priority)\n    ns[\"__init__\"] = lambda self, config: super(type(self), self).__init__(config)\n\n\nfor name, (decoder, priority) in _bases.items():\n    t = types.new_class(\n        name,\n        (Decoder[str],),\n        exec_body=lambda x: gen_class(name, decoder, priority, x),\n    )\n\n    registry.register(t)\n"
  },
  {
    "path": "ciphey/basemods/Decoders/baudot.py",
    "content": "import re\nfrom typing import Dict, Optional\n\nfrom ciphey.iface import Config, Decoder, ParamSpec, T, Translation, U, registry\n\n\n@registry.register\nclass Baudot(Decoder[str]):\n    def decode(self, ctext: T) -> Optional[U]:\n        result = \"\"\n        switch_to_digit_map = 0\n        if re.search(\"^[01]{5}$\", ctext.split()[0]):\n            for i in ctext.split():\n                if i == \"11011\":\n                    switch_to_digit_map = 1\n                if i == \"11111\":\n                    switch_to_digit_map = 0\n                if switch_to_digit_map == 1:\n                    result += self.BAUDOT_DICT[\"+\" + i]\n                if switch_to_digit_map == 0:\n                    result += self.BAUDOT_DICT[i]\n            return result\n        else:\n            return None\n\n    @staticmethod\n    def priority() -> float:\n        return 0.05\n\n    def __init__(self, config: Config):\n        super().__init__(config)\n        self.BAUDOT_DICT = config.get_resource(self._params()[\"dict\"], Translation)\n\n    @staticmethod\n    def getParams() -> Optional[Dict[str, ParamSpec]]:\n        return {\n            \"dict\": ParamSpec(\n                desc=\"The baudot alphabet dictionary to use\",\n                req=False,\n                default=\"cipheydists::translate::baudot\",\n            )\n        }\n\n    @staticmethod\n    def getTarget() -> str:\n        return \"baudot\"\n"
  },
  {
    "path": "ciphey/basemods/Decoders/binary.py",
    "content": "import re\nfrom typing import Dict, List, Optional\n\nimport logging\nfrom rich.logging import RichHandler\n\nfrom ciphey.iface import Config, Decoder, ParamSpec, T, U, registry\n\n\n@registry.register\nclass Binary(Decoder[str]):\n    def decode(self, ctext: T) -> Optional[U]:\n        try:\n            ctext = re.sub(r\"[^\\S \\n]\", \" \", ctext, flags=re.UNICODE)\n            ctext = ctext.replace(\"\\n\", \" \")\n\n            existing_split = self.try_split(ctext.split(\" \"))\n            if existing_split is not None:\n                return existing_split\n\n            # Now we try our own grouping\n\n            # Remove final bit of whitespace\n            ctext = ctext.replace(\" \", \"\")\n            # Split into bytes, and test\n            return self.try_split([ctext[i : i + 8] for i in range(0, len(ctext), 8)])\n        # Catch bad octal chars\n        except ValueError:\n            return None\n\n    def try_split(self, split_text: List[str]):\n        ret = []\n\n        for i in split_text:\n            if len(i) == 0:\n                continue\n            val = int(i, 2)\n            if val > 255 or val < 0:\n                return None\n            ret.append(val)\n\n        if len(ret) != 0:\n            ret = bytes(ret)\n            logging.info(f\"binary successful, returning {ret.__repr__()}\")\n            return ret\n\n    @staticmethod\n    def priority() -> float:\n        return 0.3\n\n    def __init__(self, config: Config):\n        super().__init__(config)\n\n    @staticmethod\n    def getParams() -> Optional[Dict[str, ParamSpec]]:\n        return None\n\n    @staticmethod\n    def getTarget() -> str:\n        return \"binary\"\n"
  },
  {
    "path": "ciphey/basemods/Decoders/braille.py",
    "content": "import re\nfrom typing import Dict, Optional\n\nfrom ciphey.iface import Config, Decoder, ParamSpec, T, Translation, U, registry\nimport logging\nfrom rich.logging import RichHandler\n\n\n@registry.register\nclass Braille(Decoder[str]):\n    def decode(self, ctext: T) -> Optional[U]:\n        \"\"\"\n        Performs Braille decoding\n        \"\"\"\n        logging.debug(\"Attempting Braille\")\n        ctext_decoded = \"\"\n        braille_matches = 0\n        for symbol in self.BRAILLE_DICT_INV.values():\n            if symbol in ctext:\n                braille_matches += 1\n            else:\n                continue\n        if braille_matches == 0:\n            logging.debug(\"Failed to decode Braille due to invalid characters\")\n            return None\n\n        for pattern, value in self.BRAILLE_DICT.items():\n            ctext = re.sub(pattern, value, ctext)\n\n        wordArr = []\n        for word in ctext.split(\" \"):\n            # If two commas are in front of a word, uppercase the word and remove the comma\n            if word[:2].find(\",,\") != -1:\n                wordArr.append(word.replace(\",,\", \"\").upper())\n            else:\n                wordArr.append(word)\n\n        result = []\n        for word in wordArr:\n            # If one comma is in front of a word, capitalize the word and remove the comma\n            if word[0].find(\",\") != -1:\n                result.append(word.replace(\",\", \"\").capitalize())\n            else:\n                result.append(word)\n        ctext_decoded = \" \".join(result)\n        logging.info(f\"Braille successful, returning '{ctext_decoded}'\")\n        return ctext_decoded\n\n    @staticmethod\n    def priority() -> float:\n        return 0.05\n\n    def __init__(self, config: Config):\n        super().__init__(config)\n        self.BRAILLE_DICT = config.get_resource(self._params()[\"dict\"], Translation)\n        self.BRAILLE_DICT_INV = {v: k for k, v in self.BRAILLE_DICT.items()}\n\n    @staticmethod\n    def getParams() -> Optional[Dict[str, ParamSpec]]:\n        return {\n            \"dict\": ParamSpec(\n                desc=\"The Braille dictionary to use\",\n                req=False,\n                default=\"cipheydists::translate::braille\",\n            )\n        }\n\n    @staticmethod\n    def getTarget() -> str:\n        return \"braille\"\n"
  },
  {
    "path": "ciphey/basemods/Decoders/brainfuck.py",
    "content": "import re\nimport time\nfrom typing import Dict, Optional, Tuple\n\nimport logging\nfrom rich.logging import RichHandler\n\nfrom ciphey.iface import Config, Decoder, ParamSpec, T, U, WordList, registry\n\n\n@registry.register\nclass Brainfuck(Decoder[str]):\n    def decode(self, ctext: T) -> Optional[U]:\n        \"\"\"\n        Takes a ciphertext and treats it as a Brainfuck program,\n        interpreting it and saving the output as a string to return.\n\n        Brainfuck is a very simple, Turing-complete esoteric language.\n        Below is a simplified interpreter that attempts to check whether a\n        given ciphertext is a brainfuck program that would output a string.\n\n        A program that can be \"decoded\" like this is one that:\n            * Does not require user input (\",\" instruction)\n            * Includes at least one putchar instruction (\".\")\n            * Does not contain anything but the main 7 instructions,\n                (excluding \",\") and whitespace\n\n        Details:\n            * This implementation wraps the memory pointer for \">\" and \"<\"\n            * It is time-limited to 60 seconds, to prevent hangups\n            * The program starts with 100 memory cells, chosen arbitrarily\n        \"\"\"\n\n        logging.debug(\"Attempting brainfuck\")\n\n        result = \"\"\n        memory = [0] * 100\n        codeptr, memptr = 0, 0  # Instruction pointer and stack pointer\n        timelimit = 60  # The timeout in seconds\n\n        bracemap, isbf = self.bracemap_and_check(ctext)\n\n        # If it doesn't appear to be valid brainfuck code\n        if not isbf:\n            logging.debug(\"Failed to interpret brainfuck due to invalid characters\")\n            return None\n\n        # Get start time\n        start = time.time()\n\n        while codeptr < len(ctext):\n\n            current = time.time()\n\n            # Return none if we've been running for over a minute\n            if current - start > timelimit:\n                logging.debug(\"Failed to interpret brainfuck due to timing out\")\n                return None\n\n            cmd = ctext[codeptr]\n\n            if cmd == \"+\":\n                if memory[memptr] < 255:\n                    memory[memptr] = memory[memptr] + 1\n                else:\n                    memory[memptr] = 0\n\n            elif cmd == \"-\":\n                if memory[memptr] > 0:\n                    memory[memptr] = memory[memptr] - 1\n                else:\n                    memory[memptr] = 255\n\n            elif cmd == \">\":\n                if memptr == len(memory) - 1:\n                    memory.append(0)\n                memptr += 1\n\n            elif cmd == \"<\":\n                if memptr == 0:\n                    memptr = len(memory) - 1\n                else:\n                    memptr -= 1\n\n            # If we're at the beginning of the loop and the memory is 0, exit the loop\n            elif cmd == \"[\" and memory[memptr] == 0:\n                codeptr = bracemap[codeptr]\n\n            # If we're at the end of the loop and the memory is >0, jmp to the beginning of the loop\n            elif cmd == \"]\" and memory[memptr]:\n                codeptr = bracemap[codeptr]\n\n            # Store the output as a string instead of printing it out\n            elif cmd == \".\":\n                result += chr(memory[memptr])\n\n            codeptr += 1\n\n        logging.info(f\"Brainfuck successful, returning '{result}'\")\n        return result\n\n    def bracemap_and_check(self, program: str) -> Tuple[Optional[Dict], bool]:\n        \"\"\"\n        Create a bracemap of brackets in the program, to compute jmps.\n        Maps open -> close brackets as well as close -> open brackets.\n\n        Also returns True if the program is valid Brainfuck code. If False, we\n        won't even try to run it.\n        \"\"\"\n\n        open_stack = []\n        bracemap = dict()\n        legal_instructions = {\"+\", \"-\", \">\", \"<\", \"[\", \"]\", \".\"}\n        legal_count = 0\n\n        # If the program actually outputs anything (contains \".\")\n        prints = False\n\n        for idx, instruction in enumerate(program):\n            # If instruction is brainfuck (without input) or whitespace, it counts\n            if instruction in legal_instructions or re.match(r\"\\s\", instruction):\n                legal_count += 1\n\n            if not prints and instruction == \".\":\n                # If there are no \".\" instructions then this program will not output anything\n                prints = True\n\n            elif instruction == \"[\":\n                open_stack.append(idx)\n\n            elif instruction == \"]\":\n                try:\n                    opbracket = open_stack.pop()\n                    bracemap[opbracket] = idx\n                    bracemap[idx] = opbracket\n                except IndexError:\n                    # Mismatched braces, not a valid program\n                    # Closing braces > opening braces\n                    return (None, False)\n\n        # 1. All characters are instructions or whitespace\n        # 2. There are no extra open braces\n        # 3. There is at least one character to be \"printed\"\n        # (result is >=1 in length)\n        is_brainfuck = legal_count == len(program) and len(open_stack) == 0 and prints\n\n        return bracemap, is_brainfuck\n\n    @staticmethod\n    def priority() -> float:\n        # Not uncommon, but not very common either. It's also slow.\n        return 0.08\n\n    def __init__(self, config: Config):\n        super().__init__(config)\n        self.ALPHABET = config.get_resource(self._params()[\"dict\"], WordList)\n\n    @staticmethod\n    def getParams() -> Optional[Dict[str, ParamSpec]]:\n        return {\n            \"dict\": ParamSpec(\n                desc=\"Brainfuck alphabet (default English)\",\n                req=False,\n                default=\"cipheydists::list::englishAlphabet\",\n            )\n        }\n\n    @staticmethod\n    def getTarget() -> str:\n        return \"brainfuck\"\n"
  },
  {
    "path": "ciphey/basemods/Decoders/decimal.py",
    "content": "import re\nfrom typing import Dict, Optional\n\nimport logging\nfrom rich.logging import RichHandler\n\nfrom ciphey.iface import Config, Decoder, ParamSpec, T, U, registry\n\n\n@registry.register\nclass Decimal(Decoder[str]):\n    def decode(self, ctext: T) -> Optional[U]:\n        \"\"\"\n        Performs Decimal decoding\n        \"\"\"\n        logging.debug(\"Attempting decimal\")\n        ctext_converted = []\n        ctext_split = re.split(r\"[ ,;:\\-\\n]\", ctext)\n        delimiters = set(sorted(re.sub(r\"[^ ,;:\\-\\n]\", \"\", ctext)))\n        ctext_num = re.sub(r\"[,;:\\-\\s]\", \"\", ctext)\n        ctext_decoded = \"\"\n        if ctext_num.isnumeric() is False:\n            logging.debug(\"Failed to decode decimal due to non numeric character(s)\")\n            return None\n        try:\n            for i in ctext_split:\n                val = int(i)\n                if val > 255 or val < 0:\n                    logging.debug(\n                        f\"Failed to decode decimal due to invalid number '{val}'\"\n                    )\n                    return None\n                ctext_converted.append(chr(val))\n            ctext_decoded = \"\".join(ctext_converted)\n            logging.info(\n                f\"Decimal successful, returning '{ctext_decoded}' with delimiter(s) {delimiters}\"\n            )\n            return ctext_decoded\n        except Exception:\n            return None\n\n    @staticmethod\n    def priority() -> float:\n        return 0.05\n\n    def __init__(self, config: Config):\n        super().__init__(config)\n\n    @staticmethod\n    def getParams() -> Optional[Dict[str, ParamSpec]]:\n        return None\n\n    @staticmethod\n    def getTarget() -> str:\n        return \"decimal\"\n"
  },
  {
    "path": "ciphey/basemods/Decoders/dna.py",
    "content": "import re\nfrom typing import Dict, Optional\n\nimport logging\nfrom rich.logging import RichHandler\n\nfrom ciphey.iface import Config, Decoder, ParamSpec, T, Translation, U, registry\n\n\n@registry.register\nclass Dna(Decoder[str]):\n    def decode(self, ctext: T) -> Optional[U]:\n        \"\"\"\n        Performs DNA decoding\n        \"\"\"\n        logging.debug(\"Attempting DNA decoder\")\n        ctext_decoded = \"\"\n        ctext = re.sub(r\"[,;:\\-\\s]\", \"\", ctext)\n        ctext = \" \".join(ctext[i : i + 3] for i in range(0, len(ctext), 3))\n        ctext_split = ctext.split(\" \")\n        dna_keys = self.DNA_DICT.keys()\n\n        for i in ctext_split:\n            if i in dna_keys:\n                ctext_decoded += self.DNA_DICT[i]\n            else:\n                return None\n        logging.info(f\"DNA successful, returning '{ctext_decoded}'\")\n        return ctext_decoded\n\n    @staticmethod\n    def priority() -> float:\n        return 0.2\n\n    def __init__(self, config: Config):\n        super().__init__(config)\n        self.DNA_DICT = config.get_resource(self._params()[\"dict\"], Translation)\n\n    @staticmethod\n    def getParams() -> Optional[Dict[str, ParamSpec]]:\n        return {\n            \"dict\": ParamSpec(\n                desc=\"The DNA alphabet dictionary to use\",\n                req=False,\n                default=\"cipheydists::translate::dna\",\n            )\n        }\n\n    @staticmethod\n    def getTarget() -> str:\n        return \"dna\"\n"
  },
  {
    "path": "ciphey/basemods/Decoders/dtmf.py",
    "content": "import re\nfrom typing import Dict, Optional\n\nimport logging\nfrom rich.logging import RichHandler\n\nfrom ciphey.iface import Config, Decoder, ParamSpec, T, Translation, U, registry\n\n\n@registry.register\nclass Dtmf(Decoder[str]):\n    def decode(self, ctext: T) -> Optional[U]:\n        \"\"\"\n        Performs DTMF decoding\n        \"\"\"\n        logging.debug(\"Attempting DTMF decoder\")\n        ctext_decoded = \"\"\n        ctext = re.sub(r\"[,;:\\-\\/\\s]\", \"\", ctext)\n        ctext = \" \".join(ctext[i : i + 7] for i in range(0, len(ctext), 7))\n        ctext_split = ctext.split(\" \")\n        dtmf_keys = self.DTMF_DICT.keys()\n\n        for i in ctext_split:\n            if i in dtmf_keys:\n                ctext_decoded += self.DTMF_DICT[i]\n            else:\n                return None\n        logging.info(f\"DTMF successful, returning '{ctext_decoded}'\")\n        return ctext_decoded\n\n    @staticmethod\n    def priority() -> float:\n        return 0.2\n\n    def __init__(self, config: Config):\n        super().__init__(config)\n        self.DTMF_DICT = config.get_resource(self._params()[\"dict\"], Translation)\n\n    @staticmethod\n    def getParams() -> Optional[Dict[str, ParamSpec]]:\n        return {\n            \"dict\": ParamSpec(\n                desc=\"The DTMF alphabet dictionary to use\",\n                req=False,\n                default=\"cipheydists::translate::dtmf\",\n            )\n        }\n\n    @staticmethod\n    def getTarget() -> str:\n        return \"dtmf\"\n"
  },
  {
    "path": "ciphey/basemods/Decoders/galactic.py",
    "content": "from typing import Dict, Optional\n\nimport logging\nfrom rich.logging import RichHandler\n\nfrom ciphey.iface import Config, Decoder, ParamSpec, T, Translation, U, registry\n\n\n@registry.register\nclass Galactic(Decoder[str]):\n    def decode(self, ctext: T) -> Optional[U]:\n        \"\"\"\n        Takes a string written in the 'Standard Galactic Alphabet'\n        (aka Minecraft Enchanting Table Symbols) and translates it to ASCII text.\n        \"\"\"\n        logging.debug(\"Attempting Standard Galactic Alphabet decoder\")\n\n        # To avoid complications, only move forward with the decoding if we can\n        # reasonably assume that the input string is written in the galactic alphabet\n        galactic_matches = 0\n        for symbol in self.GALACTIC_DICT.keys():\n            # These symbols are assumed to be frequent enough in regular\n            # text to be skipped when counting the matches. All others are counted.\n            if symbol in ctext and symbol not in [\"!\", \"|\"]:\n                galactic_matches += 1\n            else:\n                continue\n        if galactic_matches == 0:\n            logging.debug(\n                \"No matching galactic alphabet letters found. Skipping galactic decoder\"\n            )\n            return None\n        logging.debug(f\"{galactic_matches} galactic alphabet letters found. \")\n\n        result = \"\"\n        # Take out the problematic characters consisting of multiple symbols\n        ctext = (\n            ctext.replace(\"||\", \"|\")\n            .replace(\"/\", \"\")\n            .replace(\"¡\", \"\")\n            .replace(\" ̣ \", \"\")\n            .replace(\"̇\", \"x\")\n        )\n        logging.debug(f\"Modified string is {ctext}\")\n\n        for letter in ctext:\n            if letter in self.GALACTIC_DICT.keys():\n                # Match every letter of the input to its galactic counterpoint\n                result += self.GALACTIC_DICT[letter]\n            else:\n                # If the current character is not in the defined alphabet,\n                # just accept it as-is (useful for numbers, punctuation, etc.)\n                result += letter\n        # Remove the trailing space (appearing as a leading space)\n        # from the x that results from the diacritic replacement\n        result = result.replace(\"x \", \"x\")\n        logging.debug(f\"Decoded string is {result}\")\n        return result\n\n    @staticmethod\n    def priority() -> float:\n        # Not expected to show up often, but also very fast to check.\n        return 0.01\n\n    def __init__(self, config: Config):\n        super().__init__(config)\n        self.GALACTIC_DICT = config.get_resource(self._params()[\"dict\"], Translation)\n\n    @staticmethod\n    def getParams() -> Optional[Dict[str, ParamSpec]]:\n        return {\n            \"dict\": ParamSpec(\n                desc=\"The galactic alphabet dictionary to use\",\n                req=False,\n                default=\"cipheydists::translate::galactic\",\n            )\n        }\n\n    @staticmethod\n    def getTarget() -> str:\n        return \"galactic\"\n"
  },
  {
    "path": "ciphey/basemods/Decoders/gzip.py",
    "content": "import zlib\nfrom typing import Dict, Optional\n\nfrom ciphey.iface import Config, Decoder, ParamSpec, T, U, registry\n\n\n@registry.register\nclass Gzip(Decoder[bytes]):\n    def decode(self, ctext: T) -> Optional[U]:\n        \"\"\"\n        Performs Gzip decoding\n        \"\"\"\n        try:\n            return zlib.decompress(ctext, 16 + zlib.MAX_WBITS).decode(\"utf-8\")\n        except Exception:\n            return None\n\n    @staticmethod\n    def priority() -> float:\n        # Not expected to show up often, but also very fast to check.\n        return 0.05\n\n    def __init__(self, config: Config):\n        super().__init__(config)\n\n    @staticmethod\n    def getParams() -> Optional[Dict[str, ParamSpec]]:\n        return None\n\n    @staticmethod\n    def getTarget() -> str:\n        return \"gzip\"\n"
  },
  {
    "path": "ciphey/basemods/Decoders/hexadecimal.py",
    "content": "from typing import Dict, Optional\n\nfrom ciphey.iface import Config, Decoder, ParamSpec, T, U, registry\n\n\n@registry.register\nclass Hexadecimal(Decoder[str]):\n    def decode(self, ctext: T) -> Optional[U]:\n        \"\"\"\n        Performs Hexadecimal decoding\n        \"\"\"\n        ctext_decoded = \"\"\n        try:\n            ctext_decoded = bytearray.fromhex(ctext).decode(\"utf-8\")\n            return ctext_decoded\n        except Exception:\n            return None\n\n    @staticmethod\n    def priority() -> float:\n        return 0.015\n\n    def __init__(self, config: Config):\n        super().__init__(config)\n\n    @staticmethod\n    def getParams() -> Optional[Dict[str, ParamSpec]]:\n        return None\n\n    @staticmethod\n    def getTarget() -> str:\n        return \"hexadecimal\"\n"
  },
  {
    "path": "ciphey/basemods/Decoders/leetspeak.py",
    "content": "from typing import Dict, Optional\n\nfrom ciphey.iface import Config, Decoder, ParamSpec, T, Translation, U, registry\n\n\n@registry.register\nclass Leetspeak(Decoder[str]):\n    def decode(self, ctext: T) -> Optional[U]:\n        for src, dst in self.translate.items():\n            ctext = ctext.replace(src, dst)\n        return ctext\n\n    @staticmethod\n    def priority() -> float:\n        return 0.05\n\n    def __init__(self, config: Config):\n        super().__init__(config)\n        self.translate = config.get_resource(self._params()[\"dict\"], Translation)\n\n    @staticmethod\n    def getParams() -> Optional[Dict[str, ParamSpec]]:\n        return {\n            \"dict\": ParamSpec(\n                desc=\"The leetspeak dictionary to use\",\n                req=False,\n                default=\"cipheydists::translate::leet\",\n            )\n        }\n\n    @staticmethod\n    def getTarget() -> str:\n        return \"leetspeak\"\n"
  },
  {
    "path": "ciphey/basemods/Decoders/letters.archive",
    "content": "\"\"\"\nNot yet implemented.\n\"\"\"\nclass letters:\n\n    \"\"\"Deals with Nato Strings / first letter of every word\"\"\"\n\n    def __init__(self):\n        None\n\n    def __name__(self):\n        return \"Letters\"\n\n    def decrypt(self, text: str) -> dict:\n        return text\n\n    def first_letter_every_word(self, text):\n        \"\"\"\n        This should be supplied a string like \"hello my name is\"\n        \"\"\"\n\n        text = text.split(\".\")\n\n        new_text = []\n        for sentence in text:\n            for word in sentence.split(\" \"):\n                new_text.append(word[0])\n            # Applies a space after every sentence\n            # which might be every word\n            new_text.append(\" \")\n"
  },
  {
    "path": "ciphey/basemods/Decoders/morse_code.py",
    "content": "from typing import Dict, Optional\n\nimport logging\nfrom rich.logging import RichHandler\n\nfrom ciphey.iface import Config, Decoder, ParamSpec, T, Translation, U, registry\n\n\n@registry.register\nclass Morse_code(Decoder[str]):\n    # A priority list for char/word boundaries\n    BOUNDARIES = {\" \": 1, \"/\": 2, \"\\n\": 3}\n    PURGE = {ord(c): None for c in BOUNDARIES.keys()}\n    MAX_PRIORITY = 3\n    ALLOWED = {\".\", \"-\", \" \", \"/\", \"\\n\"}\n    MORSE_CODE_DICT: Dict[str, str]\n    MORSE_CODE_DICT_INV: Dict[str, str]\n\n    def decode(self, ctext: T) -> Optional[U]:\n        logging.debug(\"Attempting Morse code decoder\")\n\n        char_boundary = word_boundary = None\n\n        char_boundary = word_boundary = None\n        char_priority = word_priority = 0\n        # Custom loop allows early break\n        for i in ctext:\n            i_priority = self.BOUNDARIES.get(i)\n            if i_priority is None:\n                if i in self.ALLOWED:\n                    continue\n                logging.debug(f\"Non-morse char '{i}' found\")\n                return None\n\n            if i_priority <= char_priority or i == char_boundary or i == word_boundary:\n                continue\n            # Default to having a char boundary over a word boundary\n            if (\n                i_priority > word_priority\n                and word_boundary is None\n                and char_boundary is not None\n            ):\n                word_priority = i_priority\n                word_boundary = i\n                continue\n            char_priority = i_priority\n            char_boundary = i\n\n        logging.debug(\n            f\"Char boundary is unicode {ord(char_boundary)}, and word boundary is unicode {ord(word_boundary) if word_boundary is not None else None}\"\n        )\n\n        result = \"\"\n\n        for word in ctext.split(word_boundary) if word_boundary else [ctext]:\n            logging.debug(f\"Attempting to decode word {word}\")\n            for char in word.split(char_boundary):\n                char = char.translate(self.PURGE)\n                if len(char) == 0:\n                    continue\n                try:\n                    m = self.MORSE_CODE_DICT_INV[char]\n                except KeyError:\n                    logging.debug(f\"Invalid codeword '{char}' found\")\n                    return None\n                result = result + m\n            # after every word add a space\n            result = result + \" \"\n        if len(result) == 0:\n            logging.debug(\"Morse code failed to match\")\n            return None\n        # Remove trailing space\n        result = result[:-1]\n        logging.info(f\"Morse code successful, returning {result}\")\n        return result.strip().upper()\n\n    @staticmethod\n    def priority() -> float:\n        return 0.05\n\n    def __init__(self, config: Config):\n        super().__init__(config)\n        self.MORSE_CODE_DICT = config.get_resource(self._params()[\"dict\"], Translation)\n        self.MORSE_CODE_DICT_INV = {v: k for k, v in self.MORSE_CODE_DICT.items()}\n\n    @staticmethod\n    def getParams() -> Optional[Dict[str, ParamSpec]]:\n        return {\n            \"dict\": ParamSpec(\n                desc=\"The morse code dictionary to use\",\n                req=False,\n                default=\"cipheydists::translate::morse\",\n            )\n        }\n\n    @staticmethod\n    def getTarget() -> str:\n        return \"morse_code\"\n"
  },
  {
    "path": "ciphey/basemods/Decoders/multi_tap.py",
    "content": "from typing import Dict, Optional\n\nfrom ciphey.iface import Config, Decoder, ParamSpec, T, U, registry\n\n\n@registry.register\nclass Multi_tap(Decoder[str]):\n    def decode(self, ctext: T) -> Optional[U]:\n        result = \"\"\n        for x in ctext.split():\n            if x == self.SPACE_DIGIT:  # Check if it's a space\n                result += \" \"\n            elif not Multi_tap.valid_code_part(x):\n                return None\n            else:\n                result += self.decode_num_to_char(x)\n\n        return result\n\n    @staticmethod\n    def valid_code_part(code: str) -> bool:\n        if not code.isdigit():\n            return False\n\n        # if not all the digits are the same\n        if not Multi_tap.is_all_dup(code):\n            return False\n\n        if int(code[0]) not in range(2, 10):\n            return False\n\n        if len(code) > 4:\n            return False\n\n        return True\n\n    @staticmethod\n    def decode_num_to_char(number: str) -> str:\n        index = Multi_tap.calculate_index(number)\n        return Multi_tap.number_index_to_char(index)\n\n    @staticmethod\n    def is_all_dup(code):\n        return len(set(code)) == 1\n\n    @staticmethod\n    def calculate_index(number: str) -> int:\n        first_number_as_int = int(number[0])\n\n        number_index = Multi_tap.get_index_from_first_digit(first_number_as_int)\n\n        # Add to index the number of the char : \"22\" -> index += 1\n        num_rest_numbers = len(number) - 1\n        number_index += num_rest_numbers\n\n        return number_index\n\n    @staticmethod\n    def number_index_to_char(index_number: int) -> str:\n        start_ascii_value = ord(\"A\")\n        return chr(start_ascii_value + index_number)\n\n    @staticmethod\n    def get_index_from_first_digit(first_digit: int) -> int:\n        number_index = 0\n        if first_digit >= 8:  # s have 4 chars\n            number_index += 1\n\n        first_digit -= 2  # start in 200\n\n        number_index += first_digit * 3  # jump 3 every time\n\n        return number_index\n\n    @staticmethod\n    def priority() -> float:\n        return 0.05\n\n    def __init__(self, config: Config):\n        super().__init__(config)\n        self.SPACE_DIGIT = \"0\"\n\n    @staticmethod\n    def getParams() -> Optional[Dict[str, ParamSpec]]:\n        return None\n\n    @staticmethod\n    def getTarget() -> str:\n        return \"multi_tap\"\n"
  },
  {
    "path": "ciphey/basemods/Decoders/octal.py",
    "content": "from typing import Dict, Optional\n\nimport logging\nfrom rich.logging import RichHandler\n\nfrom ciphey.iface import Config, Decoder, ParamSpec, T, U, registry\n\n\n@registry.register\nclass Octal(Decoder[str]):\n    def decode(self, ctext: T) -> Optional[U]:\n        \"\"\"\n        Performs Octal decoding\n        \"\"\"\n        str_converted = []\n        octal_seq = ctext.split(\" \")\n        if len(octal_seq) == 1:\n            # Concatted octal must be formed of octal triplets\n            if len(ctext) % 3 != 0:\n                return None\n            octal_seq = [ctext[i : i + 3] for i in range(0, len(ctext), 3)]\n            logging.debug(f\"Trying chunked octal {octal_seq}\")\n        try:\n            for octal_char in octal_seq:\n                if len(octal_char) > 3:\n                    logging.debug(\"Octal subseq too long\")\n                    return None\n                n = int(octal_char, 8)\n                if (\n                    n < 0\n                ):  # n cannot be greater than 255, as we checked that with the earlier length check\n                    logging.debug(f\"Non octal char {octal_char}\")\n                    return None\n                str_converted.append(n)\n\n            return bytes(str_converted)\n        # Catch bad octal chars\n        except ValueError:\n            return None\n\n    @staticmethod\n    def priority() -> float:\n        return 0.025\n\n    def __init__(self, config: Config):\n        super().__init__(config)\n\n    @staticmethod\n    def getParams() -> Optional[Dict[str, ParamSpec]]:\n        return None\n\n    @staticmethod\n    def getTarget() -> str:\n        return \"octal\"\n"
  },
  {
    "path": "ciphey/basemods/Decoders/reverse.py",
    "content": "from typing import Dict, Optional\n\nfrom ciphey.iface import Config, Decoder, ParamSpec, T, U, registry\n\n\n@registry.register\nclass Reverse(Decoder[str]):\n    def decode(self, ctext: T) -> Optional[U]:\n        return ctext[::-1]\n\n    @staticmethod\n    def priority() -> float:\n        return 0.05\n\n    def __init__(self, config: Config):\n        super().__init__(config)\n\n    @staticmethod\n    def getParams() -> Optional[Dict[str, ParamSpec]]:\n        return None\n\n    @staticmethod\n    def getTarget() -> str:\n        return \"reverse\"\n"
  },
  {
    "path": "ciphey/basemods/Decoders/tap_code.py",
    "content": "# by https://github.com/RustyDucky and https://github.com/lukasgabriel\n\nfrom typing import Dict, Optional\n\nfrom ciphey.iface import Config, Decoder, ParamSpec, T, Translation, U, registry\n\n\n@registry.register\nclass Tap_code(Decoder[str]):\n    def decode(self, ctext: T) -> Optional[U]:\n        \"\"\"\n        Performs Tap code decoding\n        \"\"\"\n        try:\n            result = \"\"\n            combinations = ctext.split(\" \")\n            for fragment in combinations:\n                result += self.TABLE.get(fragment)\n            return result\n        except Exception:\n            return None\n\n    @staticmethod\n    def priority() -> float:\n        return 0.06\n\n    def __init__(self, config: Config):\n        super().__init__(config)\n        self.TABLE = config.get_resource(self._params()[\"dict\"], Translation)\n\n    @staticmethod\n    def getParams() -> Optional[Dict[str, ParamSpec]]:\n        return {\n            \"dict\": ParamSpec(\n                desc=\"The table of letters used for the tap code interpretation.\",\n                req=False,\n                default=\"cipheydists::translate::tap_code\",\n            )\n        }\n\n    @staticmethod\n    def getTarget() -> str:\n        return \"tap_code\"\n"
  },
  {
    "path": "ciphey/basemods/Decoders/unicode.py",
    "content": "from typing import Dict, Optional\n\nimport logging\nfrom rich.logging import RichHandler\n\nfrom ciphey.iface import Config, Decoder, ParamSpec, T, U, registry\n\n\n@registry.register\nclass Utf8(Decoder[bytes]):\n    def decode(self, ctext: T) -> Optional[U]:\n        \"\"\"\n        Performs UTF-8 decoding\n        \"\"\"\n        logging.debug(\"Attempting UTF-8 decoder\")\n        result = \"\"\n        try:\n            result = ctext.decode(\"utf-8\")\n            if result != ctext:\n                logging.info(f\"UTF-8 successful, returning '{result}'\")\n                return result\n            else:\n                return None\n        except Exception:\n            return None\n\n    @staticmethod\n    def priority() -> float:\n        return 0.9\n\n    def __init__(self, config: Config):\n        super().__init__(config)\n\n    @staticmethod\n    def getParams() -> Optional[Dict[str, ParamSpec]]:\n        return None\n\n    @staticmethod\n    def getTarget() -> str:\n        return \"utf8\"\n"
  },
  {
    "path": "ciphey/basemods/Decoders/url.py",
    "content": "from typing import Dict, Optional\nfrom urllib.parse import unquote_plus\n\nimport logging\nfrom rich.logging import RichHandler\n\nfrom ciphey.iface import Config, Decoder, ParamSpec, T, U, registry\n\n\n@registry.register\nclass Url(Decoder[str]):\n    def decode(self, ctext: T) -> Optional[U]:\n        \"\"\"\n        Performs URL decoding\n        \"\"\"\n        logging.debug(\"Attempting URL\")\n        result = \"\"\n        try:\n            result = unquote_plus(ctext, errors=\"strict\")\n            if result != ctext:\n                logging.info(f\"URL successful, returning '{result}'\")\n                return result\n            else:\n                return None\n        except Exception:\n            logging.debug(\"Failed to decode URL\")\n            return None\n\n    @staticmethod\n    def priority() -> float:\n        return 0.05\n\n    def __init__(self, config: Config):\n        super().__init__(config)\n\n    @staticmethod\n    def getParams() -> Optional[Dict[str, ParamSpec]]:\n        return None\n\n    @staticmethod\n    def getTarget() -> str:\n        return \"url\"\n"
  },
  {
    "path": "ciphey/basemods/Decoders/uuencode.py",
    "content": "from binascii import a2b_uu\nfrom codecs import decode\nfrom typing import Dict, Optional\n\nimport logging\nfrom rich.logging import RichHandler\n\nfrom ciphey.iface import Config, Decoder, ParamSpec, T, U, registry\n\n\n@registry.register\nclass Uuencode(Decoder[str]):\n    def decode(self, ctext: T) -> Optional[U]:\n        \"\"\"\n        UUEncode (Unix to Unix Encoding) is a symmetric encryption\n        based on conversion of binary data (split into 6-bit blocks) into ASCII characters.\n\n        This function decodes the input string 'ctext' if it has been encoded using 'uuencoder'\n        It will return None otherwise\n        \"\"\"\n        logging.debug(\"Attempting UUencode\")\n        result = \"\"\n        try:\n            # UUencoded messages may begin with prefix \"begin\" and end with suffix \"end\"\n            # In that case, we use the codecs module in Python\n            ctext_strip = ctext.strip()\n            if ctext_strip.startswith(\"begin\") and ctext_strip.endswith(\"end\"):\n                result = decode(bytes(ctext, \"utf-8\"), \"uu\").decode()\n            else:\n                # If there isn't a \"being\" prefix and \"end\" suffix, we use the binascii module instead\n                # It is possible that the ctext has multiple lines, so convert each line and append\n                ctext_split = list(filter(None, ctext.splitlines()))\n                for _, value in enumerate(ctext_split):\n                    result += a2b_uu(value).decode(\"utf-8\")\n            logging.info(f\"UUencode successful, returning '{result}'\")\n            return result\n        except Exception:\n            logging.debug(\"Failed to decode UUencode\")\n            return None\n\n    @staticmethod\n    def priority() -> float:\n        # Not expected to show up often, but also very fast to check.\n        return 0.05\n\n    def __init__(self, config: Config):\n        super().__init__(config)\n\n    @staticmethod\n    def getParams() -> Optional[Dict[str, ParamSpec]]:\n        return None\n\n    @staticmethod\n    def getTarget() -> str:\n        return \"uuencode\"\n"
  },
  {
    "path": "ciphey/basemods/Decoders/z85.py",
    "content": "from typing import Dict, Optional\n\nimport logging\nfrom rich.logging import RichHandler\nfrom zmq.utils import z85\n\nfrom ciphey.iface import Config, Decoder, ParamSpec, T, U, registry\n\n\n@registry.register\nclass Z85(Decoder[str]):\n    def decode(self, ctext: T) -> Optional[U]:\n        \"\"\"\n        Performs Z85 decoding\n        \"\"\"\n        ctext_len = len(ctext)\n        if ctext_len % 5:\n            logging.debug(\n                f\"Failed to decode Z85 because length must be a multiple of 5, not '{ctext_len}'\"\n            )\n            return None\n        try:\n            return z85.decode(ctext).decode(\"utf-8\")\n        except Exception:\n            return None\n\n    @staticmethod\n    def priority() -> float:\n        # Not expected to show up often, but also very fast to check.\n        return 0.05\n\n    def __init__(self, config: Config):\n        super().__init__(config)\n\n    @staticmethod\n    def getParams() -> Optional[Dict[str, ParamSpec]]:\n        return None\n\n    @staticmethod\n    def getTarget() -> str:\n        return \"z85\"\n"
  },
  {
    "path": "ciphey/basemods/Resources/__init__.py",
    "content": "from . import cipheydists, files\n"
  },
  {
    "path": "ciphey/basemods/Resources/cipheydists.py",
    "content": "from functools import lru_cache\nfrom typing import Any, Dict, Optional, Set\n\nimport cipheydists\nimport logging\n\nfrom ciphey.iface import (\n    Config,\n    Distribution,\n    ParamSpec,\n    ResourceLoader,\n    Translation,\n    WordList,\n    registry,\n)\n\n\n@registry.register_multi(WordList, Distribution, Translation)\nclass CipheyDists(ResourceLoader):\n    # _wordlists: Set[str] = frozenset({\"english\", \"english1000\", \"englishStopWords\"})\n    # _brandons: Set[str] = frozenset({\"english\"})\n    # _dists: Set[str] = frozenset({\"twist\"})\n    # _translates: Set[str] = frozenset({\"morse\"})\n    _getters = {\n        \"list\": cipheydists.get_list,\n        \"dist\": cipheydists.get_dist,\n        \"brandon\": cipheydists.get_brandon,\n        \"translate\": cipheydists.get_translate,\n    }\n\n    def whatResources(self) -> Optional[Set[str]]:\n        pass\n\n    @lru_cache()\n    def getResource(self, name: str) -> Any:\n        logging.debug(f\"Loading cipheydists resource {name}\")\n        prefix, name = name.split(\"::\", 1)\n        return self._getters[prefix](name)\n\n    def __init__(self, config: Config):\n        super().__init__(config)\n\n    @staticmethod\n    def getParams() -> Optional[Dict[str, ParamSpec]]:\n        return None\n"
  },
  {
    "path": "ciphey/basemods/Resources/files.py",
    "content": "import csv\nimport json\nfrom functools import lru_cache\nfrom typing import Dict, Generic, Optional, Set\n\nfrom ciphey.iface import (\n    Config,\n    Distribution,\n    ParamSpec,\n    ResourceLoader,\n    T,\n    WordList,\n    registry,\n)\n\n\n# We can use a generic resource loader here, as we can instantiate it later\n@registry.register_multi(WordList, Distribution)\nclass Json(ResourceLoader):\n    def whatResources(self) -> T:\n        return self._names\n\n    @lru_cache()\n    def getResource(self, name: str) -> T:\n        prefix, name = name.split(\"::\", 1)\n        return {\"wordlist\": (lambda js: {js}), \"dist\": (lambda js: js)}[prefix](\n            json.load(open(self._paths[int(name) - 1]))\n        )\n\n    @staticmethod\n    def getName() -> str:\n        return \"json\"\n\n    @staticmethod\n    def getParams() -> Optional[Dict[str, ParamSpec]]:\n        return {\"path\": ParamSpec(req=True, desc=\"The path to a JSON file\", list=True)}\n\n    def __init__(self, config: Config):\n        super().__init__(config)\n        self._paths = self._params()[\"path\"]\n        self._names = set(range(1, len(self._paths)))\n\n\n# We can use a generic resource loader here, as we can instantiate it later\n@registry.register_multi(WordList, Distribution)\nclass Csv(Generic[T], ResourceLoader[T]):\n    def whatResources(self) -> Set[str]:\n        return self._names\n\n    @lru_cache()\n    def getResource(self, name: str) -> T:\n        prefix, name = name.split(\"::\", 1)\n        return {\n            \"wordlist\": (lambda reader: {i[0] for i in reader}),\n            \"dist\": (lambda reader: {i[0]: float(i[1]) for i in reader}),\n        }[prefix](csv.reader(open(self._paths[int(name) - 1])))\n\n    @staticmethod\n    def getName() -> str:\n        return \"csv\"\n\n    @staticmethod\n    def getParams() -> Optional[Dict[str, ParamSpec]]:\n        return {\"path\": ParamSpec(req=True, desc=\"The path to a CSV file\", list=True)}\n\n    def __init__(self, config: Config):\n        super().__init__(config)\n        self._paths = self._params()[\"path\"]\n        self._names = set(range(1, len(self._paths)))\n"
  },
  {
    "path": "ciphey/basemods/Searchers/__init__.py",
    "content": "from . import ausearch\n"
  },
  {
    "path": "ciphey/basemods/Searchers/astar.py",
    "content": "import cipheycore\n\n\nclass Node:\n    \"\"\"\n    A node has a value associated with it\n    Calculated from the heuristic\n    \"\"\"\n\n    def __init__(\n        self,\n        config,\n        h: float = None,\n        edges: (any, float) = None,\n        ctext: str = None,\n    ):\n        self.weight = h\n        # Edges is a list of other nodes it can connect to\n        self.edges = edges\n        self.ctext = ctext\n        self.h = h\n        self.path = []\n        self.information_content = config.cache.get_or_update(\n            self.text,\n            \"cipheycore::info_content\",\n            lambda: cipheycore.info_content(self.ctext),\n        )\n\n    def __le__(self, node2):\n        # if self is less than other\n        return self.x <= node2.x\n\n    def __lt__(self, node2):\n        return self.x < node2.x\n\n    def append_edge(self, edge):\n        self.edges.append(edge)\n\n    def get_edges(self):\n        return self.edges\n\n\nclass Graph:\n    # example of adjacency list (or rather map)\n    # adjacency_list = {\n    # 'A': [('B', 1), ('C', 3), ('D', 7)],\n    # 'B': [('D', 5)],\n    # 'C': [('D', 12)]\n    # }\n\n    def __init__(self, adjacency_list):\n        \"\"\"\n        adjacency list: basically the graph\n        \"\"\"\n        self.adjacency_list = adjacency_list\n        self.original_input = cipheycore.info_content(input)\n\n    def get_neighbors(self, v):\n        try:\n            return self.adjacency_list[v]\n        except KeyError:\n            # If we have exhausted the adjacency list\n            return []\n\n    # heuristic function with equal values for all nodes\n    def heuristic(self, n: Node):\n        return n.info_content / self.original_input\n\n    def a_star_algorithm(self, start_node: Node, stop_node: Node):\n        # TODO store the graph as an attribute\n        # open_list is a list of nodes which have been visited, but who's neighbors\n        # haven't all been inspected, starts off with the start node\n        # closed_list is a list of nodes which have been visited\n        # and who's neighbors have been inspected\n        open_list = set([start_node])\n        closed_list = set([])\n\n        # g contains current distances from start_node to all other nodes\n        # the default value (if it's not found in the map) is +infinity\n        g = {}\n\n        g[start_node] = 0\n\n        # parents contains an adjacency map of all nodes\n        parents = {}\n        parents[start_node] = start_node\n\n        while len(open_list) > 0:\n            print(f\"The open list is {open_list}\")\n            n = None\n\n            # find a node with the lowest value of f() - evaluation function\n            for v in open_list:\n                # TODO if v == decoder, run the decoder\n                print(f\"The for loop node v is {v}\")\n                if n is None or g[v] + self.h(v) < g[n] + self.h(n):\n                    n = v\n                    print(f\"The value of n is {n}\")\n\n            if n is None:\n                print(\"Path does not exist!\")\n                return None\n\n            # if the current node is the stop_node\n            # then we begin reconstructin the path from it to the start_node\n            # NOTE Uncomment this for an exit condition\n            # TODO Make it exit if decrypter returns True\n            # TODO We need to append the decryption methods to each node\n            # So when we reconstruct the path we can reconstruct the decryptions\n            # used\n            if n == stop_node:\n                print(\"n is the stop node, we are stopping!\")\n                reconst_path = []\n\n                while parents[n] != n:\n                    reconst_path.append(n)\n                    n = parents[n]\n\n                reconst_path.append(start_node)\n\n                reconst_path.reverse()\n\n                print(\"Path found: {}\".format(reconst_path))\n                return reconst_path\n\n            print(n)\n            for (m, weight) in self.get_neighbors(n):\n                print(f\"And the iteration is ({m}, {weight})\")\n                # if the current node isn't in both open_list and closed_list\n                # add it to open_list and note n as it's parent\n                if m not in open_list and m not in closed_list:\n                    open_list.add(m)\n                    parents[m] = n\n                    g[m] = g[n] + weight\n\n                # otherwise, check if it's quicker to first visit n, then m\n                # and if it is, update parent data and g data\n                # and if the node was in the closed_list, move it to open_list\n                else:\n                    if g[m] > g[n] + weight:\n                        g[m] = g[n] + weight\n                        parents[m] = n\n\n                        if m in closed_list:\n                            closed_list.remove(m)\n                            open_list.add(m)\n\n            # remove n from the open_list, and add it to closed_list\n            # because all of his neighbors were inspected\n            # open_list.remove(node)\n            # closed_list.add(node)\n\n            open_list.remove(n)\n            closed_list.add(n)\n            print(\"\\n\")\n\n        print(\"Path does not exist!\")\n        return None\n\n\nadjacency_list = {\n    \"A\": [(\"B\", 1), (\"C\", 3), (\"D\", 7)],\n    \"B\": [(\"D\", 5)],\n    \"C\": [(\"D\", 12)],\n}\nA = Node(1)\nB = Node(7)\nC = Node(9)\nD = Node(16)\n\nA.edges = [(B, 1), (C, 3), (D, 7)]\nB.edges = [(D, 5)]\nC.edges = [(D, 12)]\n\n# TODO use a dictionary comprehension to make this\nadjacency_list = {\n    A: A.edges,\n    B: B.edges,\n    C: C.edges,\n}\ngraph1 = Graph(adjacency_list)\ngraph1.a_star_algorithm(A, D)\n\n\"\"\"\nMaybe after it\n\"\"\"\n"
  },
  {
    "path": "ciphey/basemods/Searchers/atar.md",
    "content": "function reconstruct_path(cameFrom, current)\n    total_path := {current}\n    while current in cameFrom.Keys:\n        current := cameFrom[current]\n        total_path.prepend(current)\n    return total_path\n\n// A* finds a path from start to goal.\n// h is the heuristic function. h(n) estimates the cost to reach goal from node n.\nfunction A_Star(graph, start, h)\n    // The set of discovered nodes that may need to be (re-)expanded.\n    // Initially, only the start node is known.\n    // This is usually implemented as a min-heap or priority queue rather than a hash-set.\n    openSet := {start}\n\n    // For node n, cameFrom[n] is the node immediately preceding it on the cheapest path from start\n    // to n currently known.\n    cameFrom := an empty map\n\n    // For node n, gScore[n] is the cost of the cheapest path from start to n currently known.\n    gScore := map with default value of Infinity\n    gScore[start] := 0\n\n    // For node n, fScore[n] := gScore[n] + h(n). fScore[n] represents our current best guess as to\n    // how short a path from start to finish can be if it goes through n.\n    fScore := map with default value of Infinity\n    fScore[start] := h(start)\n    \n    // the exit condition is set to True when LC returns True\n    exit_condition = False\n\n    while not exit_condition\n        // This operation can occur in O(1) time if openSet is a min-heap or a priority queue\n        current := the node in openSet having the lowest fScore[] value\n        if current = goal\n            return reconstruct_path(cameFrom, current)\n\n        openSet.Remove(current)\n        for each neighbor of current\n\t\tdecodings = neighbor.decoders()\n\t\t\n\t\n\t\n            // d(current,neighbor) is the weight of the edge from current to neighbor\n            // tentative_gScore is the distance from start to the neighbor through current\n            tentative_gScore := gScore[current] + d(current, neighbor)\n            if tentative_gScore < gScore[neighbor]\n                // This path to neighbor is better than any previous one. Record it!\n                cameFrom[neighbor] := current\n                gScore[neighbor] := tentative_gScore\n                fScore[neighbor] := gScore[neighbor] + h(neighbor)\n                if neighbor not in openSet\n                    openSet.add(neighbor)\n\t\t\n\t\t    # run the cracker on the object\n\t\t\t    crack(node.ctext)\n\t\t    if crack:\n\t\t\t    # if cracker returns true, reconstruct path and exiti\n\t\t\t    exit_condition = True\n\t\t\t    reconstruct(start, node)\n\t\t    else:\n\t\t\t    # else add the new children of the cracker to openSet\n\t\t\t    openSet.append(node: crack)\n\t\t\n\t\t\n\t\t\n\n    // Open set is empty but goal was never reached\n    return failure\n    \n\nfunction reconstruct_path(cameFrom, current)\n    total_path := {current}\n    while current in cameFrom.Keys:\n        current := cameFrom[current]\n        total_path.prepend(current)\n    return total_path\n\n// A* finds a path from start to goal.\n// h is the heuristic function. h(n) estimates the cost to reach goal from node n.\nfunction A_Star(graph, start, h)\n    // The set of discovered nodes that may need to be (re-)expanded.\n    // Initially, only the start node is known.\n    // This is usually implemented as a min-heap or priority queue rather than a hash-set.\n    openSet := {start}\n\n    // For node n, cameFrom[n] is the node immediately preceding it on the cheapest path from start\n    // to n currently known.\n    cameFrom := an empty map\n\n    // For node n, gScore[n] is the cost of the cheapest path from start to n currently known.\n    gScore := map with default value of Infinity\n    gScore[start] := 0\n\n    // For node n, fScore[n] := gScore[n] + h(n). fScore[n] represents our current best guess as to\n    // how short a path from start to finish can be if it goes through n.\n    fScore := map with default value of Infinity\n    fScore[start] := h(start)\n    \n    // the exit condition is set to True when LC returns True\n    exit_condition = False\n\n    while not exit_condition\n        // This operation can occur in O(1) time if openSet is a min-heap or a priority queue\n        current := the node in openSet having the lowest fScore[] value\n        if current = goal\n            return reconstruct_path(cameFrom, current)\n\n        openSet.Remove(current)\n        for each neighbor of current\n\t\tdecodings = neighbor.decoders()\n\t\t\n\t\n\t\n            // d(current,neighbor) is the weight of the edge from current to neighbor\n            // tentative_gScore is the distance from start to the neighbor through current\n            tentative_gScore := gScore[current] + d(current, neighbor)\n            if tentative_gScore < gScore[neighbor]\n                // This path to neighbor is better than any previous one. Record it!\n                cameFrom[neighbor] := current\n                gScore[neighbor] := tentative_gScore\n                fScore[neighbor] := gScore[neighbor] + h(neighbor)\n                if neighbor not in openSet\n                    openSet.add(neighbor)\n\t\t\n\t\t    # run the cracker on the object\n\t\t\t    crack(node.ctext)\n\t\t    if crack:\n\t\t\t    # if cracker returns true, reconstruct path and exiti\n\t\t\t    exit_condition = True\n\t\t\t    reconstruct(start, node)\n\t\t    else:\n\t\t\t    # else add the new children of the cracker to openSet\n\t\t\t    openSet.append(node: crack)\n\t\t\n\t\t\n\t\t\n\n    // Open set is empty but goal was never reached\n    \nfunction calculate_new_children(node):\n\n    \nclass Node:\n    \"\"\"\n    A node has a value associated with it\n    Calculated from the heuristic\n    \"\"\"\n\n    def __init__(self, h: float = None, edges: (any, float) = None, ctext: str = None):\n        self.weight = h\n        # Edges is a list of other nodes it can connect to\n        self.edges = edges\n        self.ctext = ctext\n        self.h = h\n        self.path = []\n        self.information_content = config.cache.get_or_update(\n            self.ctext,\n            \"cipheycore::info_content\",\n            lambda: cipheycore.info_content(self.ctext),\n        )\n\n    def __le__(self, node2):\n        # if self is less than other\n        return self.x <= node2.x\n\n    def __lt__(self, node2):\n        return self.x < node2.x\n\n    def append_edge(self, edge):\n        self.edges.append(edge)\n\n    def get_edges(self):\n        return self.edges\n"
  },
  {
    "path": "ciphey/basemods/Searchers/ausearch.py",
    "content": "import bisect\nimport distutils\nimport math\nfrom copy import copy\nfrom dataclasses import dataclass\nfrom functools import lru_cache\nfrom typing import Any, Dict, Generic, List, Optional, TypeVar, Union\n\nimport logging\nfrom rich.logging import RichHandler\n\nfrom ciphey.iface import (\n    Checker,\n    Config,\n    Cracker,\n    CrackInfo,\n    CrackResult,\n    Decoder,\n    ParamSpec,\n    Searcher,\n    SearchLevel,\n    SearchResult,\n    T,\n    registry,\n)\n\n\"\"\"\nWe are using a tree structure here, because that makes searching and tracing back easier\nAs such, when we encounter another possible parent, we remove that edge\n\"\"\"\n\n\nclass DuplicateNode(Exception):\n    pass\n\n\n@dataclass\nclass AuSearchSuccessful(Exception):\n    target: \"Node\"\n    info: str\n\n\n@dataclass\nclass Node:\n    # The root has no parent edge\n    level: SearchLevel\n    parent: Optional[\"Edge\"] = None\n    depth: int = 0\n\n    @staticmethod\n    def decoding(\n        config: Config, route: Union[Cracker, Decoder], result: Any, source: \"Node\"\n    ) -> \"Node\":\n        if not config.cache.mark_ctext(result):\n            raise DuplicateNode()\n\n        checker: Checker = config.objs[\"checker\"]\n        ret = Node(\n            parent=None,\n            level=SearchLevel(\n                name=type(route).__name__.lower(), result=CrackResult(value=result)\n            ),\n            depth=source.depth + 1,\n        )\n        edge = Edge(source=source, route=route, dest=ret)\n        ret.parent = edge\n        check_res = checker(result)\n        if check_res is not None:\n            raise AuSearchSuccessful(target=ret, info=check_res)\n        return ret\n\n    @staticmethod\n    def cracker(config: Config, edge_template: \"Edge\", result: CrackResult) -> \"Node\":\n        if not config.cache.mark_ctext(result.value):\n            raise DuplicateNode()\n\n        checker: Checker = config.objs[\"checker\"]\n        # Edges do not directly contain containers, so this is fine\n        edge = copy(edge_template)\n        ret = Node(\n            parent=edge,\n            level=SearchLevel(name=type(edge.route).__name__.lower(), result=result),\n            depth=edge.source.depth + 1,\n        )\n        edge.dest = ret\n        check_res = checker(result.value)\n        if check_res is not None:\n            raise AuSearchSuccessful(target=ret, info=check_res)\n        return ret\n\n    @staticmethod\n    def root(config: Config, ctext: Any):\n        if not config.cache.mark_ctext(ctext):\n            raise DuplicateNode()\n\n        return Node(parent=None, level=SearchLevel.input(ctext))\n\n    def get_path(self):\n        if self.parent is None:\n            return [self.level]\n        return self.parent.source.get_path() + [self.level]\n\n\n@dataclass\nclass AusearchEdge:\n    # TODO: This is just CrackInfo with failure probability added...\n    success_probability: float\n    failure_probability: float\n    success_time: float\n    failure_time: float\n\n    def __init__(self, success_probability, success_time, failure_time):\n        self.success_probability = success_probability\n        self.failure_probability = 1.0 - success_probability\n        self.success_time = success_time\n        self.failure_time = failure_time\n\n\n@dataclass\nclass AusearchResult:\n    weight: float\n    index: int\n\n\ndef calculate_score(info: CrackInfo):\n    return info.success_likelihood / \\\n        (info.success_runtime * info.success_likelihood + info.failure_runtime * (1-info.success_likelihood))\n\n\n@dataclass\nclass Edge:\n    source: Node\n    route: Union[Cracker, Decoder]\n    dest: Optional[Node] = None\n    # Info is not filled in for Decoders\n    score: Optional[float] = None\n\n\nPriorityType = TypeVar(\"PriorityType\")\n\n\nclass PriorityWorkQueue(Generic[PriorityType, T]):\n    _sorted_priorities: List[PriorityType]\n    _queues: Dict[Any, List[T]]\n\n    def add_work(self, priority: PriorityType, work: List[T]) -> None:\n        logging.debug(f\"\"\"Adding work at depth {priority}\"\"\")\n\n        idx = bisect.bisect_left(self._sorted_priorities, priority)\n        if (\n            idx == len(self._sorted_priorities)\n            or self._sorted_priorities[idx] != priority\n        ):\n            self._sorted_priorities.insert(idx, priority)\n        self._queues.setdefault(priority, []).extend(work)\n\n    def get_work(self) -> T:\n        best_priority = self._sorted_priorities[0]\n        target = self._queues[best_priority]\n        ret = target.pop(0)\n        if len(target) == 0:\n            self._sorted_priorities.pop()\n        return ret\n\n    def get_work_chunk(self) -> List[T]:\n        \"\"\"Returns the best work for now\"\"\"\n        if len(self._sorted_priorities) == 0:\n            return []\n        best_priority = self._sorted_priorities.pop(0)\n        return self._queues.pop(best_priority)\n\n    def empty(self):\n        return len(self._sorted_priorities) == 0\n\n    def __init__(self):\n        self._sorted_priorities = []\n        self._queues = {}\n\n\n@registry.register\nclass AuSearch(Searcher):\n    # Deeper paths get done later\n    work: PriorityWorkQueue[int, Edge]\n\n    @staticmethod\n    def get_crackers_for(t: type):\n        return registry[Cracker[t]]\n\n    @lru_cache()  # To save extra sorting\n    def get_decoders_for(self, t: type):\n        ret = registry[Decoder[t]]\n        ret.sort(key=lambda x: x.priority(), reverse=True)\n        return ret\n\n    # def expand(self, edge: Edge) -> List[Edge]:\n    #     \"\"\"Evaluates the destination of the given, and adds its child edges to the pool\"\"\"\n    #     edge.dest = Node(parent=edge, level=edge.route(edge.source.level.result.value))\n\n    def expand_crackers(self, node: Node) -> None:\n        if node.depth >= self.max_cipher_depth:\n            return\n\n        res = node.level.result.value\n        additional_work = []\n\n        for i in self.get_crackers_for(type(res)):\n            inst = self._config()(i)\n            info = inst.getInfo(res)\n            if info.success_likelihood < self.p_threshold:\n                continue\n            additional_work.append(\n                Edge(source=node, route=inst, score=calculate_score(inst.getInfo(res)))\n            )\n\n        priority = min(node.depth, self.priority_cap)\n        if self.invert_priority:\n            priority = -priority\n\n        self.work.add_work(priority, additional_work)\n\n    def expand_decodings(self, node: Node) -> None:\n        val = node.level.result.value\n\n        for decoder in self.get_decoders_for(type(val)):\n            inst = self._config()(decoder)\n            res = inst(val)\n            if res is None:\n                continue\n            try:\n                new_node = Node.decoding(\n                    config=self._config(), route=inst, result=res, source=node\n                )\n            except DuplicateNode:\n                continue\n\n            logging.debug(\"Nesting encodings\")\n            self.recursive_expand(new_node, False)\n\n    def recursive_expand(self, node: Node, nested: bool = True) -> None:\n        if node.depth >= self.max_depth:\n            return\n\n        logging.debug(f\"Expanding depth {node.depth}\")\n\n        self.expand_decodings(node)\n\n        # Doing this last allows us to catch simple nested encodings faster\n        if not nested or self.enable_nested:\n            self.expand_crackers(node)\n\n    def search(self, ctext: Any) -> Optional[SearchResult]:\n        logging.debug(\n            f\"\"\"Beginning AuSearch with {\"inverted\" if self.invert_priority else \"normal\"} priority\"\"\"\n        )\n\n        try:\n            root = Node.root(self._config(), ctext)\n        except DuplicateNode:\n            return None\n\n        check_res = self._config().objs[\"checker\"](ctext)\n        if check_res is not None:\n            return SearchResult(check_res=check_res, path=[root.level])\n\n        try:\n            self.recursive_expand(root, False)\n\n            while True:\n                if self.work.empty():\n                    break\n                # Get the highest level result\n                chunk = self.work.get_work_chunk()\n                chunk.sort(key=lambda i: i.score)\n                # Work through all of this level's results\n                while len(chunk) != 0:\n                    logging.debug(f\"{len(chunk)} remaining on this level\")\n                    # TODO Cyclic uses some tricky C++ here\n                    # I know because it's sorted the one at the back (the anti-weight)\n                    # is the most likely\n\n                    edge: Edge = chunk.pop(-1)\n\n                    # Expand the node\n                    res = edge.route(edge.source.level.result.value)\n                    if res is None:\n                        continue\n                    for i in res:\n                        try:\n                            node = Node.cracker(\n                                config=self._config(), edge_template=edge, result=i\n                            )\n                            self.recursive_expand(node)\n                        except DuplicateNode:\n                            continue\n\n        except AuSearchSuccessful as e:\n            logging.info(\"AuSearch succeeded\")\n            return SearchResult(path=e.target.get_path(), check_res=e.info)\n\n        logging.info(\"AuSearch failed\")\n\n    def __init__(self, config: Config):\n        super().__init__(config)\n        self._checker: Checker = config.objs[\"checker\"]\n        self.work = PriorityWorkQueue()  # Has to be defined here because of sharing\n        self.invert_priority = bool(\n            distutils.util.strtobool(self._params()[\"invert_priority\"])\n        )\n        self.priority_cap = int(self._params()[\"priority_cap\"])\n        self.enable_nested = bool(\n            distutils.util.strtobool(self._params()[\"enable_nested\"])\n        )\n        self.max_cipher_depth = int(self._params()[\"max_cipher_depth\"])\n        if self.max_cipher_depth == 0:\n            self.max_cipher_depth = math.inf\n        self.max_depth = int(self._params()[\"max_depth\"])\n        if self.max_depth == 0:\n            self.max_depth = math.inf\n        self.p_threshold = float(self._params()[\"p_threshold\"])\n\n    @staticmethod\n    def getParams() -> Optional[Dict[str, ParamSpec]]:\n        return {\n            \"enable_nested\": ParamSpec(\n                req=False,\n                desc=\"Enables nested ciphers. \"\n                \"Incredibly slow, and not guaranteed to terminate\",\n                default=\"False\",\n            ),\n            \"invert_priority\": ParamSpec(\n                req=False,\n                desc=\"Causes more complex encodings to be looked at first. \"\n                \"Good for deeply buried encodings.\",\n                default=\"False\",\n            ),\n            \"max_cipher_depth\": ParamSpec(\n                req=False,\n                desc=\"The depth at which we stop trying to crack ciphers. \"\n                \"Set to 0 to disable\",\n                default=\"0\",\n            ),\n            \"max_depth\": ParamSpec(\n                req=False,\n                desc=\"The depth at which we give up. \" \n                     \"Set to 0 to disable\",\n                default=\"0\",\n            ),\n            \"priority_cap\": ParamSpec(\n                req=False,\n                desc=\"Sets the maximum depth before we give up ordering items.\",\n                default=\"2\",\n            ),\n            \"p_threshold\": ParamSpec(\n                req=False,\n                desc=\"Will skip any crackers which have less than this likelihood of succeeding. \"\n                     \"Set to 0 to disable\",\n                default=\"0.01\",\n            ),\n        }\n"
  },
  {
    "path": "ciphey/basemods/Searchers/imperfection.py",
    "content": "import heapq\n\n\nclass Imperfection:\n    \"\"\"The graph is a Node: [List of nodes]\n    Where each item in the list of nodes can also have a node with a list of nodes\n\n    The result is that we can keep track of edges, while also keeping it small\n\n    To calculate current, we push the entire graph to A*\n\n    And it calculates the next node to choose, as well as increasing the size\n    of the graph with values\n\n    We're using a heap, meaning the element at [0] is always the smallest element\n\n    So we choose that and return it.\n\n\n    The current A* implementation has an end, we simply do not let it end as LC will make it\n    end far before it reaches Searcher again.\n\n    Current is the start position, so if we say we always start at the start of the graph it'll\n    go through the entire graph\n\n    graph = {\n            Node: [\n                {Node :\n                {\n                    node\n                    }\n                }\n                ]\n            }\n\n    For encodings we just do them straight out\n\n    The last value of parents from abstract\n    \"\"\"\n\n    \"\"\"\n\n   graph = {'A': ['B', 'C'],\n             'B': ['C', 'D'],\n             'C': ['D'],\n             'D': ['C'],\n             'E': ['F'],\n             'F': ['C']}\"\"\"\n\n    def __init__(self):\n        None\n\n    def findBestNode(self, nodes):\n        \"\"\"Finds the best decryption module\"\"\"\n        return next(iter(nodes))\n\n    # def aStar(self, graph, current, end):\n    #     \"\"\"The A* search algorithm\n\n    #     We're using heaps to find the minimum element (the one that will be the next current)\n    #     Heaps are like sets with O(1) lookup time, but maintain the lowest element as [0]\n    #     Sets insert in O(1), heaps in O(log N).\n\n    #     https://stackoverflow.com/questions/4159331/python-speed-up-an-a-star-pathfinding-algorithm\n\n    #     Current appears to be the list of all new tiles we can reach from current location\n\n    #     End is the end node, that won't actually run bc LC will make it return before it hits aSTar function\n    #     so tbh I'll just make it infinite unless something else forces a return\n\n    #     The graph is the actual data structure used. According to StackOverflow, it looks like this:\n\n    #     graph = {'A': ['B', 'C'],\n    #              'B': ['C', 'D'],\n    #              'C': ['D'],\n    #              'D': ['C'],\n    #              'E': ['F'],\n    #              'F': ['C']}\n\n    #     \"\"\"\n\n    #     # Runs decodings first\n\n    #     openSet = set()\n    #     openHeap = []\n    #     closedSet = set()\n\n    #     def retracePath(c):\n    #         # Retraces a path back to the start\n    #         path = [c]\n    #         while c.parent is not None:\n    #             c = c.parent\n    #             path.append(c)\n    #         path.reverse()\n    #         return path\n\n    #     # Adds the current location (start) to the heap and set\n    #     openSet.add(current)\n    #     openHeap.append((0, current))\n\n    #     # while openSet contains items\n    #     while openSet:\n    #         # TODO change openSet  to a heap?\n    #         # gets the 2nd element from the first element of the heap\n    #         # so the heap is (0, current)\n    #         # which means we pop current\n    #         # this makes me think that current isn't the first?\n    #         current = heapq.heappop(openHeap)[1]\n    #         # We don't actually want to end, so I'm commenting this:\n    #         # XXX\n    #         if current == end:\n    #             return retracePath(current)\n    #         # Removes it from todo and into done i think\n    #         # closedSet appears to be the set of things we have done\n    #         openSet.remove(current)\n    #         closedSet.add(current)\n\n    #         \"\"\"\n    #         Okay so our graph looks like this:\n    #         graph = {\n    #                 Node: [\n    #                     {Node :\n    #                     {\n    #                         node\n    #                         }\n    #                     }\n    #                     ]\n    #                 }\n    #         graph[current] **SHOULD** be the list of nodes which contains dictionaries of nodes\n\n    #         \"\"\"\n    #         for tile in graph[current]:\n    #             # ClosedSet appears to be the list of visited nodes\n    #             # TODO place this as a class attribute\n    #             if tile not in closedSet:\n    #                 # This is the heuristic\n    #                 # TODO expected_time/probability + k * heuristic, for some experimentally determined value of k\n    #                 tile.H = (abs(end.x - tile.x) + abs(end.y - tile.y)) * 10\n\n    #                 # if tile is not in the openSet, add it and then pop it from the heap\n    #                 if tile not in openSet:\n    #                     openSet.add(tile)\n    #                     heapq.heappush(openHeap, (tile.H, tile))\n    #                 #  I have no idea where this code is called lol\n    #                 tile.parent = current\n\n    #     # This returns Nothing\n    #     # I need to modify it so it finds the best item from Current\n    #     # So basically, return item 0 of openHeap\n    #     # return openHeap[0]\n    #     # Since the [0] item is always minimum\n    #     return []\n    def aStar(self, graph, current, end):\n        print(f\"The graph is {graph}\\nCurrent is {current}\\n and End is {end}\")\n        openSet = set()\n        openHeap = []\n        closedSet = set()\n\n        def retracePath(c):\n            print(\"Calling retrace path\")\n            path = [c]\n            while c.parent is not None:\n                c = c.parent\n                path.append(c)\n            path.reverse()\n            return path\n\n        print(\"\\n\")\n\n        openSet.add(current)\n        openHeap.append((0, current))\n        while openSet:\n            print(f\"Openset is {openSet}\")\n            print(f\"OpenHeap is {openHeap}\")\n            print(f\"ClosedSet is {closedSet}\")\n            print(f\"Current is {current}\")\n            print(f\"I am popping {openHeap} with the first element\")\n            current = heapq.heappop(openHeap)[1]\n            print(f\"Current is now {current}\")\n            print(f\"Graph current is {graph[current]}\")\n            if current == end:\n                return retracePath(current)\n            openSet.remove(current)\n            closedSet.add(current)\n            for tile in graph[current]:\n                if tile not in closedSet:\n                    tile.H = (abs(end.x - tile.x) + abs(end.y - tile.y)) * 10\n                    tile.H = 1\n                    if tile not in openSet:\n                        openSet.add(tile)\n                        heapq.heappush(openHeap, (tile.H, tile))\n                    tile.parent = current\n            print(\"\\n\")\n        return []\n\n\nclass Node:\n    \"\"\"\n    A node has a value associated with it\n    Calculated from the heuristic\n    \"\"\"\n\n    def __init__(self, h):\n        self.h = h\n        self.x = self.h\n        self.y = 0.6\n\n    def __le__(self, node2):\n        # if self is less than other\n        return self.x <= node2.x\n\n    def __lt__(self, node2):\n        return self.x < node2.x\n\n\nif __name__ == \"__main__\":\n    obj = Imperfection()\n    graph = {\n        \"A\": [\"B\", \"C\"],\n        \"B\": [\"C\", \"D\"],\n        \"C\": [\"D\"],\n        \"D\": [\"C\"],\n        \"E\": [\"F\"],\n        \"F\": [\"C\"],\n    }\n    # Makes the graph\n    y = Node(0.5)\n    x = Node(0.3)\n    p = Node(0.7)\n    q = Node(0.9)\n    graph = {y: [x, p], p: q}\n\n    print(obj.aStar(graph, y, q))\n"
  },
  {
    "path": "ciphey/basemods/Searchers/perfection.py",
    "content": "from typing import Dict, Optional, Set\n\nfrom ciphey.iface import Config, ParamSpec, registry\n\nfrom .ausearch import AuSearch, Node\n\n\n@registry.register\nclass Perfection(AuSearch):\n    @staticmethod\n    def getParams() -> Optional[Dict[str, ParamSpec]]:\n        return None\n\n    def findBestNode(self, nodes: Set[Node]) -> Node:\n        return next(iter(nodes))\n\n    def __init__(self, config: Config):\n        super().__init__(config)\n"
  },
  {
    "path": "ciphey/basemods/__init__.py",
    "content": "from . import Checkers, Crackers, Decoders, Resources, Searchers\n"
  },
  {
    "path": "ciphey/ciphey.py",
    "content": "\"\"\"\n ██████╗██╗██████╗ ██╗  ██╗███████╗██╗   ██╗\n██╔════╝██║██╔══██╗██║  ██║██╔════╝╚██╗ ██╔╝\n██║     ██║██████╔╝███████║█████╗   ╚████╔╝\n██║     ██║██╔═══╝ ██╔══██║██╔══╝    ╚██╔╝\n╚██████╗██║██║     ██║  ██║███████╗   ██║\nhttps://github.com/Ciphey\nhttps://github.com/Ciphey/Ciphey/wiki\n\nThe cycle goes:\nmain -> argparsing (if needed) -> call_encryption -> new Ciphey object -> decrypt() -> produceProbTable ->\none_level_of_decryption -> decrypt_normal\n\"\"\"\nimport os\nimport warnings\nfrom typing import Any, Optional, Union\n\nimport click\nfrom appdirs import AppDirs\nimport logging\nfrom rich.logging import RichHandler\nfrom rich.console import Console\n\nfrom . import iface\n\nwarnings.filterwarnings(\"ignore\")\n\nconsole = Console()\n\n\ndef decrypt(config: iface.Config, ctext: Any) -> Union[str, bytes]:\n    \"\"\"A simple alias for searching a ctext and makes the answer pretty\"\"\"\n    res: Optional[iface.SearchResult] = config.objs[\"searcher\"].search(ctext)\n    if res is None:\n        return \"Failed to crack\"\n    if config.verbosity < 0:\n        return res.path[-1].result.value\n    else:\n        return iface.pretty_search_results(res)\n\n\ndef get_name(ctx, param, value):\n    # reads from stdin if value was not supplied\n    if not value and not click.get_text_stream(\"stdin\").isatty():\n        click.get_text_stream(\"stdin\").read().strip()\n        return click.get_text_stream(\"stdin\").read().strip()\n    else:\n        return value\n\n\ndef print_help(ctx):\n    # prints help menu\n    # if no arguments are passed\n    click.echo(ctx.get_help())\n    ctx.exit()\n\n\n@click.command()\n@click.option(\n    \"-t\",\n    \"--text\",\n    help=\"The ciphertext you want to decrypt.\",\n    type=str,\n)\n@click.option(\n    \"-q\", \"--quiet\", help=\"Decrease verbosity\", type=int, count=True, default=None\n)\n@click.option(\n    \"-g\",\n    \"--greppable\",\n    help=\"Only print the answer (useful for grep)\",\n    type=bool,\n    is_flag=True,\n    default=None,\n)\n@click.option(\"-v\", \"--verbose\", count=True, type=int)\n@click.option(\"-C\", \"--checker\", help=\"Use the given checker\", default=None)\n@click.option(\n    \"-c\",\n    \"--config\",\n    help=\"Uses the given config file. Defaults to appdirs.user_config_dir('ciphey', 'ciphey')/'config.yml'\",\n)\n@click.option(\"-w\", \"--wordlist\", help=\"Uses the given wordlist\")\n@click.option(\n    \"-p\",\n    \"--param\",\n    help=\"Passes a parameter to the language checker\",\n    multiple=True,\n)\n@click.option(\n    \"-l\",\n    \"--list-params\",\n    help=\"List the parameters of the selected module\",\n    type=bool,\n)\n@click.option(\n    \"--searcher\",\n    help=\"Select the searching algorithm to use\",\n)\n# HARLAN TODO XXX\n# I switched this to a boolean flag system\n# https://click.palletsprojects.com/en/7.x/options/#boolean-flags\n# True for bytes input, False for str\n@click.option(\n    \"-b\",\n    \"--bytes\",\n    help=\"Forces ciphey to use binary mode for the input\",\n    is_flag=True,\n    default=None,\n)\n@click.option(\n    \"--default-dist\",\n    help=\"Sets the default character/byte distribution\",\n    type=str,\n    default=None,\n)\n@click.option(\n    \"-m\",\n    \"--module\",\n    help=\"Adds a module from the given path\",\n    type=click.Path(),\n    multiple=True,\n)\n@click.option(\n    \"-A\",\n    \"--appdirs\",\n    help=\"Print the location of where Ciphey wants the settings file to be\",\n    type=bool,\n    is_flag=True,\n)\n@click.option(\"-f\", \"--file\", type=click.File(\"rb\"), required=False)\n@click.argument(\"text_stdin\", callback=get_name, required=False)\ndef main(**kwargs):\n    \"\"\"Ciphey - Automated Decryption Tool\n\n    Documentation:\n    https://github.com/Ciphey/Ciphey/wiki\\n\n    Discord (support here, we're online most of the day):\n    http://discord.skerritt.blog\\n\n    GitHub:\n    https://github.com/ciphey/ciphey\\n\n\n    Ciphey is an automated decryption tool using smart artificial intelligence and natural language processing. Input encrypted text, get the decrypted text back.\n\n    Examples:\\n\n        Basic Usage: ciphey -t \"aGVsbG8gbXkgbmFtZSBpcyBiZWU=\"\n\n    \"\"\"\n\n    \"\"\"Function to deal with arguments. Either calls with args or not. Makes Pytest work.\n\n    It gets the arguments in the function definition using locals()\n    if withArgs is True, that means this is being called with command line args\n    so go to arg_parsing() to get those args\n    we then update locals() with the new command line args and remove \"withArgs\"\n    This function then calls call_encryption(**result) which passes our dict of args\n    to the function as its own arguments using dict unpacking.\n        Returns:\n            The output of the decryption.\n    \"\"\"\n\n    # if user wants to know where appdirs is\n    # print and exit\n    if \"appdirs\" in kwargs and kwargs[\"appdirs\"]:\n        dirs = AppDirs(\"Ciphey\", \"Ciphey\")\n        path_to_config = dirs.user_config_dir\n        print(\n            f\"The settings.yml file should be at {os.path.join(path_to_config, 'settings.yml')}\"\n        )\n        return None\n\n    # Now we create the config object\n    config = iface.Config()\n\n    # Load the settings file into the config\n    load_msg: str\n    cfg_arg = kwargs[\"config\"]\n    if cfg_arg is None:\n        # Make sure that the config dir actually exists\n        os.makedirs(iface.Config.get_default_dir(), exist_ok=True)\n        config.load_file(create=True)\n        load_msg = f\"Opened config file at {os.path.join(iface.Config.get_default_dir(), 'config.yml')}\"\n    else:\n        config.load_file(cfg_arg)\n        load_msg = f\"Opened config file at {cfg_arg}\"\n\n    # Load the verbosity, so that we can start logging\n    verbosity = kwargs[\"verbose\"]\n    quiet = kwargs[\"quiet\"]\n    if verbosity is None:\n        if quiet is not None:\n            verbosity = -quiet\n    elif quiet is not None:\n        verbosity -= quiet\n    if kwargs[\"greppable\"] is not None:\n        verbosity -= 999\n    # Use the existing value as a base\n    config.verbosity += verbosity\n    config.update_log_level(config.verbosity)\n    logging.info(load_msg)\n    logging.debug(f\"Got cmdline args {kwargs}\")\n\n    # Now we load the modules\n    module_arg = kwargs[\"module\"]\n    if module_arg is not None:\n        config.modules += list(module_arg)\n\n    # We need to load formats BEFORE we instantiate objects\n    if kwargs[\"bytes\"] is not None:\n        config.update_format(\"bytes\")\n\n    # Next, load the objects\n    params = kwargs[\"param\"]\n    if params is not None:\n        for i in params:\n            key, value = i.split(\"=\", 1)\n            parent, name = key.split(\".\", 1)\n            config.update_param(parent, name, value)\n    config.update(\"checker\", kwargs[\"checker\"])\n    config.update(\"searcher\", kwargs[\"searcher\"])\n    config.update(\"default_dist\", kwargs[\"default_dist\"])\n\n    config.complete_config()\n\n    logging.debug(f\"Command line opts: {kwargs}\")\n    logging.debug(f\"Config finalised: {config}\")\n\n    # Finally, we load the plaintext\n    if kwargs[\"text\"] is None:\n        if kwargs[\"file\"] is not None:\n            kwargs[\"text\"] = kwargs[\"file\"].read()\n        elif kwargs[\"text_stdin\"] is not None:\n            kwargs[\"text\"] = kwargs[\"text_stdin\"]\n        else:\n            # else print help menu\n            print(\"[bold red]Error. No inputs were given to Ciphey. [bold red]\")\n\n            @click.pass_context\n            def all_procedure(ctx):\n                print_help(ctx)\n\n            all_procedure()\n\n            return None\n\n    if issubclass(config.objs[\"format\"], type(kwargs[\"text\"])):\n        pass\n    elif config.objs[\"format\"] == str and isinstance(kwargs[\"text\"], bytes):\n        kwargs[\"text\"] = kwargs[\"text\"].decode(\"utf-8\")\n    elif config.objs[\"format\"] == bytes and isinstance(kwargs[\"text\"], str):\n        kwargs[\"text\"] = kwargs[\"text\"].encode(\"utf-8\")\n    else:\n        raise TypeError(f\"Cannot load type {config.format} from {type(kwargs['text'])}\")\n\n    result: Optional[str]\n\n    # if debug or quiet mode is on, run without spinner\n    if config.verbosity != 0:\n        result = decrypt(config, kwargs[\"text\"])\n    else:\n        # else, run with spinner if verbosity is 0\n        with console.status(\"[bold green]Thinking...\", spinner=\"moon\") as status:\n            config.set_spinner(status)\n            result = decrypt(config, kwargs[\"text\"])\n    if result is None:\n        result = \"Could not find any solutions.\"\n\n    console.print(result)\n"
  },
  {
    "path": "ciphey/common.py",
    "content": "\"\"\"Some useful adapters\"\"\"\nfrom typing import Any\n\n\ndef id_lambda(value: Any):\n    \"\"\"\n    A function used in dynamic class generation that abstracts away a constant return value (like in getName)\n    \"\"\"\n    return lambda *args: value\n\n\ndef fix_case(target: str, base: str) -> str:\n    \"\"\"Returns the lower-case string target with the case of base\"\"\"\n    ret = \"\".join(\n        [\n            target[i].upper() if base[i].isupper() else target[i]\n            for i in range(len(target))\n        ]\n    )\n    return \"\".join(\n        [\n            target[i].upper() if base[i].isupper() else target[i]\n            for i in range(len(target))\n        ]\n    )\n"
  },
  {
    "path": "ciphey/iface/__init__.py",
    "content": "from ._config import Config\n\nfrom ._modules import (\n    Checker,\n    Cracker,\n    CrackInfo,\n    CrackResult,\n    Decoder,\n    DecoderComparer,\n    Distribution,\n    ParamSpec,\n    PolymorphicChecker,\n    ResourceLoader,\n    Searcher,\n    SearchLevel,\n    SearchResult,\n    T,\n    Translation,\n    U,\n    WordList,\n    pretty_search_results,\n)\nfrom ._registry import get_args, get_origin\n\nfrom ._fwd import registry\n"
  },
  {
    "path": "ciphey/iface/_config.py",
    "content": "import datetime\nimport os\nimport pydoc\nfrom typing import Any, Callable, Dict, List, Optional, Type, Union\n\nimport appdirs\nimport yaml\nimport logging\nfrom rich.logging import RichHandler\n\nfrom . import _fwd\nfrom ._modules import PolymorphicChecker, ResourceLoader, Searcher\n\n\nclass Cache:\n    \"\"\"Used to track state between levels of recursion to stop infinite loops, and to optimise repeating actions\"\"\"\n\n    def __init__(self):\n        self._cache: Dict[Any, Dict[str, Any]] = {}\n\n    def mark_ctext(self, ctext: Any) -> bool:\n        if (isinstance(ctext, str) or isinstance(ctext, bytes)) and len(ctext) < 4:\n            logging.debug(f\"Candidate {ctext.__repr__()} too short!\")\n            return False\n\n        if ctext in self._cache:\n            logging.debug(f\"Deduped {ctext.__repr__()}\")\n            return False\n\n        logging.debug(f\"New ctext {ctext.__repr__()}\")\n\n        self._cache[ctext] = {}\n        return True\n\n    def get_or_update(self, ctext: Any, keyname: str, get_value: Callable[[], Any]):\n        # Should have been marked first\n        target = self._cache[ctext]\n        res = target.get(keyname)\n        if res is not None:\n            return res\n\n        val = get_value()\n        target[keyname] = val\n        return val\n\n    def try_get(self, ctext: Any, keyname: str):\n        return self._cache[ctext].get(keyname)\n\n\ndef split_resource_name(full_name: str) -> (str, str):\n    return full_name.split(\"::\", 1)\n\n\nclass Config:\n    def __init__(self):\n        self.verbosity: int = 0\n        self.searcher: str = \"ausearch\"\n        self.params: Dict[str, Dict[str, Union[str, List[str]]]] = {}\n        self.format: str = \"str\"\n        self.modules: List[str] = []\n        self.checker: str = \"ezcheck\"\n        self.default_dist: str = \"cipheydists::dist::english\"\n        self.timeout: Optional[int] = None\n        self._inst: Dict[type, Any] = {}\n        self.objs: Dict[str, Any] = {}\n        self.cache: Cache = Cache()\n\n    @staticmethod\n    def get_default_dir() -> str:\n        return appdirs.user_config_dir(\"ciphey\")\n\n    def merge_dict(self, config_file: Optional[Dict[str, Any]]):\n        if config_file is None:\n            return\n        for a, b in config_file.items():\n            self.update(a, b)\n\n    def load_file(\n        self,\n        path: str = os.path.join(get_default_dir.__func__(), \"config.yml\"),\n        create=False,\n    ):\n        try:\n            with open(path, \"r+\") as file:\n                return self.merge_dict(yaml.safe_load(file))\n        except FileNotFoundError:\n            if create:\n                open(path, \"w+\")\n\n    def instantiate(self, t: type) -> Any:\n        \"\"\"\n        Used to enable caching of a instantiated type after the configuration has settled\n        \"\"\"\n        # We cannot use set default as that would construct it again, and throw away the result\n        res = self._inst.get(t)\n        if res is not None:\n            return res\n        ret = t(self)\n        self._inst[t] = ret\n        return ret\n\n    def __call__(self, t: type) -> Any:\n        return self.instantiate(t)\n\n    def update(self, attrname: str, value: Optional[Any]):\n        if value is not None:\n            setattr(self, attrname, value)\n\n    def update_param(self, owner: str, name: str, value: Optional[Any]):\n        if value is None:\n            return\n\n        target = self.params.setdefault(owner, {})\n\n        if _fwd.registry.get_named(owner).getParams()[name].list:\n            target.setdefault(name, []).append(value)\n        else:\n            target[name] = value\n\n    def update_format(self, value: Optional[str]):\n        if value is not None:\n            self.format = value\n\n    def load_objs(self):\n        # Basic type conversion\n        if self.timeout is not None:\n            self.objs[\"timeout\"] = datetime.timedelta(seconds=int(self.timeout))\n        self.objs[\"format\"] = pydoc.locate(self.format)\n\n        # Checkers do not depend on any other config object\n        logging.debug(f\"Registry is {_fwd.registry._reg[PolymorphicChecker]}\")\n        self.objs[\"checker\"] = self(\n            _fwd.registry.get_named(self.checker, PolymorphicChecker)\n        )\n        # Searchers only depend on checkers\n        self.objs[\"searcher\"] = self(_fwd.registry.get_named(self.searcher, Searcher))\n\n    def update_log_level(self, verbosity: Optional[int]):\n        if verbosity is None:\n            return\n        self.verbosity = verbosity\n\n        if verbosity == 0:\n            self.verbosity = logging.WARNING\n        elif verbosity == 1:\n            self.verbosity = logging.INFO\n        elif verbosity >= 2:\n            self.verbosity = logging.DEBUG\n        else:\n            logging.disable(logging.CRITICAL)\n            return\n\n        # https://rich.readthedocs.io/en/latest/logging.html for more on RichHandler\n        logging.basicConfig(\n            level=self.verbosity,\n            datefmt=\"[%X]\",\n            handlers=[RichHandler(markup=True, rich_tracebacks=True)],\n        )\n        logging.debug(f\"Verbosity set to level {verbosity}\")\n\n    def load_modules(self):\n        import importlib.util\n\n        for i in self.modules:\n            spec = importlib.util.spec_from_file_location(\"ciphey.module_load_site\", i)\n            mod = importlib.util.module_from_spec(spec)\n            spec.loader.exec_module(mod)\n\n        logging.info(f\"Loaded modules {_fwd.registry.get_all_names()}\")\n\n    def complete_config(self) -> \"Config\":\n        \"\"\"This does all the loading for the config, and then returns itself\"\"\"\n        self.load_modules()\n        self.load_objs()\n        self.update_log_level(self.verbosity)\n        return self\n\n    def get_resource(self, res_name: str, t: Optional[Type] = None) -> Any:\n        logging.debug(f\"Loading resource {res_name} of type {t}\")\n\n        # FIXME: Actually returns obj of type `t`, but python is bad\n        loader, name = split_resource_name(res_name)\n        if t is None:\n            return self(_fwd.registry.get_named(loader, ResourceLoader))(name)\n        else:\n            return self(_fwd.registry.get_named(loader, ResourceLoader[t]))(name)\n\n    # Setter methods for cleaner library API\n    def set_verbosity(self, i):\n        self.update_log_level(i)\n        return self\n\n    def set_spinner(self, spinner):\n        self.objs[\"spinner\"] = spinner\n\n    def pause_spinner_handle(self):\n        spinner = self.objs.get(\"spinner\")\n\n        class PausedSpinner:\n            def __enter__(self):\n                if spinner is not None:\n                    spinner.stop()\n\n            def __exit__(self, exc_type, exc_val, exc_tb):\n                if spinner is not None:\n                    spinner.start()\n\n        return PausedSpinner()\n\n    @staticmethod\n    def library_default():\n        \"\"\"The default config for use in a library\"\"\"\n        return Config().set_verbosity(-1)\n\n    def __str__(self):\n        return str(\n            {\n                \"verbosity\": self.verbosity,\n                \"searcher\": self.searcher,\n                \"params\": self.params,\n                \"format\": self.format,\n                \"modules\": self.modules,\n                \"checker\": self.checker,\n                \"default_dist\": self.default_dist,\n                \"timeout\": self.timeout,\n            }\n        )\n\n\n_fwd.config = Config\n"
  },
  {
    "path": "ciphey/iface/_fwd.py",
    "content": "registry = None\nconfig = type(None)\n"
  },
  {
    "path": "ciphey/iface/_modules.py",
    "content": "from abc import ABC, abstractmethod\nfrom typing import Any, Dict, Generic, List, NamedTuple, Optional, Set, Type, TypeVar\n\nfrom rich import box\nfrom rich.console import Console\nfrom rich.markup import escape\nfrom rich.table import Table\n\nfrom ._fwd import config as Config\n\nT = TypeVar(\"T\")\nU = TypeVar(\"U\")\n\nconsole = Console()\n\n\nclass ParamSpec(NamedTuple):\n    \"\"\"\n    Attributes:\n        req         Whether this argument is required\n        desc        A description of what this argument does\n        default     The default value for this argument. Ignored if req == True or configPath is not None\n        config_ref  The path to the config that should be the default value\n        list        Whether this parameter is in the form of a list, and can therefore be specified more than once\n        visible     Whether the user can tweak this via the command line\n    \"\"\"\n\n    req: bool\n    desc: str\n    default: Optional[Any] = None\n    list: bool = False\n    config_ref: Optional[List[str]] = None\n    visible: bool = True\n\n\nclass ConfigurableModule(ABC):\n    @staticmethod\n    @abstractmethod\n    def getParams() -> Optional[Dict[str, ParamSpec]]:\n        \"\"\"\n        Returns a dictionary of `argument name: argument specification`\n        \"\"\"\n        pass\n\n    def _checkParams(self):\n        \"\"\"\n        Fills the given params dict with default values where arguments are not given,\n        using None as the default value for default values\n        \"\"\"\n\n        params = self._params()\n        config = self._config()\n\n        for key, value in self.getParams().items():\n            # If we already have it, then we don't need to do anything\n            if key in params:\n                continue\n            # If we don't have it, but it's required, then fail\n            if value.req:\n                raise KeyError(\n                    f\"Missing required param {key} for {type(self).__name__.lower()}\"\n                )\n            # If it's a reference by default, fill that in\n            if value.config_ref is not None:\n                tmp = getattr(config, value.config_ref[0])\n                params[key] = (\n                    tmp[value.config_ref[1:]] if len(value.config_ref) > 1 else tmp\n                )\n            # Otherwise, put in the default value (if it exists)\n            elif value.default is not None:\n                params[key] = value.default\n\n    def _params(self):\n        return self._params_obj\n\n    def _config(self):\n        return self._config_obj\n\n    @abstractmethod\n    def __init__(self, config: Config):\n        self._config_obj = config\n        if self.getParams() is not None:\n            self._params_obj = config.params.setdefault(type(self).__name__.lower(), {})\n            self._checkParams()\n\n\nclass Targeted(ABC):\n    @staticmethod\n    @abstractmethod\n    def getTarget() -> str:\n        \"\"\"Should return the target that this object attacks/decodes\"\"\"\n        pass\n\n\nclass PolymorphicChecker(ConfigurableModule):\n    @abstractmethod\n    def check(self, text) -> Optional[str]:\n        \"\"\"Should return some description (or an empty string) on success, otherwise return None\"\"\"\n        pass\n\n    @abstractmethod\n    def getExpectedRuntime(self, text) -> float:\n        pass\n\n    def __call__(self, *args):\n        return self.check(*args)\n\n    @abstractmethod\n    def __init__(self, config: Config):\n        super().__init__(config)\n\n\nclass Checker(Generic[T], ConfigurableModule):\n    @abstractmethod\n    def check(self, text: T) -> Optional[str]:\n        \"\"\"Should return some description (or an empty string) on success, otherwise return None\"\"\"\n        pass\n\n    @abstractmethod\n    def getExpectedRuntime(self, text: T) -> float:\n        pass\n\n    def __call__(self, *args):\n        return self.check(*args)\n\n    @abstractmethod\n    def __init__(self, config: Config):\n        super().__init__(config)\n\n    @classmethod\n    def convert(cls, expected: Set[type]):\n        class PolyWrapperClass(PolymorphicChecker):\n            @staticmethod\n            def getParams() -> Optional[Dict[str, ParamSpec]]:\n                return cls.getParams()\n\n            def check(self, text) -> Optional[str]:\n                \"\"\"Should return some description (or an empty string) on success, otherwise return None\"\"\"\n                if type(text) not in expected:\n                    return None\n                else:\n                    return self._base.check(text)\n\n            def getExpectedRuntime(self, text) -> float:\n                if type(text) not in expected:\n                    return 0\n                else:\n                    return self._base.getExpectedRuntime(text)\n\n            def __init__(self, config: Config):\n                super().__init__(config)\n                # This is easier than inheritance\n                self._base = cls(config)\n\n        PolyWrapperClass.__name__ = cls.__name__\n\n        return PolyWrapperClass\n\n\n# class Detector(Generic[T], ConfigurableModule, KnownUtility, Targeted):\n#     @abstractmethod\n#     def scoreLikelihood(self, ctext: T) -> Dict[str, float]:\n#         \"\"\"Should return a dictionary of (cipher_name: score)\"\"\"\n#         pass\n#\n#     def __call__(self, *args): return self.scoreLikelihood(*args)\n#\n#     @abstractmethod\n#     def __init__(self, config: Config): super().__init__(config)\n\n\nclass Decoder(Generic[T], ConfigurableModule, Targeted):\n    \"\"\"Represents the undoing of some encoding into a different (or the same) type\"\"\"\n\n    @abstractmethod\n    def decode(self, ctext: T) -> Optional[U]:\n        pass\n\n    @staticmethod\n    @abstractmethod\n    def priority() -> float:\n        \"\"\"What proportion of decodings are this?\"\"\"\n        pass\n\n    def __call__(self, *args):\n        return self.decode(*args)\n\n    @abstractmethod\n    def __init__(self, config: Config):\n        super().__init__(config)\n\n\nclass DecoderComparer:\n    value: Type[Decoder]\n\n    def __le__(self, other: \"DecoderComparer\"):\n        return self.value.priority() <= other.value.priority()\n\n    def __ge__(self, other: \"DecoderComparer\"):\n        return self.value.priority() >= other.value.priority()\n\n    def __lt__(self, other: \"DecoderComparer\"):\n        return self.value.priority() < other.value.priority() and self != other\n\n    def __gt__(self, other: \"DecoderComparer\"):\n        return self.value.priority() > other.value.priority() and self != other\n\n    def __init__(self, value: Type[Decoder]):\n        self.value = value\n\n    def __repr__(self):\n        return f\"<DecoderComparer {self.value}:{self.value.priority()}>\"\n\n\nclass CrackResult(NamedTuple):\n    # TODO consider using Generic[T] again for value's type once\n    # https://bugs.python.org/issue36517 is resolved\n    value: Any\n    key_info: Optional[str] = None\n    misc_info: Optional[str] = None\n\n\nclass CrackInfo(NamedTuple):\n    success_likelihood: float\n    success_runtime: float\n    failure_runtime: float\n\n\nclass Cracker(Generic[T], ConfigurableModule, Targeted):\n    @abstractmethod\n    def getInfo(self, ctext: T) -> CrackInfo:\n        \"\"\"Should return some informed guesses on resource consumption when run on `ctext`\"\"\"\n        pass\n\n    @abstractmethod\n    def attemptCrack(self, ctext: T) -> List[CrackResult]:\n        \"\"\"\n        This should attempt to crack the cipher `target`, and return a list of candidate solutions\n        \"\"\"\n        # FIXME: Actually CrackResult[T], but python complains\n        pass\n\n    def __call__(self, *args):\n        return self.attemptCrack(*args)\n\n    @abstractmethod\n    def __init__(self, config: Config):\n        super().__init__(config)\n\n\nclass ResourceLoader(Generic[T], ConfigurableModule):\n    @abstractmethod\n    def whatResources(self) -> Optional[Set[str]]:\n        \"\"\"\n        Return a set of the names of instances T you can provide.\n        The names SHOULD be unique amongst ResourceLoaders of the same type\n\n        These names will be exposed as f\"{self.__name__}::{name}\", use split_resource_name to recover this\n\n        If you cannot reasonably determine what resources you provide, return None instead\n        \"\"\"\n        pass\n\n    @abstractmethod\n    def getResource(self, name: str) -> T:\n        \"\"\"\n        Returns the requested distribution\n\n        The behavior is undefined if `name not in self.what_resources()`\n        \"\"\"\n        pass\n\n    def __call__(self, *args):\n        return self.getResource(*args)\n\n    def __getitem__(self, *args):\n        return self.getResource(*args)\n\n    @abstractmethod\n    def __init__(self, config: Config):\n        super().__init__(config)\n\n\nclass SearchLevel(NamedTuple):\n    name: str\n    result: CrackResult\n\n    @staticmethod\n    def input(ctext: Any):\n        return SearchLevel(name=\"input\", result=CrackResult(ctext))\n\n\nclass SearchResult(NamedTuple):\n    path: List[SearchLevel]\n    check_res: str\n\n\nclass Searcher(ConfigurableModule):\n    \"\"\"A very basic interface for code that plans out how to crack the ciphertext\"\"\"\n\n    @abstractmethod\n    def search(self, ctext: Any) -> Optional[SearchResult]:\n        \"\"\"Returns the path to the correct ciphertext\"\"\"\n        pass\n\n    @abstractmethod\n    def __init__(self, config: Config):\n        super().__init__(config)\n\n\ndef pretty_search_results(res: SearchResult, display_intermediate: bool = False) -> str:\n    # TODO what is display_intermediate\n    ret: str = \"\"\n    table = Table(show_header=False, box=box.ROUNDED, safe_box=False)\n    # Only print the checker if we need to. Normal people don't know what\n    # \"quadgrams\", \"brandon\", \"json checker\" is.\n    # We print the checker if its regex or another language, so long as it starts with:\n    # \"The\" like \"The plaintext is a Uniform Resource Locator (URL).\"\n    if len(res.check_res) != 0 and (\"The\" == res.check_res[0:3] or \"Passed\" == res.check_res[0:6]):\n        ret += f\"{res.check_res}\\n\"\n\n    def add_one():\n        out = \"\"\n        if i.name == \"utf8\":\n            out += f\"   [#808080]{i.name}[/#808080]\\n\"\n        else:\n            out += f\"   {i.name}\"\n        already_broken = False\n        if i.result.key_info is not None:\n            out += f\":\\n    Key: {i.result.key_info}\\n\"\n            already_broken = True\n        if i.result.misc_info is not None:\n            if not already_broken:\n                out += \":\\n\"\n            out += f\"    Misc: {i.result.misc_info}\\n\"\n            already_broken = True\n        if display_intermediate:\n            if not already_broken:\n                out += \":\\n\"\n            out += f'    Value: \"{i.result.value}\"\\n'\n            already_broken = True\n        if not already_broken:\n            out += \"\\n\"\n        return out, already_broken\n\n    # Skip the 'input' and print in order\n    already_broken = False\n    out = \"\"\n    for i in res.path[1:]:\n        output, already_broken = add_one()\n        out += output\n\n    if out:\n        if len(out.split(\"\\n\")) > 1:\n            ret += \"Formats used:\\n\"\n        else:\n            ret += \"Format used:\\n\"\n        ret += out\n\n    # Remove trailing newline\n    ret = ret[:-1]\n\n    # If we didn't show intermediate steps, then print the final result\n    if already_broken:\n        ret += f\"\"\"\\nPlaintext: [bold green]\"{escape(res.path[-1].result.value)}\"[bold green]\"\"\"\n    else:\n        ret += f\"\"\"Plaintext: [bold green]\"{escape(res.path[-1].result.value)}\"[bold green]\"\"\"\n\n    table.add_row(ret)\n    return table\n\n\n# Some common collection types\nDistribution = Dict[str, float]\nTranslation = Dict[str, str]\nWordList = Set[str]\n"
  },
  {
    "path": "ciphey/iface/_registry.py",
    "content": "from typing import Any, Dict, List, Optional, Set, Tuple, Type, Union\n\ntry:\n    from typing import get_args, get_origin\nexcept ImportError:\n    from typing_inspect import get_origin, get_args\n\nfrom . import _fwd\nfrom ._modules import *\n\n\nclass Registry:\n    # I was planning on using __init_subclass__, but that is incompatible with dynamic type creation when we have\n    # generic keys\n\n    RegElem = Union[List[Type], Dict[Type, \"RegElem\"]]\n\n    _reg: Dict[Type, RegElem] = {}\n    _names: Dict[str, Tuple[Type, Set[Type]]] = {}\n    _targets: Dict[str, Dict[Type, List[Type]]] = {}\n    _modules = {Checker, Cracker, Decoder, ResourceLoader, Searcher, PolymorphicChecker}\n\n    def _register_one(self, input_type, module_base, module_args):\n        if len(module_args) == 0:\n            self._reg.setdefault(module_base, []).append(input_type)\n            return\n\n        target_reg = self._reg.setdefault(module_base, {})\n        # Seek to the given type\n        for subtype in module_args[0:-1]:\n            target_reg = target_reg.setdefault(subtype, {})\n        target_reg.setdefault(module_args[-1], []).append(input_type)\n\n    def _real_register(self, input_type: type, *args) -> Type:\n        name = input_type.__name__.lower()\n        name_target = self._names[name] = (input_type, set())\n\n        if issubclass(input_type, Targeted):\n            target = input_type.getTarget()\n        else:\n            target = None\n\n        if issubclass(input_type, Searcher):\n            module_type = module_base = Searcher\n            module_args = ()\n        else:\n            module_type: Optional[Type] = None\n            module_base = None\n\n            # Work out what module type this is\n            if len(args) == 0 and hasattr(input_type, \"__orig_bases__\"):\n                for i in input_type.__orig_bases__:\n                    if module_type is not None:\n                        raise TypeError(\n                            f\"Type derived from multiple registrable base classes {i} and {module_type}\"\n                        )\n                    module_base = get_origin(i)\n                    if module_base not in self._modules:\n                        continue\n                    module_type = i\n            else:\n                for i in self._modules:\n                    if not issubclass(input_type, i):\n                        continue\n                    if module_type is not None:\n                        raise TypeError(\n                            f\"Type derived from multiple registrable base classes {i} and {module_type}\"\n                        )\n                    module_type = i\n            if module_type is None:\n                raise TypeError(\"No registrable base class\")\n\n            # Replace input type with polymorphic checker if required\n            if issubclass(input_type, Checker):\n                if len(args) == 0:\n                    arg = [\n                        get_args(i)\n                        for i in input_type.__orig_bases__\n                        if get_origin(i) == Checker\n                    ][0]\n                    if len(arg) != 1:\n                        raise TypeError(\"No argument for Checker\")\n                    input_type = input_type.convert({arg[0]})\n                else:\n                    input_type = input_type.convert(set(args))\n                self._register_one(input_type, PolymorphicChecker, [])\n                # Refresh the names with the new type\n                name_target = self._names[name] = (input_type, {PolymorphicChecker})\n\n            # Now handle the difference between register and register_multi\n            if len(args) == 0:\n                if module_type is PolymorphicChecker:\n                    module_base = PolymorphicChecker\n                elif module_base is None:\n                    raise TypeError(\"No type argument given\")\n                self._register_one(input_type, module_base, get_args(module_type))\n                name_target[1].add(module_base)\n            else:\n                if module_base is not None:\n                    raise TypeError(f\"Redundant type argument for {module_type}\")\n                module_base = module_type\n                for module_args in args:\n                    # Correct missing brackets\n                    if not isinstance(module_args, tuple):\n                        module_args = (module_args,)\n\n                    self._register_one(input_type, module_base, module_args)\n                    name_target[1].add(module_type[module_args])\n\n        name_target[1].add(module_type)\n\n        if target is not None and issubclass(module_base, Targeted):\n            self._targets.setdefault(target, {}).setdefault(module_type, []).append(\n                input_type\n            )\n\n        return input_type\n\n    def register(self, input_type):\n        return self._real_register(input_type)\n\n    def register_multi(self, *x):\n        return lambda input_type: self._real_register(input_type, *x)\n\n    def __getitem__(self, i: type) -> Optional[Any]:\n        target_type = get_origin(i)\n        # Check if this is a non-generic type, and return the whole dict if it is\n        if target_type is None:\n            return self._reg[i]\n\n        target_subtypes = get_args(i)\n        target_list = self._reg.setdefault(target_type, {})\n        for subtype in target_subtypes:\n            target_list = target_list.setdefault(subtype, {})\n        return target_list\n\n    def get_named(self, name: str, type_constraint: Type = None) -> Any:\n        ret = self._names[name.lower()]\n        if type_constraint and type_constraint not in ret[1]:\n            raise TypeError(f\"Type mismatch: wanted {type_constraint}, got {ret[1]}\")\n        return ret[0]\n\n    def get_targeted(\n        self, target: str, type_constraint: Type = None\n    ) -> Optional[Union[Dict[Type, Set[Type]], Set[Type]]]:\n        x = self._targets.get(target)\n        if x is None or type_constraint is None:\n            return x\n        return x.get(type_constraint)\n\n    def get_all_names(self) -> List[str]:\n        return list(self._names.keys())\n\n    def __str__(self):\n        return f\"ciphey.iface.Registry {{_reg: {self._reg}, _names: {self._names}, _targets: {self._targets}}}\"\n\n\n_fwd.registry = Registry()\n"
  },
  {
    "path": "ciphey/mathsHelper.py",
    "content": "\"\"\"\r\n ██████╗██╗██████╗ ██╗  ██╗███████╗██╗   ██╗\r\n██╔════╝██║██╔══██╗██║  ██║██╔════╝╚██╗ ██╔╝\r\n██║     ██║██████╔╝███████║█████╗   ╚████╔╝\r\n██║     ██║██╔═══╝ ██╔══██║██╔══╝    ╚██╔╝\r\n╚██████╗██║██║     ██║  ██║███████╗   ██║\r\n© Brandon Skerritt\r\nGithub: brandonskerritt\r\n\r\nClass to provide helper functions for mathematics\r\n(oh, not entirely mathematics either. Some NLP stuff and sorting dicts. It's just a helper class\r\n)\r\n\"\"\"\r\n\r\nfrom collections import OrderedDict\r\nfrom string import punctuation\r\nfrom typing import Optional\r\n\r\nimport logging\r\nfrom rich.logging import RichHandler\r\n\r\n\r\nclass mathsHelper:\r\n    \"\"\"Class to provide helper functions for mathematics and other small things\"\"\"\r\n\r\n    def __init__(self):\r\n        # ETAOIN is the most popular letters in order\r\n        self.ETAOIN = \"ETAOINSHRDLCUMWFGYPBVKJXQZ\"\r\n        self.LETTERS = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\"\r\n\r\n    @staticmethod\r\n    def gcd(a, b) -> int:\r\n        \"\"\"Greatest common divisor.\r\n\r\n        The Greatest Common Divisor of a and b using Euclid's Algorithm.\r\n\r\n        Args:\r\n            a -> num 1\r\n            b -> num 2\r\n\r\n        Returns:\r\n            Returns  GCD(a, b)\r\n\r\n        \"\"\"\r\n        # Return\r\n        while a != 0:\r\n            a, b = b % a, a\r\n        return b\r\n\r\n    @staticmethod\r\n    def mod_inv(a: int, m: int) -> Optional[int]:\r\n        \"\"\"\r\n        Returns the modular inverse of a mod m, or None if it does not exist.\r\n\r\n        The modular inverse of a is the number a_inv that satisfies the equation\r\n        a_inv * a mod m === 1 mod m\r\n\r\n        Note: This is a naive implementation, and runtime may be improved in several ways.\r\n        For instance by checking if m is prime to perform a different calculation,\r\n        or by using the extended euclidean algorithm.\r\n        \"\"\"\r\n        for i in range(1, m):\r\n            if (m * i + 1) % a == 0:\r\n                return (m * i + 1) // a\r\n        return None\r\n\r\n    @staticmethod\r\n    def percentage(part: float, whole: float) -> float:\r\n        \"\"\"Returns percentage.\r\n\r\n        Just a normal algorithm to return the percent.\r\n\r\n        Args:\r\n            part -> part of the whole number\r\n            whole -> the whole number\r\n\r\n        Returns:\r\n            Returns the percentage of part to whole.\r\n\r\n        \"\"\"\r\n        if part <= 0 or whole <= 0:\r\n            return 0\r\n        # works with percentages\r\n        return 100 * float(part) / float(whole)\r\n\r\n    def sort_prob_table(self, prob_table: dict) -> dict:\r\n        \"\"\"Sorts the probability table.\r\n\r\n        Sorts a dictionary of dictionaries (and all the sub-dictionaries).\r\n\r\n        Args:\r\n            prob_table -> The probability table returned by the neural network to sort.\r\n\r\n        Returns:\r\n            Returns the prob_table, but sorted.\r\n\r\n        \"\"\"\r\n        # for each object: prob table in dictionary\r\n        max_overall: int = 0\r\n        max_dict_pair: dict = {}\r\n        highest_key = None\r\n        empty_dict: dict = {}\r\n        # sorts the prob table before we find max, and converts it to order dicts\r\n        for key, value in prob_table.items():\r\n            prob_table[key] = self.new_sort(value)\r\n            prob_table[key] = dict(prob_table[key])\r\n\r\n        # gets maximum key then sets it to the front\r\n        counter_max: int = 0\r\n        counter_prob: int = len(prob_table)\r\n        while counter_max < counter_prob:\r\n            max_overall = 0\r\n            highest_key = None\r\n            logging.debug(\r\n                f\"Running while loop in sort_prob_table, counterMax is {counter_max}\"\r\n            )\r\n            for key, value in prob_table.items():\r\n                logging.debug(f\"Sorting {key}\")\r\n                maxLocal = 0\r\n                # for each item in that table\r\n                for key2, value2 in value.items():\r\n                    logging.debug(\r\n                        f\"Running key2 {key2}, value2 {value2} for loop for {value.items()}\"\r\n                    )\r\n                    maxLocal = maxLocal + value2\r\n                    logging.debug(\r\n                        f\"MaxLocal is {maxLocal} and maxOverall is {max_overall}\"\r\n                    )\r\n                    if maxLocal > max_overall:\r\n                        logging.debug(f\"New max local found {maxLocal}\")\r\n                        # because the dict doesn't reset\r\n                        max_dict_pair = {}\r\n                        max_overall = maxLocal\r\n                        # so eventually, we get the maximum dict pairing?\r\n                        max_dict_pair[key] = value\r\n                        highest_key = key\r\n                        logging.debug(f\"Highest key is {highest_key}\")\r\n                # removes the highest key from the prob table\r\n            logging.debug(\r\n                f\"Prob table is {prob_table} and highest key is {highest_key}\"\r\n            )\r\n            logging.debug(f\"Removing {prob_table[highest_key]}\")\r\n            del prob_table[highest_key]\r\n            logging.debug(f\"Prob table after deletion is {prob_table}\")\r\n            counter_max += 1\r\n            empty_dict = {**empty_dict, **max_dict_pair}\r\n\r\n        # returns the max dict (at the start) with the prob table\r\n        # this way, it should always work on most likely first.\r\n        logging.debug(\r\n            f\"The prob table is {prob_table} and the maxDictPair is {max_dict_pair}\"\r\n        )\r\n        logging.debug(f\"The new sorted prob table is {empty_dict}\")\r\n        return empty_dict\r\n\r\n    @staticmethod\r\n    def new_sort(new_dict: dict) -> dict:\r\n        \"\"\"Uses OrderedDict to sort a dictionary.\r\n\r\n        I think it's faster than my implementation.\r\n\r\n        Args:\r\n            new_dict -> the dictionary to sort\r\n\r\n        Returns:\r\n            Returns the dict, but sorted.\r\n\r\n        \"\"\"\r\n        # (f\"d is {d}\")\r\n        logging.debug(f\"The old dictionary before new_sort() is {new_dict}\")\r\n        sorted_i = OrderedDict(\r\n            sorted(new_dict.items(), key=lambda x: x[1], reverse=True)\r\n        )\r\n        logging.debug(f\"The dictionary after new_sort() is {sorted_i}\")\r\n        # sortedI = sort_dictionary(x)\r\n        return sorted_i\r\n\r\n    @staticmethod\r\n    def is_ascii(s: str) -> bool:\r\n        \"\"\"Returns the boolean value if is_ascii is an ascii char.\r\n\r\n        Does what it says on the tree. Stolen from\r\n        https://stackoverflow.com/questions/196345/how-to-check-if-a-string-in-python-is-in-ascii\r\n\r\n        Args:\r\n            s -> the char to check.\r\n\r\n        Returns:\r\n            Returns the boolean of the char.\r\n\r\n        \"\"\"\r\n\r\n        return bool(lambda s: len(s) == len(s.encode()))\r\n\r\n    @staticmethod\r\n    def strip_punctuation(text: str) -> str:\r\n        \"\"\"Strips punctuation from a given string.\r\n\r\n        Uses string.punctuation.\r\n\r\n        Args:\r\n            text -> the text to strip punctuation from.\r\n\r\n        Returns:\r\n            Returns string without punctuation.\r\n        \"\"\"\r\n        text: str = (str(text).translate(str.maketrans(\"\", \"\", punctuation))).strip(\r\n            \"\\n\"\r\n        )\r\n        return text\r\n"
  },
  {
    "path": "codecov.yml",
    "content": "codecov:\n  require_ci_to_pass: yes\n\ncoverage:\n  precision: 2\n  round: down\n  range: \"40...50\"\n  status:\n    patch: no\n    changes: no\n    project:\n      default:\n        threshold: 2%\n        paths: \n        - \"ciphey\"\n\nparsers:\n  gcov:\n    branch_detection:\n      conditional: yes\n      loop: yes\n      method: no\n      macro: no\n\ncomment:\n  layout: \"reach,diff,flags,tree\"\n  behavior: default\n  require_changes: no\n"
  },
  {
    "path": "license",
    "content": "Copyright 2020 Brandon Skerritt\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE."
  },
  {
    "path": "noxfile.py",
    "content": "\"\"\"\nThe file for Nox\n\"\"\"\nfrom typing import Any\n\nimport nox\nfrom nox.sessions import Session\n\nlocations = \"ciphey/\", \"tests/\", \"docs/\"\nnox.options.sessions = [\"tests\"]\npackage = \"ciphey\"\n\n\ndef install_with_constraints(session: Session, *args: str, **kwargs: Any) -> None:\n    \"\"\"Install packages constrained by Poetry's lock file.\n    This function is a wrapper for nox.sessions.Session.install. It\n    invokes pip to install packages inside of the session's virtualenv.\n    Additionally, pip is passed a constraints file generated from\n    Poetry's lock file, to ensure that the packages are pinned to the\n    versions specified in poetry.lock. This allows you to manage the\n    packages as Poetry development dependencies.\n    Arguments:\n        session: The Session object.\n        args: Command-line arguments for pip.\n        kwargs: Additional keyword arguments for Session.install.\n    \"\"\"\n    session.run(\n        \"poetry\",\n        \"export\",\n        \"--dev\",\n        \"--format=requirements.txt\",\n        \"--output=requirements.txt\",\n        external=True,\n    )\n    session.install(\"--constraint=requirements.txt\", *args, **kwargs)\n\n\n# noxfile.py\n@nox.session\ndef black(session):\n    args = session.posargs or locations\n    session.install(\"black\")\n    session.run(\"black\", *args)\n\n\n@nox.session(python=\"3.8\")\ndef coverage(session: Session) -> None:\n    \"\"\"Upload coverage data.\"\"\"\n    install_with_constraints(session, \"coverage[toml]\", \"codecov\")\n    session.run(\"pip3\", \"install\", \"cipheydists\")\n    session.run(\"coverage\", \"xml\", \"--fail-under=0\")\n    session.run(\"codecov\", *session.posargs)\n\n\n# noxfile.py\n@nox.session\ndef docs(session: Session) -> None:\n    \"\"\"Build the documentation.\"\"\"\n    install_with_constraints(session, \"sphinx\")\n    session.run(\"sphinx-build\", \"docs\", \"docs/_build\")\n\n\n@nox.session\ndef tests(session):\n    session.run(\"pip3\", \"install\", \"cipheydists\")\n    session.run(\"poetry\", \"install\", external=True)\n    session.run(\"poetry\", \"run\", \"pytest\", \"--cov=ciphey\")\n"
  },
  {
    "path": "pyproject.toml",
    "content": "[tool.poetry]\nname = \"ciphey\"\nversion = \"5.14.1\"\ndescription = \"Automated Decryption Tool\"\nauthors = [\"Brandon <brandon@skerritt.blog>\"]\nlicense = \"MIT\"\ndocumentation = \"https://github.com/Ciphey/Ciphey/wiki\"\nexclude = [\"tests/hansard.txt\"]\nreadme = \"README.md\"\n\n[tool.poetry.dependencies]\npython = \"^3.7\"\nrich = \">=4,<11\"\npyyaml = \">=5.3.1,<7.0.0\"\npylint = \"^2.6.0\"\nflake8 = \">=3.8.4,<5.0.0\"\ncipheydists = \"^0.3.35\"\ncipheycore = \"^0.3.2\"\nappdirs = \"^1.4.4\"\ntyping_inspect = { version = \">=0.6,<0.8\", python = \"~3.7\" }\nbase58 = \"^2.0.1\"\nbase91 = \"^1.0.1\"\npybase62 = \">=0.4.3,<0.6.0\"\nclick = \">=7.1.2,<9.0.0\"\nmock = \"^4.0.3\"\npywhat = \"3.0.0\"\nxortool-ciphey = \"^0.1.16\"\n\n[tool.poetry.dev-dependencies]\npytest-cov = \"^3.0.0\"\npytest = \"^7.1.2\"\nblack = \"^21.4b2\"\nneovim = \"^0.3.1\"\ncodecov = \"^2.1.11\"\nsphinx = \"^5.0.1\"\nsphinx-autodoc-typehints = \"^1.11.1\"\nnltk = \"^3.5\"\n\n[tool.poetry.scripts]\nciphey = 'ciphey.ciphey:main'\n[build-system]\nrequires = [\"poetry-core\"]\nbuild-backend = \"poetry.core.masonry.api\"\n\n"
  },
  {
    "path": "tests/__init__.py",
    "content": ""
  },
  {
    "path": "tests/brandon_interface.md",
    "content": "\nIf I'm reading this correctly:\n> I would suggest a simple lower bound test: we pass if we get more than 25%,and fail if we get lower than 5% (or smth idk) for n consecutive windows.\nYou're suggesting that we run all tests and see if we get 25% Imo that would be much slower. What do you mean by `n windows`?\n\nOkay, Chi squared is out then! \n\n> Perhaps we can return an object from the cracker which states what tests have been performed, to save time on redundant analysis. With such information, brandon could make an intelligent decision to just use a wordlist if enough analysis was performed, and the more detailed analysis if it wasn't.\nThis is entirely possible. I will add support to `brandon` checker to skip phase 1 if it receives an dictionary with key `\"phase1\": True` for `True == skip phase 1`. \n\nIf you have more tests, let me know and I can factor them in.\n\nIn your first reply:\nhttps://github.com/Ciphey/Ciphey/issues/90#issuecomment-645046918\nPoint 3:\n> Be aware that the stuff passed to the checker will most likely be complete gibberish (with a similar freq dist) OR the correct result. A user will not care about an extra second spent on the final correct result, but really will care that every false candidate takes an extra second. The current suggestion seems to be pessimal for the gibberish inputs: maybe add some sanity checks (have I failed to match any word, have I failed to lemmatize any word, etc.)\n\nI decided to test how well `lem` worked as phase 1. To do this, I created this program:\n```python\n\"\"\"\nTL;DR\n\nTested over 20,000 times\n\nMaximum sentence size is 15 sentences\n1/2 chance of getting 'gibberish' (encrypted text)\n1/2 chance of getting English text\n\nEach test is timed using Time module.\nThe accuracy is calculated as to how many true positives we get over the entire run\n\n\"\"\"\n\n\nimport spacy\nimport random\nimport time\nfrom statistics import mean\nimport enciphey\nfrom alive_progress import alive_bar\n\nnlp = spacy.load(\"en_core_web_sm\")\n\nf = open(\"hansard.txt\", encoding=\"ISO-8859-1\").read()\nf = f.split(\".\")\n\nenciph = enciphey.encipher()\n\n\ndef lem(text):\n    sentences = nlp(text)\n    return set([word.lemma_ for word in sentences])\n\n\ndef get_random_sentence():\n    if random.randint(0, 1) == 0:\n        x = None\n        while x is None:\n            x = (True, \" \".join(random.sample(f, k=random.randint(1, 50))))\n        return x\n    else:\n        x = None\n        while x is None:\n            x = enciph.getRandomEncryptedSentence()\n            x = x[\"Encrypted Texts\"][\"EncryptedText\"]\n        return (False, x)\n\n\n# Now to time it and take measurements\n\n\ndef perform():\n    # calculate accuracy\n    total = 0\n    true_returns = 0\n\n    # calculate average time\n    time_list = []\n\n    # average sentence size\n    sent_size_list = []\n    items = range(20000)\n    with alive_bar(len(items)) as bar:\n        for i in range(0, 20000):\n            sent = get_random_sentence()\n            text = sent[1]\n            truthy = sent[0]\n            sent_size_list.append(len(text))\n\n            # should be length of chars\n            old = len(text)\n\n            # timing the function\n            tic = time.perf_counter()\n            new = lem(text)\n            tok = time.perf_counter()\n\n            # checking for accuracy\n            new = len(new)\n            # the and here means we only count True Positives\n            if new < old and truthy:\n                true_returns += 1\n            total += 1\n\n            # appending the time\n            t = tok - tic\n            time_list.append(t)\n            bar()\n\n    print(\n        f\"The accuracy is {str((true_returns / total) * 100)} \\n and the time it took is {str(round(mean(time_list), 2))}. \\n The average string size was {str(mean(sent_size_list))}\"\n    )\n\n\nperform()\n```\n\nThe results were fascinating, to say the least.\nWith a 50/50 chance of the text being gibberish (ciphertext from enCiphey) or sentences from Hansard.txt, we had these results for using lemmatization as phase 1:\n\n```\nThe accuracy is 49.63%\n and the time it took is 0.02 seconds on average.\n The average string size was 1133.63255.\n```\n\n**We get a 50% accuracy with a speed of 0.02 seconds on average, across 20k tests with the average size of a string being 1133 chars. **\n\nThe accuracy is quite bad considering that a coin flip is 50/50.\nOn average, the user would expect Phase 2 to be entered 50% of the time, which is annoying as phase 2 is quite slow. But by itself it's quite fast.\n\nI am going to build the \"2nd phase\" of phase 1 using the While Loop we saw earlier. If we can combine just one more metric, we would see much higher accuracy and again - likely incredibly low latency.\n\nI will create a table of my results:\n\n## Table of max sentence length == 50\n\n| Name                       | Speed                        | Accuracy | String Size Average Chars | Epochs | Max Sentence Size |\n| -------------------------- | ---------------------------- | -------- | ------------------------- | ------ | ----------------- |\n| Lemmatization (lem)        | 0.02 seconds                 | 50%      | 1580                      | 20,000 | 50                |\n| Stop word removal          | 3.05465052884756e-05 seconds | 96%      | 1596                      | 20,000 | 50                |\n| Check1000Words             | 0.0005 seconds               | 96%      | 1597                      | 20,000 | 50                |\n| Word endings               | 0.0009 seconds               | 95%      | 1597                      | 20,000 | 50                |\n\n## Table of max sentence length == 5\n\n| Name                       | Speed                          | Accuracy | String Size Average Chars | Epochs | Max Sentence Size |\n| -------------------------- | ------------------------------ | -------- | ------------------------- | ------ | ----------------- |\n| Lemmatization (lem)          |\n| Stop word removal          | 1.1574924453998391e-05 seconds | 93%      | 569                       | 20,000 | 5                 |\n| Check1000Words             | 0.0006 seconds                 | 95%      | 586                       | 20,000 | 5                 |\n| Word endings               | 0.0003 seconds                 | 92%      | 482                       | 20,000 | 5                 |\n## Table of max sentence length == 1\n\n| Name                       | Speed                           | Accuracy | Threshold | String Size Average Chars | Epochs | Max Sentence Size |\n| -------------------------- | ------------------------------- | -------- | ------ |------------------------- | ------ | ----------------- |\n| Lemmatization (lem)          |\n| Stop word removal          | 1.2532061150591289e-05. seconds | 50%      | 481                       | 20,000 | 1                 |\n| Check1000Words             | 0.0006 seconds                  | 95%      | 586                       | 20,000 | 5                 |\n| Word endings               | 0.0002 seconds                  | 86%      | 15| 482                       | 20,000 | 1                 |\n\n\n## Confusion Matrices & Notes\n### Lemmatization\n\n```\n                Positive    Negative\nPositive     10031      9967\nNegative     2            0\n```\n\n\n### Stop Words\nThis test was performed where the text was not `.lower()`, so the actual accuracy _may_ be a little tiny bit higher since the stop words list is all lowercase.\n\n50 sentence limit\n\n```\n                        Positive    Negative\n            Positive     9913            855\n            Negative     56            9176\n```\n\n5 sentence limit:\n\n```\n                        Positive    Negative\n            Positive     9513            967\n            Negative     530            8990\n```\n\n### Check 1000 words\n\n50 sentence limit\n\n```\n                           Positive    Negative\n            Positive     10008            552\n            Negative     56            9384\n```\n\n5 sentence limit\n\n```\n                        Positive    Negative\n            Positive     9563            597\n            Negative     397            9443\n```\n\n# Analysis\n**I believe that the best Brandon checker will look at the length of the text, and adjust the % threshold and the exact phase 1 checker per text.**\n\nThe below data is taken from calculations performed over many hours. it shows the best threshold % for the best phase 1 checker with the highest accuracy. These checkers were chosen as others showed a maximum accuracy of 58%.\n\n```\n{'check 1000 words': {1: {'Accuracy': 0.925, 'Threshold': 2},\n                      2: {'Accuracy': 0.95, 'Threshold': 68},\n                      3: {'Accuracy': 0.975, 'Threshold': 62},\n                      4: {'Accuracy': 0.98, 'Threshold': 5},\n                      5: {'Accuracy': 0.985, 'Threshold': 54}},\n 'stop words': {1: {'Accuracy': 0.865, 'Threshold': 50},\n                2: {'Accuracy': 0.93, 'Threshold': 19},\n                3: {'Accuracy': 0.965, 'Threshold': 15},\n                4: {'Accuracy': 0.97, 'Threshold': 28},\n                5: {'Accuracy': 0.985, 'Threshold': 29}}\n```\n\nWhere the numbers are:\n\n```\n1 : The mean is 87.62\n2 : The mean is 110.47925\n3 : The mean is 132.20016666666666\n4 : The mean is 154.817125\n5 : The mean is 178.7297\n```\n\nLooking at this test, it is clear that stopwords is better than check 1000 words for speed, but the accuracy is a little bit slower. Stop words is incredibly faster than check 1k words, but on a smaller input the stopwords checker breaks.\n\nTherefore, we should use stopword checker on larger texts, and check 1k words on smaller texts.\n\nMore specifically, stopwords checker for len == 110 has an optimal threshold of 19, whereas check 1k words has an optimal threshold of 68. This means that while stopwords can potentially end earlier and only search the first 19% of the list, check 1k words would search 68% of the list.\n\nStopwords has a lower accuracy by 2%, but it is much, much faster and its optimal threshold is greatly reduced. \n\nSo ideally, we would have this algorithm:\n1. Sentence length less than 110:\n   1. Use check 1k words with threshold of 2%\n2. Sentence length > 110:\n   1. use Stopwords with threshold of 15\n3. Sentence length > 150:\n   1. Stopwords threshold increases to 28\n   \nThis is the ideal optimal phase 1 algorithm for `brandon` checker.\n\n# Phase 2\n\nPhase 2 is the dictionary checker.\n\nFirstly, we check to find the best thresholds for the dictionary checker. \n\n```\n'checker': {1: {'Accuracy': 0.97, 'Threshold': 99},\n             2: {'Accuracy': 0.98, 'Threshold': 98},\n             3: {'Accuracy': 0.965, 'Threshold': 68},\n             4: {'Accuracy': 0.99, 'Threshold': 93},\n             5: {'Accuracy': 0.97, 'Threshold': 92}},\n```\nThe accuracies are good, but the thresholds are simply too high. We're overfitting!\n\nTo fix this, I thought that because the dictionary contained chars <= 2 such as \"a\" or \"an\" it was setting off the completion too much, resulting in a much higher threshold.\n\nTo fix this, I only let the checker consider words that are more then 2 chars.\n\nThis is the result:\n```\n 'checker': {1: {'Accuracy': 0.965, 'Threshold': 60},\n             2: {'Accuracy': 0.98, 'Threshold': 77},\n             3: {'Accuracy': 0.985, 'Threshold': 67},\n             4: {'Accuracy': 0.985, 'Threshold': 99},\n             5: {'Accuracy': 0.98, 'Threshold': 47}},\n```\nThe accuracy stayed around the same, but the threshold went down. Although the threshold was still kind of high. 99% threshold for 4? I restricted the threshold to 75% and:\n\n```\n'checker': {1: {'Accuracy': 0.945, 'Threshold': 66},\n             2: {'accuracy': 0.975, 'threshold': 69},\n             3: {'accuracy': 0.98, 'threshold': 71},\n             4: {'accuracy': 0.99, 'threshold': 65},\n             5: {'accuracy': 0.98, 'threshold': 38}},\n```\n\nWe can see that the accuracy stayed roughly the same, but the threshold went down a lot. The mean appears to be 66% (from just looking at it).\n\nHowever, the accuracy for smaller sentence sizes tanked.\n\nThe highest accuracy we had was with the original one. Words <= 2 chars and no limit on threshold. \n\nIf possible, we want to combine the high accuracy on smaller texts while maintaining the generalization found in the latter checker results.\n\nThe reason we want a smaller threshold is that due to the chunking procedure, it will be much faster on larger texts. The lower the sentence length the higher the threshold is allowed to be.\n\nFor phase 2, we are not concerned with speed. We are however concerned with accuracy.\n\nI believe that threshold > 90% is overfitting. I cannot reasonably see this successfully working within Ciphey itself.\n\nMy next test will be max threshold of 100% with no chars less than or equal to 1.\n\n```\n 'checker': {1: {'Accuracy': 0.97, 'Threshold': 93},\n             2: {'Accuracy': 0.975, 'Threshold': 82},\n             3: {'Accuracy': 0.97, 'Threshold': 96},\n             4: {'Accuracy': 0.965, 'Threshold': 31},\n             5: {'Accuracy': 0.965, 'Threshold': 74}},\n```\nthe accuracy is 97% with a threshold of 93. This is much higher than the latter test. I think for lower texts, since we don't care about speed, we should use a higher threshold. This test was ran 20,000 times. I will run the tests once much to see if the threshold significantly changes.\n\nThe test results were:\n```\n 'checker': {1: {'Accuracy': 0.96, 'Threshold': 92},\n             2: {'Accuracy': 0.97, 'Threshold': 95},\n             3: {'Accuracy': 0.965, 'Threshold': 81},\n             4: {'Accuracy': 0.96, 'Threshold': 38},\n             5: {'Accuracy': 0.975, 'Threshold': 52}},\n```\n\nOne last test. No threshold limit with no char limit.\n```\n 'checker': {1: {'Accuracy': 0.98, 'Threshold': 92},\n             2: {'Accuracy': 0.99, 'Threshold': 91},\n             3: {'Accuracy': 0.97, 'Threshold': 83},\n             4: {'Accuracy': 0.97, 'Threshold': 71},\n             5: {'Accuracy': 0.975, 'Threshold': 74}},\n```\n\nIn total, we want these ones:\n\n```\n{1: {'Accuracy': 0.98, 'Threshold': 92},\n2: {'accuracy': 0.975, 'threshold': 69},\n3: {'accuracy': 0.98, 'threshold': 71},\n4: {'accuracy': 0.99, 'threshold': 65},\n5: {'accuracy': 0.98, 'threshold': 38}},\n^^ with 75% threshold limit\n```\n\nLower thresholds, accuracies look good too.\n\n\n\t\n\n \n\n"
  },
  {
    "path": "tests/cli.py",
    "content": "import subprocess\nfrom sys import exit\n\nresult = subprocess.check_output([\"ciphey\", \"-q\", \"-t 'hello'\"])\n\nif \"hello\" in result:\n    exit(0)\nelse:\n    exit(1)\n"
  },
  {
    "path": "tests/dict.py",
    "content": "import unittest\n\nimport logging\nfrom rich.logging import RichHandler\n\nfrom ciphey.basemods.Checkers.brandon import Brandon\n\nconfig = dict()\nlc = config[\"checker\"](config)\n\nlogging.remove()\n\n\nclass testDictionary(unittest.TestCase):\n    def test_english_yes(self):\n        dc = Brandon()\n        result = dc.confirmlanguage(\n            \"hello again my friend this is my name and I like dogs!\", \"English\"\n        )\n        self.assertEqual(result, True)\n\n    def test_english_yes_two(self):\n        dc = Brandon()\n        result = dc.confirmlanguage(\n            \"hello my name is brandon and this is a normal english text timtable fuse kindle hormone\",\n            \"English\",\n        )\n        self.assertEqual(result, True)\n\n    def test_english_false(self):\n        dc = Brandon()\n        result = dc.confirmlanguage(\"jdajj kop9u0r 9jjidasjp\", \"English\")\n        self.assertEqual(result, False)\n\n    def test_english_false_two(self):\n        dc = Brandon()\n        result = dc.confirmlanguage(\n            \"pink jdajj red 9jjidasjp october whisky odiajdq\", \"English\"\n        )\n        self.assertEqual(result, True)\n\n    # def test_english_percentage(self):\n    #     dc = Brandon()\n    #     result = dc.confirmlanguage(\n    #         \"The password for my computer is tyu456q and the username is admin\",\n    #         \"English\",\n    #     )\n    #     self.assertEqual(dc.languagePercentage, 90.0)\n\n    def test_english_perfect(self):\n        dc = Brandon()\n        result = dc.confirmlanguage(\n            \"Archimedes famously said: “Give me a lever long enough and a fulcrum on which to place it, and I shall move the world.” But what we are talking about here is not physical leverage. It is the leverage of ideas. When you create content, people can access your knowledge without taking your time. You no longer need to sell knowledge by the hour. Your ideas are the most valuable currency in a knowledge-driven economy. Just as an investment account allows your money to grow day and night without your involvement, content does the same with your ideas. Until recently, the average person wasn’t able to publish and distribute their ideas at a reasonable cost. But on the Internet, anybody, in any corner of the world, in any time zone, can access your best thinking. 24 hours a day. 7 days a week. 365 days a year. When you publish ideas, you create your own “Serendipity Vehicle” – a magnet for ideas and people and opportunities from potentially every corner of the globe. If your ideas resonate with people, people will discover you and bring you unexpected opportunities. They’ll open doors you never knew existed.\",\n            \"English\",\n        )\n        self.assertEqual(result, True)\n"
  },
  {
    "path": "tests/enciphey.py",
    "content": "import base64\nimport binascii\nimport random\nimport re\nimport string\n\nimport base58\nimport base62\nimport cipheycore\nimport cipheydists\nimport nltk\nfrom nltk.tokenize.treebank import TreebankWordDetokenizer\n\n\nclass encipher:\n\n    \"\"\"Generates encrypted text. Used for the NN and test_generator\"\"\"\n\n    def __init__(self):  # pragma: no cover\n        \"\"\"Inits the encipher object \"\"\"\n        self.text = self.read_text()\n        self.MAX_SENTENCE_LENGTH = 5\n        self.crypto = encipher_crypto()\n\n    def read_text(self):  # pragma: no cover\n        f = open(\"hansard.txt\", encoding=\"ISO-8859-1\")\n        x = f.read()\n        splits = nltk.tokenize.sent_tokenize(x)\n        return splits\n\n    def getRandomSentence(self, size):  # pragma: no cover\n        return TreebankWordDetokenizer().detokenize(\n            random.sample(self.text, random.randint(1, size))\n        )\n\n    def getRandomEncryptedSentence(self, size):  # pragma: no cover\n        sents = self.getRandomSentence(size)\n\n        sentsEncrypted = self.crypto.randomEncrypt(sents)\n        return {\"PlainText Sentences\": sents, \"Encrypted Texts\": sentsEncrypted}\n\n\nclass encipher_crypto:  # pragma: no cover\n\n    \"\"\"Holds the encryption functions\n    can randomly select an encryption function  use on text\n    returns:\n        {\"text\": t, \"plaintext\": c, \"cipher\": p, \"succeeds\": False}\n\n    where succeeds is whether or not the text is really encrypted or falsely decrypted\n\n    Uses Cyclic3's module  generate pseudo random text\"\"\"\n\n    def __init__(self):  # pragma: no cover\n        self.methods = [\n            self.Base64,\n            self.Ascii,\n            self.Base16,\n            self.Base32,\n            self.Binary,\n            self.Hex,\n            self.MorseCode,\n            self.Reverse,\n            self.Vigenere,\n            self.base58_bitcoin,\n            self.base58_ripple,\n            self.b62,\n        ]\n        self.morse_dict = dict(cipheydists.get_translate(\"morse\"))\n        self.letters = string.ascii_lowercase\n        self.group = cipheydists.get_charset(\"english\")[\"lcase\"]\n\n    # pragma: no cover\n    def random_key(self, text) -> str:  # pragma: no cover\n        if len(text) < 8:\n            length = 3\n        else:\n            length = 8\n        return self.random_string(length)\n\n    def random_string(self, length) -> str:  # pragma: no cover\n        return \"\".join(random.sample(self.letters, length))\n\n    def randomEncrypt(self, text: str) -> str:  # pragma: no cover\n        \"\"\"Randomly encrypts string with an encryption\"\"\"\n        func__use = random.choice(self.methods)\n        encryptedText = func__use(text)\n        name = func__use.__name__\n\n        return {\"PlainText\": text, \"EncryptedText\": encryptedText, \"CipherUsed\": name}\n\n    def Base64(self, text: str) -> str:  # pragma: no cover\n        \"\"\"Turns text into Base64 using Python library\n\n        args:\n            text -> text  convert\n\n        returns:\n            text -> as Base64\"\"\"\n        return base64.b64encode(bytes(text, \"utf-8\")).decode(\"utf-8\")\n\n    def Caesar(self, s, k):  # pragma: no cover\n        \"\"\"Iterates through each letter and constructs the cipher text\"\"\"\n        new_message = \"\"\n        facr = k % 26\n        for c in s:\n            new_message += self.apply_rotation(c, facr)\n        return new_message\n\n    def apply_rotation(self, c, facr):  # pragma: no cover\n        \"\"\"Applies a shift of facr  the letter denoted by c\"\"\"\n        if c.isalpha():\n            lower = ord(\"A\") if c.isupper() else ord(\"a\")\n            c = chr(lower + ((ord(c) - lower + facr) % 26))\n        return c\n\n    def Base32(self, text: str) -> str:  # pragma: no cover\n        \"\"\"Turns text in Base32 using Python library\n\n        args:\n            text -> text  convert\n\n        returns:\n            text -> as Base32\"\"\"\n        return base64.b32encode(bytes(text, \"utf-8\")).decode(\"utf-8\")\n\n    def Base16(self, text: str) -> str:  # pragma: no cover\n        \"\"\"Turns text in Base16 using Python library\n\n        args:\n            text -> text  convert\n\n        returns:\n            text -> as Base16\"\"\"\n        return base64.b16encode(bytes(text, \"utf-8\")).decode(\"utf-8\")\n\n    def Binary(self, text: str) -> str:  # pragma: no cover\n        return \" \".join(format(ord(x), \"b\") for x in text)\n\n    # pragma: no cover\n    def Ascii(self, text: str) -> str:  # pragma: no cover\n        res = [ord(c) for c in text]\n        return \" \".join([str(x) for x in res])\n\n    def Hex(self, text: str) -> str:  # pragma: no cover\n        return binascii.hexlify(text.encode()).decode(\"utf-8\")\n\n    def MorseCode(self, text: str) -> str:  # pragma: :wno cover\n        morse = []\n        for i in text:\n            m = self.morse_dict.get(i.upper())\n            if m is None:\n                m = \"\"\n            morse.append(m)\n\n        output = morse\n        # output = \" \".join(MORSE_CODE_DICT.get(i.upper()) for i in text)\n\n        return \" \".join(output)\n\n    def Reverse(self, text: str) -> str:\n        return text[::-1]\n\n    def Vigenere(self, plaintext):\n        key = self.vig_key(plaintext, self.random_key(plaintext))\n        cipheycore.vigenere_encrypt(plaintext, key, self.group)\n\n    def vig_key(self, msg, key):\n        tab = dict()\n        for counter, i in enumerate(self.group):\n            tab[self.group[counter]] = counter\n\n        real_key = []\n        for i in key:\n            real_key.append(tab[i])\n        return real_key\n        # vigenere_encrypt(msg, real_key, group)\n\n    def base58_bitcoin(self, text: str):\n        return base58.b58encode(bytes(text, \"utf-8\")).decode(\"utf-8\")\n\n    def base58_ripple(self, text: str):\n        return base58.b58encode(\n            bytes(text, \"utf-8\"), alphabet=base58.RIPPLE_ALPHABET\n        ).decode(\"utf-8\")\n\n    def b62(self, text: str):\n        return base62.decode(str(re.sub(r\"[^A-Za-z1-9]+\", \"\", text)))\n"
  },
  {
    "path": "tests/generate_tests.py",
    "content": "\"\"\"\nCreate a class that can generate encryptions that ciphey can decrypt\nThis class takes a random string from a large corpus of data and returns it as :\n{\"Cipher\": c, \"Plaintext\": p, \"CipherUsed\": cu, \"Succeeds\": true}\n\nIt would also be good if it could return randomly generate text / plaintext too, so we can get some failure test cases.\n\nThis class is used to create the class that contains the tests.\nSo it'll have a format like:\n\ndef test_description(self):\n        assert(t, equal)\nwhere t is the decrypted text from Ciphey, and equal is the decrypted text.\n\nSo this function does like:\n\nfor i in range(1, 20000):\n    grabCipher = grabCipher()\n    # this returns a random cipher, encrypted text and plaintext combo\n    toAppend ='''\n    def test_{cipher}_{succeeds}_{plaintext[0:10]}(textToTest):\n        cipheyObj = ciphey(text)\n        output = cipheyObj.decrypt()\n        assert(output, {plaintext})\n    '''\n    file.append()\n\"\"\"\nimport random\nimport string\n\nimport enciphey\nfrom rich.progress import track\n\n\nclass test_generator:\n    def __init__(self):\n        self.HOW_MANY_TESTS = 30\n        self.enCiphey_obj = enciphey.encipher()\n\n    def main(self):\n        with open(\"test_main_generated.py\", \"w\") as f:\n            f.write(\"from ciphey.__main__ import main, make_default_config\")\n            print(\"Opened fild\")\n            for i in track(range(1, self.HOW_MANY_TESTS)):\n                print(\"In the for loop\")\n                x = self.enCiphey_obj.getRandomEncryptedSentence()\n                print(x)\n                # if x[\"CipherUsed\"] == \"MorseCode\":\n                # self.make_test_lc_true_template(cipher=x)\n                to_append = self.make_test_lc_true_template(cipher=x)\n                print(f\"Adding {to_append}\")\n                f.write(to_append)\n\n    def make_test_true_template(self, cipher):\n        id = self.randomString(8)\n        return f\"\"\"\ndef test_{cipher['Encrypted Texts']['CipherUsed']}_{id}():\n    # {cipher}\n    res = ciphey.main('''{cipher['Encrypted Texts']['EncryptedText']}''', config={\"offline\": True})\n    assert(res == {cipher['Encrypted Texts']['PlainText']})\n        \"\"\"\n\n    def make_test_lc_true_template(self, cipher):\n        id = self.randomString(8)\n        return f\"\"\"\ndef test_{cipher['Encrypted Texts']['CipherUsed']}_{id}():\n    # {cipher}\n    cfg = make_default_config('''{cipher['Encrypted Texts']['EncryptedText']}''')\n    cfg[\"debug\"] = \"TRACE\"\n    result = main(cfg)\n\n    assert result[\"IsPlaintext?\"] == True\n\"\"\"\n\n    def randomString(self, stringLength):\n        letters = string.ascii_letters\n        return \"\".join(random.choice(letters) for i in range(stringLength))\n\n\nt = test_generator()\nt.main()\n\n\n# return {\"PlainText\": text, \"EncryptedText\": encryptedText, \"CipherUsed\": name}\n"
  },
  {
    "path": "tests/integration.py",
    "content": "import unittest\n\nimport logging\nfrom rich.logging import RichHandler\n\nfrom ciphey.LanguageChecker import LanguageChecker\n\nlogging.remove()\n\n\nclass testIntegration(unittest.TestCase):\n    \"\"\"\n    tests integration between chi squared and dictionary checker\n    \"\"\"\n\n    def test_basics(self):\n        lc = LanguageChecker.Checker()\n        result = lc.check(\n            \"Hello my name is new and this is an example of some english text\"\n        )\n        self.assertEqual(result, True)\n\n    def test_basics_german(self):\n        lc = LanguageChecker.Checker()\n        result = lc.check(\"hallo keine lieben leute nach\")\n        self.assertEqual(result, False)\n\n    def test_basics_quickbrownfox(self):\n        \"\"\"\n        This returns true because by default chi squared returns true so long as it's less than 10 items it's processed\n        \"\"\"\n        lc = LanguageChecker.Checker()\n        result = lc.check(\"The quick brown fox jumped over the lazy dog\")\n        self.assertEqual(result, True)\n\n    def test_basics_quickbrownfox(self):\n        \"\"\"\n        This returns true because by default chi squared returns true so long as it's less than 10 items it's processed\n        \"\"\"\n        lc = LanguageChecker.Checker()\n        result = lc.check(\"The quick brown fox jumped over the lazy dog\")\n        self.assertEqual(result, True)\n\n    def test_chi_maxima_true(self):\n        \"\"\"\n        This returns false because s.d is not over 1 as all inputs are English\n        \"\"\"\n        lc = LanguageChecker.Checker()\n        result = lc.check(\"sa dew fea dxza dcsa da fsa d\")\n        result = lc.check(\"df grtsf a sgrds fgserwqd\")\n        result = lc.check(\"fd sa fe safsda srmad sadsa d\")\n        result = lc.check(\" oihn giuhh7hguygiuhuyguyuyg ig iug iugiugiug\")\n        result = lc.check(\n            \"oiuhiuhiuhoiuh7 a opokp[poj uyg ytdra4efriug oih kjnbjhb jgv\"\n        )\n        result = lc.check(\"r jabbi tb y jyg ygiuygytff  u0\")\n        result = lc.check(\"ld oiu oj uh t t er s d gf hg g  h h\")\n        result = lc.check(\"posa   idijdsa ije i vi ijerijofdj ouhsaf oiuhas  oihd \")\n        result = lc.check(\n            \"Likwew e wqrew rwr safdsa dawe r3d hg jyrt dwqefp ;g;;' [ [sadqa ]].\"\n        )\n        result = lc.check(\"Her hyt e jytgv  urjfdghbsfd c   \")\n        result = lc.check(\"CASSAE X T H WAEASD AFDG TERFADDSFD\")\n        result = lc.check(\"das te y we fdsbfsd fe a \")\n        result = lc.check(\"d pa pdpsa ofoiaoew ifdisa ikrkasd s\")\n        result = lc.check(\n            \"My friend is a really nice people who really enjoys swimming, dancing, kicking, English.\"\n        )\n        self.assertEqual(result, True)\n\n    def test_integration_unusual_one(self):\n        lc = LanguageChecker.Checker()\n        result = lc.check(\"HELLO MY NAME IS BRANDON AND I LIKE DOLLAR\")\n        self.assertEqual(result, True)\n\n    def test_integration_unusual_two(self):\n        lc = LanguageChecker.Checker()\n        result = lc.check(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")\n        self.assertEqual(result, False)\n\n    def test_integration_unusual_three(self):\n        lc = LanguageChecker.Checker()\n        result = lc.check(\"password\")\n        self.assertEqual(result, True)\n\n    def test_integration_unusual_three(self):\n        lc = LanguageChecker.Checker()\n        result = lc.check(\"\")\n        self.assertEqual(result, False)\n\n    def test_integration_unusual_four(self):\n        lc = LanguageChecker.Checker()\n        result = lc.check(\".\")\n        self.assertEqual(result, False)\n\n    def test_integration_unusual_five(self):\n        lc = LanguageChecker.Checker()\n        result = lc.check(\"#\")\n        self.assertEqual(result, False)\n\n    def test_integration_unusual_7(self):\n        lc = LanguageChecker.Checker()\n        result = lc.check(\n            \"999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999\"\n        )\n        self.assertEqual(result, False)\n\n    def test_integration_unusual_7(self):\n        lc = LanguageChecker.Checker()\n        result = lc.check(\"\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f\")\n        self.assertEqual(result, False)\n\n    def test_integration_addition(self):\n        \"\"\"\n        Makes sure you can add 2 language objects together\n        \"\"\"\n        lc = LanguageChecker.Checker()\n        result = lc.check(\"hello my darling\")\n\n        lc2 = LanguageChecker.Checker()\n        result = lc.check(\"sad as dasr as s\")\n\n        temp = lc.getChiScore()\n        temp2 = lc2.getChiScore()\n        temp3 = temp + temp2\n        lc3 = lc + lc2\n\n        self.assertAlmostEqual(lc3.getChiScore(), temp3)\n\n    def test_integration_charlesBabbage(self):\n        \"\"\"\n        I had a bug with this exact string\n        Bug is that chi squared does not score this as True\n        \"\"\"\n        text = \"\"\"Charles Babbage, FRS (26 December 1791 - 18 October 1871) was an English mathematician, philosopher, inventor and mechanical engineer who originated the concept of a programmable computer. Considered a \"father of the computer\", Babbage is credited with inventing the first mechanical computer that eventually led to more complex designs. Parts of his uncompleted mechanisms are on display in the London Science Museum. In 1991, a perfectly functioning difference engine was constructed from Babbage's original plans. Built to tolerances achievable in the 19th century, the success of the finished engine indicated that Babbage's machine would have worked. Nine years later, the Science Museum completed the printer Babbage had designed for the difference engine.\"\"\"\n        lc = LanguageChecker.Checker()\n        result = lc.check(text)\n        self.assertEqual(result, True)\n"
  },
  {
    "path": "tests/lukas.py",
    "content": "import random\n\nimport cipheydists\n\n\nclass galactic_encode:\n    \"\"\"\n    (Attempts to) encode an input string with the Standard Galactic Alphabet.\n    \"\"\"\n\n    def __init__(self, text: str):\n        self.text = text.lower()\n        self.ctext = \"\"\n\n        imported = dict(cipheydists.get_translate(\"galactic\"))\n        self.galactic_dict = {value: key for (key, value) in imported.items()}\n\n    def encode(self):\n        for char in self.text:\n            if char in self.galactic_dict.keys():\n                self.ctext += self.galactic_dict[char]\n            else:\n                self.ctext += char\n        return self.ctext\n\n\nclass atbash_encode:\n    \"\"\"\n    Encodes an input string with the Atbash cipher.\n    \"\"\"\n\n    def __init__(self, text: str):\n        self.text = text.lower()\n        self.letters = list(\"abcdefghijklmnopqrstuvwxyz\")\n        self.atbash_dict = {self.letters[::-1][i]: self.letters[i] for i in range(26)}\n        self.ctext = \"\"\n\n    def encode(self):\n        for letter in self.text:\n            if letter in self.atbash_dict.keys():\n                # Match every letter of the input to its atbash counterpoint\n                self.ctext += self.atbash_dict[letter]\n            else:\n                # If the current character is not in the defined alphabet,\n                # just accept it as-is (useful for numbers, punctuation,...)\n                self.ctext += letter\n        return self.ctext\n\n\nclass XY_encrypt:\n    \"\"\"\n    Encrypts an input string using binary substitution (called XandY in Ciphey) in which\n    first, the input string is converted to its binary representation and then the 0s and 1s\n    of the binary string are replaced with any two characters.\n    - flip: Which of the two possible rotations of the substitute characters is used?\n    - randomize: If True, random spaces are inserted into the cstring, which Ciphey can handle.\n    - key: Which two characters are used to represent the 0s and 1s?\n    \"\"\"\n\n    def __init__(\n        self,\n        text: str,\n        flip: bool = bool(random.randint(0, 1)),\n        randomize: bool = True,\n        key: list = None,\n    ):\n        self.ASCII = cipheydists.get_charset(\"asciiTable\")\n        self.text = text.lower()\n        self.ctext = \"\"\n        self.flip = flip\n        self.randomize = randomize\n        self.key = key\n\n    def randomizer(self):\n        s = list(self.ctext)\n        for i in range(len(s) - 1):\n            while random.randrange(2):\n                s[i] = s[i] + \" \"\n        return \"\".join(s)\n\n    def to_binary(self):\n        return \" \".join(f\"{ord(i):08b}\" for i in self.text)\n\n    def encrypt(self):\n        self.ctext = self.to_binary().replace(\" \", \"\")\n\n        if self.key:\n            one, two = self.key[0], self.key[1]\n        else:\n            one, two = random.choice(self.ASCII), random.choice(self.ASCII)\n\n        self.ctext = self.ctext.replace(str(int(self.flip)), one).replace(\n            str(int(not self.flip)), two\n        )\n        self.ctext = self.randomizer() if self.randomize is True else self.ctext\n\n        return self.ctext\n"
  },
  {
    "path": "tests/speed_test.archive",
    "content": "\"\"\"\nTL;DR\n\nTested over 20,000 times\n\nMaximum sentence size is 15 sentences\n1/2 chance of getting 'gibberish' (encrypted text)\n1/2 chance of getting English text\n\nEach test is timed using Time module.\nThe accuracy is calculated as to how many true positives we get over the entire run\n\n\"\"\"\n\n\nimport random\nimport time\nfrom statistics import mean\nimport ciphey\nimport enciphey\nfrom alive_progress import alive_bar\nfrom spacy.lang.en.stop_words import STOP_WORDS\nimport cipheydists\nimport cipheycore\nimport pprint\nfrom math import ceil\n\n\nclass tester:\n    def __init__(self):\n\n        self.nlp = spacy.load(\"en_core_web_sm\")\n\n        self.f = open(\"hansard.txt\", encoding=\"ISO-8859-1\").read()\n        self.f = self.f.split(\".\")\n\n        # self.analysis = cipheycore.start_analysis()\n        # for word in self.f:\n        #     cipheycore.continue_analysis(self.analysis, word)\n        # cipheycore.finish_analysis(self.analysis)\n\n        self.enciph = enciphey.encipher()\n\n        # all stopwords\n        self.all_stopwords = set(self.nlp.Defaults.stop_words)\n        self.top1000Words = cipheydists.get_list(\"english1000\")\n        self.wordlist = cipheydists.get_list(\"english\")\n        self.endings = set(\n            [\n                \"al\",\n                \"y\",\n                \"sion\",\n                \"tion\",\n                \"ize\",\n                \"ic\",\n                \"ious\",\n                \"ness\",\n                \"ment\",\n                \"ed\",\n                \"ify\",\n                \"ence\",\n                \"fy\",\n                \"less\",\n                \"ance\",\n                \"ship\",\n                \"ate\",\n                \"dom\",\n                \"ist\",\n                \"ish\",\n                \"ive\",\n                \"en\",\n                \"ical\",\n                \"ful\",\n                \"ible\",\n                \"ise\",\n                \"ing\",\n                \"ity\",\n                \"ism\",\n                \"able\",\n                \"ty\",\n                \"er\",\n                \"or\",\n                \"esque\",\n                \"acy\",\n                \"ous\",\n            ]\n        )\n        self.endings_3_letters = list(filter(lambda x: len(x) > 3, self.endings))\n        self.best_thresholds = {\n            \"word endings\": {\n                1: {\"Threshold\": 0, \"Accuracy\": 0},\n                2: {\"Threshold\": 0, \"Accuracy\": 0},\n                3: {\"Threshold\": 0, \"Accuracy\": 0},\n                4: {\"Threshold\": 0, \"Accuracy\": 0},\n                5: {\"Threshold\": 0, \"Accuracy\": 0},\n            },\n            \"word endngs with just 3 chars\": {\n                1: {\"Threshold\": 0, \"Accuracy\": 0},\n                2: {\"Threshold\": 0, \"Accuracy\": 0},\n                3: {\"Threshold\": 0, \"Accuracy\": 0},\n                4: {\"Threshold\": 0, \"Accuracy\": 0},\n                5: {\"Threshold\": 0, \"Accuracy\": 0},\n            },\n            \"stop words\": {\n                1: {\"Threshold\": 0, \"Accuracy\": 0},\n                2: {\"Threshold\": 0, \"Accuracy\": 0},\n                3: {\"Threshold\": 0, \"Accuracy\": 0},\n                4: {\"Threshold\": 0, \"Accuracy\": 0},\n                5: {\"Threshold\": 0, \"Accuracy\": 0},\n            },\n            \"check 1000 words\": {\n                1: {\"Threshold\": 0, \"Accuracy\": 0},\n                2: {\"Threshold\": 0, \"Accuracy\": 0},\n                3: {\"Threshold\": 0, \"Accuracy\": 0},\n                4: {\"Threshold\": 0, \"Accuracy\": 0},\n                5: {\"Threshold\": 0, \"Accuracy\": 0},\n            },\n            \"checker\": {\n                1: {\"Threshold\": 0, \"Accuracy\": 0},\n                2: {\"Threshold\": 0, \"Accuracy\": 0},\n                3: {\"Threshold\": 0, \"Accuracy\": 0},\n                4: {\"Threshold\": 0, \"Accuracy\": 0},\n                5: {\"Threshold\": 0, \"Accuracy\": 0},\n            },\n        }\n\n        # text = \"hello my name is Bee and I really like flowers\"\n        # def checker(self, text: str, threshold: float, text_length: int) -> bool:\n        # x = self.checker(text=text, threshold=0.55, text_length=len(text))\n\n    def lem(self, text, thresold):\n        sentences = self.nlp(text)\n        return set([word.lemma_ for word in sentences])\n\n    def stop(self, text, threshold):\n        for word in text:\n            if word in self.all_stopwords:\n                return True\n        else:\n            return False\n        # x = [word for word in text if not word in self.all_stopwords]\n        # return True if len(x) < len(text) else False\n\n    def check1000Words(self, text, threshold):\n        \"\"\"Checks to see if word is in the list of 1000 words\n        the 1000words is a dict, so lookup is O(1)\n        Args:\n            text -> The text we use to text (a word)\n        Returns:\n            bool -> whether it's in the dict or not.\n        \"\"\"\n        # If we have no wordlist, then we can't reject the candidate on this basis\n\n        if text is None:\n            return False\n        # If any of the top 1000 words in the text appear\n        # return true\n        for word in text:\n            # I was debating using any() here, but I think they're the\n            # same speed so it doesn't really matter too much\n            if word in self.top1000Words:\n                return True\n        return False\n\n    def get_random_sentence(self, size):\n        # if random.randint(0, 1) == 0:\n        #     x = None\n        #     while x is None:\n        #         x = (True, \" \".join(random.sample(self.f, k=random.randint(1, size))))\n        #     return x\n        # else:\n        #     x = None\n        #     while x is None:\n        #         x = self.enciph.getRandomEncryptedSentence(size)\n        #         x = x[\"Encrypted Texts\"][\"EncryptedText\"]\n        #     return (False, x)\n         x = (True, \" \".join(random.sample(self.f, k=random.randint(1, size))))\n         return x\n\n    def get_words(self, text):\n        doc = self.nlp(text)\n        toReturn = []\n        for token in doc:\n            toReturn.append((token.text).lower())\n        return toReturn\n\n    def word_endings(self, text, thresold):\n        total = len(text)\n        if total == 0:\n            return False\n        positive = 0\n        # as soon as we hit 25%, we exit and return True\n        for word in text:\n            for word2 in self.endings:\n                if word.endswith(word2):\n                    positive += 1\n            # if total / positive >= 0.25:\n            # return True\n        # return False\n        if positive == 0:\n            return False\n        return True if positive / total > thresold else False\n\n    def word_endings_3(self, text, threshold):\n        \"\"\"Word endings that only end in 3 chars, may be faster to compute\"\"\"\n        positive = 0\n        total = len(text)\n        if total == 0:\n            return False\n        for word in text:\n            if word[::-3] in self.endings_3_letters:\n                positive += 1\n        if positive != 0:\n            return True if total / positive > threshold else False\n        else:\n            return False\n\n    # Now to time it and take measurements\n\n    def perform(self, function, sent_size, threshold):\n        threshold = threshold / 100\n        # calculate accuracy\n        total = 0\n        true_positive_returns = 0\n        true_negative_returns = 0\n        false_positive_returns = 0\n        false_negatives_returns = 0\n\n        # calculate aveager time\n        time_list = []\n\n        # average sentance size\n        sent_size_list = []\n        test_range = 200\n        for i in range(0, test_range):\n            sent = self.get_random_sentence(sent_size)\n            text = sent[1]\n            truthy = sent[0]\n            sent_size_list.append(len(text))\n\n            # should be length of chars\n            text = self.get_words(text)\n            old = len(text)\n\n            # timing the function\n            # def checker(self, text: str, threshold: float, text_length: int, var: set) -> bool:\n            tic = time.perf_counter()\n            result = function(text=text, threshold=threshold, text_length=old)\n            tok = time.perf_counter()\n            # new = len(result)\n            # print(\n            # f\"The old text is \\n {''.join(text)}\\n and the new text is \\n {''.join(result)} \\n\\n\"\n            # )\n\n            # result = new < old\n\n            # checking for accuracy\n            # new = len(new)\n            # the and here means we only count True Positives\n            # result = new < old\n            if result and truthy:\n                true_positive_returns += 1\n            elif result:\n                false_positive_returns += 1\n            elif not result and truthy:\n                false_negatives_returns += 1\n            elif not result:\n                true_negative_returns += 1\n            else:\n                print(\"ERROR\")\n\n            total += 1\n\n            # appending the time\n            t = tok - tic\n            time_list.append(t)\n\n        print(\n            f\"The accuracy is {str((true_positive_returns+true_negative_returns) / total)} \\n and the time it took is {str(mean(time_list))}. \\n The average string size was {str(mean(sent_size_list))}\"\n        )\n        print(\n            f\"\"\"\n                            Positive    Negative\n                Positive     {true_positive_returns}            {false_positive_returns}\n                Negative     {false_negatives_returns}            {true_negative_returns}\n\n                \"\"\"\n        )\n        return {\n            \"Name\": function,\n            \"Threshold\": threshold,\n            \"Accuracy\": (true_positive_returns + true_negative_returns) / total,\n            \"Average_time\": mean(time_list),\n            \"Average_string_len\": mean(sent_size_list),\n            \"Sentence length\": sent_size,\n            \"confusion_matrix\": [\n                [true_positive_returns, false_positive_returns],\n                [false_negatives_returns, true_negative_returns],\n            ],\n        }\n\n    def perform_3_sent_sizes(self, threshold):\n        \"\"\"\n        Gives us the average accuracy and time etc\n        \"\"\"\n        # funcs = [obj.checker, obj.stop, obj.check1000Words]\n        funcs = [obj.checker]\n        # funcs = [obj.word_endings]\n        names = [\n            \"checker\",\n            # \"stop words\",\n            # \"check 1000 words\",\n        ]\n        # names = [\"checker\"]\n        sent_sizes = [1, 2, 3, 4, 5]\n        x = {\n            # \"stop words\": {1: None, 2: None, 3: None, 4: None, 5: None, 20: None},\n            # \"check 1000 words\": {1: None, 2: None, 3: None, 4: None, 5: None, 20: None},\n            \"checker\": {1: None, 2: None, 3: None, 4: None, 5: None, 20: None},\n        }\n        for i in range(0, len(funcs)):\n            func = funcs[i]\n            for y in sent_sizes:\n                # print(\"Hello this runsss\")\n                x[names[i]][y] = self.perform(func, y, threshold)\n        return x\n\n    def perform_best_percentages(self):\n        \"\"\"\n        Tells us the optimal percentage thresholds\n        \"\"\"\n        \"\"\"\n        TODO I need to record thresholds for each length of text\n        \"\"\"\n\n        # \"word endings with just 3 chars\": {\n        #     \"Sentence Size\": {\"Threshold\": 0, \"Accuracy\": 0}\n        # },\n        # \"stop words\": {\"Sentence Size\": {\"Threshold\": 0, \"Accuracy\": 0}},\n        # \"check 1000 words\": {\"Sentence Size\": {\"Threshold\": 0, \"Accuracy\": 0}},\n        # }\n\n        items = range(100)\n        with alive_bar(len(items)) as bar:\n            for i in range(1, 101):\n                x = self.perform_3_sent_sizes(threshold=i)\n                pprint.pprint(x)\n                for key, value in x.items():\n                    # getting max keyLs\n                    for y in [1, 2, 3, 4, 5]:\n                        pprint.pprint(x[key])\n                        # size = x[key][y]\n                        size = y\n                        # print(f\"**** Size is {size}\")\n                        temp1 = x[key][y][\"Accuracy\"]\n                        # print(f\"Accuracy is {temp1}\")\n                        temp2 = self.best_thresholds[key][size][\"Accuracy\"]\n                        if temp1 > temp2:\n                            temp2 = temp1\n                            # print(f\"Self best is {self.best_thresholds[key][size]}\")\n                            self.best_thresholds[key][size][\"Threshold\"] = i\n                            self.best_thresholds[key][size][\"Accuracy\"] = temp1\n                pprint.pprint(x)\n                bar()\n        pprint.pprint(self.best_thresholds)\n\n    def calculate_average_sentence_size(self):\n        sent_sizes = [1, 2, 3, 4, 5]\n        lengths = []\n        for x in sent_sizes:\n            for i in range(0, 2000):\n                y = self.get_random_sentence(x)\n                lengths.append(len(y[1]))\n            print(f\"{x} : The mean is {mean(lengths)}\")\n\n    def checker(self, text: str, threshold: float, text_length: int) -> bool:\n        \"\"\"Given text determine if it passes checker\n\n        The checker uses the vairable passed to it. I.E. Stopwords list, 1k words, dictionary\n\n        Args:\n            text -> The text to check\n            threshold -> at what point do we return True? The percentage of text that is in var before we return True\n            text_length -> the length of the text\n            var -> the variable we are checking against. Stopwords list, 1k words list, dictionray list.\n        Returns:\n            boolean -> True for it passes the test, False for it fails the test.\"\"\"\n\n        percent = ceil(text_length * threshold)\n        meet_threshold = 0\n        location = 0\n        end = percent\n\n        while location <= text_length:\n            # chunks the text, so only gets THRESHOLD chunks of text at a time\n            to_analyse = text[location:end]\n            for word in to_analyse:\n                # if len(word) <= 1:\n                #     continue\n                # if word is a stopword, + 1 to the counter\n                if word in self.wordlist:\n                    meet_threshold += 1\n                if meet_threshold / text_length >= threshold:\n                    # if we meet the threshold, return True\n                    # otherwise, go over again until we do\n                    # We do this in the for loop because if we're at 24% and THRESHOLD is 25\n                    # we don't want to wait THRESHOLD to return true, we want to return True ASAP\n                    return True\n            location += 1\n        return False\n\n\nobj = tester()\n# X = obj.perform_3_sent_sizes(50)\n# x = obj.perform_best_percentages()\nx = obj.calculate_average_sentence_size()\n"
  },
  {
    "path": "tests/test_advanced_ciphers.py",
    "content": "import pytest\r\nfrom click.testing import CliRunner\r\nimport mock \r\nimport re\r\n\r\nfrom ciphey import decrypt\r\nfrom ciphey.iface import Config\r\nfrom ciphey.ciphey import main\r\nfrom ciphey.basemods.Checkers import human\r\n\r\ndef test_xor():\r\n    res = decrypt(Config().library_default().complete_config(),\"Uihr!hr!`!udru!gns!YNS-!hu!hr!sd`mmx!mnof!un!l`jd!rtsd!ui`u!YNSunnm!b`o!fdu!hu/!Bhqidx!*!YNSunnm!hr!bnnm/\")\r\n    assert re.findall(\"This is a test for XOR\", res)\r\n\r\n@pytest.mark.skip(\"Skipping because it matches on Discover card, this is a PyWhat bug that's being fixed.\")\r\n@mock.patch(\"ciphey.basemods.Checkers.human.HumanChecker.check\", return_value = \"\")\r\ndef test_xor_tui_multi_byte(mock_click):\r\n    # https://github.com/Ciphey/Ciphey/issues/655\r\n    runner = CliRunner()      \r\n    mock_click.return_value = \"y\"\r\n    result = runner.invoke(main, ['-vvv', '-t', '360w0x11450x114504421611100x0y0545000x06171y1511070145150x110z45081709110y45071y1100423w2z3045120z0x060z450x1145080w170042060z0u1509071w45160w040x45160y0y020v0045001x1107453w2w374y422x0y1111000301450w03450w0y091y4510110x0y05450442160x0x02090745071y110042030z104504420v001y45120z0x060z450x11450003161x42110z42071717110042030z10060042041642110w071700420x16420z0y0v1x4550505342150z11160x000x090y11001149450u1009160x45001x1107450v071x1642060z170901420w04140045160w0z170416030y0111450z0445150w16160y070x0v0x110716450u040v0y0y02420x11420w04100145160z450017101600030w1706074y453z2z37160z0z0v450x1145041500160w08004207000104101100450y114501040y42061703060v42070z160w45110x0y05090042071x160045030y014208100v110x42071x1600453z2z3742000y01171x121100064511071w114x452z0x060042260x120w001y450w0316453z2z37160z0z0v450x0x1100051704160001420x0y160z450y1149420x1142120x0v0945000045111015071745030804180x0y0545040x0145150x090v451012021703010042260x120w001y45110w450707450400090042110z42061703060v42060z0u1509071w453z2z3742000y01171x121100064511071w114x45320z1x450y1645160w0x114511071w1142160z42090z0x025z4227000104101100453z2z37160z0z0v45060w1009060y4216450610040609450x1645120z000y422x450u040107450x1645160z0z171600174x455u4z'])\r\n    assert result.exit_code == 0\r\n    assert re.findall(\"This is a string encrypted with multi\", str(result.output))\r\n\r\n\r\n@mock.patch(\"ciphey.basemods.Checkers.human.HumanChecker.check\", return_value = \"\")\r\ndef test_xor_tui(mock_click):\r\n    # https://github.com/Ciphey/Ciphey/issues/655\r\n    runner = CliRunner()      \r\n    mock_click.return_value = \"y\"\r\n    result = runner.invoke(main, ['-t', 'Uihr!hr!`!udru!gns!YNS-!hu!hr!sd`mmx!mnof!un!l`jd!rtsd!ui`u!YNSunnm!b`o!fdu!hu/!Bhqidx!*!YNSunnm!hr!bnnm/'])\r\n    assert result.exit_code == 0\r\n    assert re.findall(\"This is a test for XOR\", str(result.output))\r\n\r\n@mock.patch(\"ciphey.basemods.Checkers.human.HumanChecker.check\", return_value = \"\")\r\ndef test_xor_tui_verbose_mode_doesnt_break(mock_click):\r\n    # We had a bug where verbose mode broke xor\r\n    # https://discord.com/channels/754001738184392704/814565556027654214/853183178104373310\r\n    runner = CliRunner()      \r\n    mock_click.return_value = \"y\"\r\n    result = runner.invoke(main, ['-v', '-t', 'Uihr!hr!`!udru!gns!YNS-!hu!hr!sd`mmx!mnof!un!l`jd!rtsd!ui`u!YNSunnm!b`o!fdu!hu/!Bhqidx!*!YNSunnm!hr!bnnm/'])\r\n    assert result.exit_code == 0\r\n    assert re.findall(\"This is a test for XOR\", str(result.output))\r\n\r\ndef test_xor_atbash():\r\n    # Frsi!si!{!fwif!tmh!BMH-!sf!si!hw{nnc!nmlu!fm!o{qw!ighw!fr{f!BMHfmmn!y{l!uwf!sf/!Ysjrwc!*!BMHfmmn.si!ymmn/\r\n    # This is a test for XOR, it is really long to make sure that XORtool can get it. Ciphey + XORtool/is cool.\r\n    # Previously xor only worked on level 1, this test ensures it always works on levels > 1\r\n    res = decrypt(Config().library_default().complete_config(),\"Frsi!si!{!fwif!tmh!BMH-!sf!si!hw{nnc!nmlu!fm!o{qw!ighw!fr{f!BMHfmmn!y{l!uwf!sf/!Ysjrwc!*!BMHfmmn.si!ymmn/\")\r\n    assert re.findall(\"This is a test for XOR\", res)"
  },
  {
    "path": "tests/test_click.py",
    "content": "from click.testing import CliRunner\r\nfrom ciphey.ciphey import main\r\nfrom ciphey.basemods.Checkers import human\r\nimport mock\r\n\r\n\r\ndef test_hello_world():\r\n    runner = CliRunner()\r\n    result = runner.invoke(main, [\"-g\", \"-t\", \"hello\"])\r\n    assert result.exit_code == 0\r\n    assert result.output == \"hello\\n\"\r\n\r\n\r\ndef test_ip_address():\r\n    runner = CliRunner()\r\n    result = runner.invoke(main, [\"-g\", \"-t\", \"MTkyLjE2OC4wLjE=\"])\r\n    assert result.exit_code == 0\r\n    assert result.output == \"192.168.0.1\\n\"\r\n\r\n\r\n@mock.patch(\"ciphey.basemods.Checkers.human.HumanChecker.check\", return_value=\"\")\r\ndef test_quick_visual_output(mock_click):\r\n    # https://github.com/Ciphey/Ciphey/issues/655\r\n    runner = CliRunner()\r\n    mock_click.return_value = \"y\"\r\n    result = runner.invoke(main, [\"-t\", \"NB2HI4DTHIXS6Z3PN5TWYZJOMNXW2===\"])\r\n    assert result.exit_code == 0\r\n    assert \"base32\" in result.output\r\n"
  },
  {
    "path": "tests/test_click_printing.py",
    "content": "from click.testing import CliRunner\r\nfrom ciphey.ciphey import main\r\nfrom ciphey.basemods.Checkers import human\r\nimport mock\r\n\r\n\r\n@mock.patch(\"ciphey.basemods.Checkers.human.HumanChecker.check\", return_value=\"\")\r\ndef test_fix_for_655(mock_click):\r\n    # https://github.com/Ciphey/Ciphey/issues/655\r\n    runner = CliRunner()\r\n    mock_click.return_value = \"y\"\r\n    result = runner.invoke(main, [\"-t\", \"NB2HI4DTHIXS6Z3PN5TWYZJOMNXW2===\"])\r\n    assert result.exit_code == 0\r\n    assert \"base32\" in result.output\r\n\r\n\r\n\"\"\"\r\nTODO Mock\r\n360d0c11450c114504421611100c0b0545000c06171b1511070145150c110a45081709110b45071b1100423d2a3045120a0c060a450c1145080d170042060a0f1509071d45160d040c45160b0b020e0045001c1107453d2d374b422c0b1111000301450d03450d0b091b4510110c0b05450442160c0c02090745071b110042030a104504420e001b45120a0c060a450c11450003161c42110a42071717110042030a10060042041642110d071700420c16420a0b0e1c4550505342150a11160c000c090b11001149450f1009160c45001c1107450e071c1642060a170901420d04140045160d0a170416030b0111450a0445150d16160b070c0e0c110716450f040e0b0b02420c11420d04100145160a450017101600030d1706074b453a2a37160a0a0e450c1145041500160d08004207000104101100450b114501040b42061703060e42070a160d45110c0b05090042071c160045030b014208100e110c42071c1600453a2a3742000b01171c121100064511071d114c452a0c060042260c120d001b450d0316453a2a37160a0a0e450c0c1100051704160001420c0b160a450b1149420c1142120c0e0945000045111015071745030804180c0b0545040c0145150c090e451012021703010042260c120d001b45110d450707450400090042110a42061703060e42060a0f1509071d453a2a3742000b01171c121100064511071d114c45320a1c450b1645160d0c114511071d1142160a42090a0c025a4227000104101100453a2a37160a0a0e45060d1009060b4216450610040609450c1645120a000b422c450f040107450c1645160a0a171600174c455f4a\r\n\r\nAs it passes as a discover card\r\n\"\"\"\r\n"
  },
  {
    "path": "tests/test_main.py",
    "content": "import pytest\n\nfrom ciphey import decrypt\nfrom ciphey.iface import Config\n\nanswer_str = \"Hello my name is bee and I like dog and apple and tree\"\n\n\ndef test_a1z26():\n    res = decrypt(\n        Config().library_default().complete_config(),\n        \"8 5 12 12 15 13 25 14 1 13 5 9 19 2 5 5 1 14 4 9 12 9 11 5 4 15 7 1 14 4 1 16 16 12 5 1 14 4 20 18 5 5\",\n    )\n    assert res == \"hellomynameisbeeandilikedogandappleandtree\"\n\n\ndef test_affine():\n    res = decrypt(\n        Config().library_default().complete_config(),\n        \"Ihsst bf kxbh rd ghh xky R srjh ytz xky xccsh xky muhh\",\n    )\n    assert res == answer_str\n\n\ndef test_ascii_shift():\n    res = decrypt(\n        Config().library_default().complete_config(),\n        '\"?FFIzGSzH;G?zCMz<??z;H>z#zFCE?z>IAz;H>z;JJF?z;H>zNL??',\n    )\n    assert res == answer_str\n\n\ndef test_atbash():\n    res = decrypt(\n        Config().library_default().complete_config(),\n        \"Svool nb mznv rh yvv zmw R orpv wlt zmw zkkov zmw givv\",\n    )\n    assert res == answer_str\n\n\ndef test_baconian_complete_variant():\n    res = decrypt(\n        Config().library_default().complete_config(),\n        \"AABBB AABAA ABABB ABABB ABBBA ABBAA BBAAA ABBAB AAAAA ABBAA AABAA ABAAA BAABA AAAAB AABAA AABAA AAAAA ABBAB AAABB ABAAA ABABB ABAAA ABABA AABAA AAABB ABBBA AABBA AAAAA ABBAB AAABB AAAAA ABBBB ABBBB ABABB AABAA AAAAA ABBAB AAABB BAABB BAAAB AABAA AABAA\",\n    )\n    assert res == \"HELLOMYNAMEISBEEANDILIKEDOGANDAPPLEANDTREE\"\n\n\ndef test_baconian_standard_variant():\n    res = decrypt(\n        Config().library_default().complete_config(),\n        \"AABBB AABAA ABABA ABABA ABBAB ABABB BABBA ABBAA AAAAA ABABB AABAA ABAAA BAAAB AAAAB AABAA AABAA AAAAA ABBAA AAABB ABAAA ABABA ABAAA ABAAB AABAA AAABB ABBAB AABBA AAAAA ABBAA AAABB AAAAA ABBBA ABBBA ABABA AABAA AAAAA ABBAA AAABB BAABA BAAAA AABAA AABAA\",\n    )\n    assert res == \"HELLOMYNAMEISBEEANDILIKEDOGANDAPPLEANDTREE\"\n\n\ndef test_base32():\n    res = decrypt(\n        Config().library_default().complete_config(),\n        \"JBSWY3DPEBWXSIDOMFWWKIDJOMQGEZLFEBQW4ZBAJEQGY2LLMUQGI33HEBQW4ZBAMFYHA3DFEBQW4ZBAORZGKZI=\",\n    )\n    assert res == answer_str\n\n\ndef test_base58_bitcoin():\n    res = decrypt(\n        Config().library_default().complete_config(),\n        \"6qYhNwsP46Mn4gy6gyANfsMm2icAxGFA6gnFjVm9phYHeby7PZm3vthiXxSU77teQgTFGbHETn\",\n    )\n    assert res == answer_str\n\n\ndef test_base58_ripple():\n    res = decrypt(\n        Config().library_default().complete_config(),\n        \"aqY64A1PhaM8hgyagyw4C1Mmp5cwxGEwag8EjVm9F6YHebyfPZmsvt65XxS7ffteQgTEGbHNT8\",\n    )\n    assert res == answer_str\n\n\ndef test_base62():\n    res = decrypt(\n        Config().library_default().complete_config(),\n        \"2mQvnz9Yevvb7DRCuyDltsP31vJLToR5pjE9orWkzHMUsht2kbC96PLbZ1sdIocsGHENrzC2n\",\n    )\n    assert res == answer_str\n\n\ndef test_base64():\n    res = decrypt(\n        Config().library_default().complete_config(),\n        \"SGVsbG8gbXkgbmFtZSBpcyBiZWUgYW5kIEkgbGlrZSBkb2cgYW5kIGFwcGxlIGFuZCB0cmVl\",\n    )\n\n    assert res == answer_str\n\n\ndef test_base69():\n    res = decrypt(\n        Config().library_default().complete_config(),\n        \"kAZAtABBeB8A-AoB8ADBNAhBLA1AFBgA0AXBfBGATAVAFBgAwAWBHB<ACAkA-AnB0AVBnBNBDARAZBiBQAYAtAhBhABA<ArB4AbAMANBDAFAXBfBQAdAOAmArAUAAA2=\",\n    )\n    assert res == answer_str\n\n\ndef test_base85():\n    res = decrypt(\n        Config().library_default().complete_config(),\n        \"87cURD]inB+DtV)AKY].+C\\\\nn+CT.u+A!\\\\lBkq9&A8c*'@;]Tu@;p1%AKYE!A0>u7ARt\",\n    )\n    assert res == answer_str\n\n\ndef test_base91():\n    res = decrypt(\n        Config().library_default().complete_config(),\n        \">OwJh>=/fV@$x88j9ZNKB*ge$yV%lE%ZKi,<d,TX2$0t,,cjPD@JY<UCHRWznuWoQPD\",\n    )\n    assert res == answer_str\n\n\ndef test_baudot():\n    res = decrypt(\n        Config().library_default().complete_config(),\n        \"10100 00001 10010 10010 11000 00100 11100 10101 00100 01100 00011 11100 00001 00100 00110 00101 00100 11001 00001 00001 00100 00011 01100 01001 00100 00110 00100 10010 00110 01111 00001 00100 01001 11000 11010 00100 00011 01100 01001 00100 00011 10110 10110 10010 00001 00100 00011 01100 01001 00100 10000 01010 00001 00001\",\n    )\n    assert res == answer_str.upper()\n\n\ndef test_binary():\n    res = decrypt(\n        Config().library_default().complete_config(),\n        \"01001000 01100101 01101100 01101100 01101111 00100000 01101101 01111001 00100000 01101110 01100001 01101101 01100101 00100000 01101001 01110011 00100000 01100010 01100101 01100101 00100000 01100001 01101110 01100100 00100000 01001001 00100000 01101100 01101001 01101011 01100101 00100000 01100100 01101111 01100111 00100000 01100001 01101110 01100100 00100000 01100001 01110000 01110000 01101100 01100101 00100000 01100001 01101110 01100100 00100000 01110100 01110010 01100101 01100101\",\n    )\n\n    assert res == answer_str\n\n\n@pytest.mark.skip(\n    \"Can't decode base64 + caesar https://github.com/Ciphey/Ciphey/issues/606\"\n)\ndef test_binary_base64_caesar():\n    res = decrypt(\n        Config().library_default().complete_config(),\n        \"01010110 01011000 01001010 00110101 01100101 01010111 01001001 01100111 01100101 01101101 01110111 01100111 01011001 01010111 00110101 00110110 01100011 01101001 01000010 00110010 01011010 01101001 01000010 01110110 01100011 01101110 01001001 01100111 01100010 01101101 01000110 01111000 01001001 01000110 01011001 01100111 01100101 01011000 01011010 00110100 01100011 01101001 01000010 01111000 01011001 01101110 01010001 01100111 01100010 01101101 01000110 01111000 01001001 01000111 00110101 01101010 01011001 00110011 01101100 01111001 01001001 01000111 00110101 01101000 01100011 01010011 01000010 01101110 01011010 01011000 01001010 01111001 00001010\",\n    )\n\n    assert res == answer_str\n\n\ndef test_braille():\n    res = decrypt(\n        Config.library_default().complete_config(),\n        \"⠓⠑⠇⠇⠕⠀⠍⠽⠀⠝⠁⠍⠑⠀⠊⠎⠀⠃⠑⠑⠀⠁⠝⠙⠀⠊⠀⠇⠊⠅⠑⠀⠙⠕⠛⠀⠁⠝⠙⠀⠁⠏⠏⠇⠑⠀⠁⠝⠙⠀⠞⠗⠑⠑\",\n    )\n    assert res == answer_str.lower()\n\n\ndef test_brainfuck():\n    res = decrypt(\n        Config().library_default().complete_config(),\n        \"+[+++++++>+<]>-.-[+>-----<]>++.+++++++..+++.+[+>++<]>.[++>+<]>---.--[+++>-<]>.-[+>++++<]>.[++>+<]>--.-[+++>++<]>-.+[-->---<]>.--------.[+++++>+<]>+.-[+++>--<]>-.++++++++++.---[+>++<]>.[+++>-<]>++.+++..[+++++>+<]>+.[+++>-<]>+.+[-->---<]>+.----------.-[+++>-<]>-.-[+++>+<]>--.-[+>----<]>.++[+++>--<]>.---.++.------.[+++++>+<]>+.+[+>---<]>+.+++++++++++.--------.-[+++>-<]>--.[+++>-<]>+.+[-->---<]>+.----------.-[+++>-<]>-.[+++>-<]>+.-[-->---<]>..----.-------.[+++++>+<]>+.[+++>-<]>+.+[-->---<]>+.----------.-[+++>-<]>-.[++>+<]>++++.--.-------------..\",\n    )\n    assert res == answer_str\n\n\ndef test_brandon():\n    res = decrypt(\n        Config().library_default().complete_config(),\n        \"R hvv blf tzgsvi yvuliv nv...sfmtib...gviirurvw... Xofgxsrmt blfi yzyvh gl blfi yivzhg. Vnkvili Vnsbi srh nzixsvw srh ovtrlmh rmgl lfi ozmwh... Ozrw hrvtv gl vevib uligivhh uiln sviv gl gsv Yofv Nlfmgzrmh. Izyrw zmw izevmlfh, sv yrgvh zmw yrgvh zdzb. Nvm lu gsv Mligs, blf hgzmw zg gsv kivxrkrxv. Blfi prmth szev uzrovw blf, hl mld blf gfim gl gsv tlwh! Zmw bvg blf wl mlg kovzw? Blf wl mlg pmvvo gl wfhg blfi svzwh drgs zhs? Rmhgvzw blf dzro,  Dsb szev gsv tlwh ulihzpvm fh?  Dv nfhg ollp rmgl gsv girzoh dv uzrovw olmt ztl! Rm z grnv kzhhvw, lfi dliow rmgvigdrmvw drgs zmlgsvi gsilfts zm fksvzezo hxslozih xzoo gsv Xlmqfmxgrlm lu gsv Hksvivh... Gsv tlwh zooldvw fmslob ulixvh gl hork rmgl lfi wlnzrm. Gsv luuhkirmt lu gszg xzgzxobhn dzh gsv mvuvirlfh ulixv xzoovw nztrx... Bvg dv wrw mlg yzmrhs rg, rmhgvzw hgfwbrmt gsv erov zixzmv uli lfi kldvi zmw dvzogs! Zmw gsv nlmhgvih zg lfi wlli...gsv fmslob ivorxgh lu gsrh Xlmqfmxgrlm? ...gsv gilooh...gsv xlikhv vzgvih...gsv dvivdloevh? Wrw dv izrhv lfi hdliwh ztzrmhg gsvn? Li szev dv ozrw gsrh yfiwvm lm lgsvih? Lm hl-xzoovw drgxsvih? Hgizb xsrowivm gzftsg gsv dzbh lu ulfo hlixvib, gsvri ylwrvh nfgzgvw gsilfts yozhksvnlfh irgfzo. Hvmg gl urtsg nlmhgvih gslfts gsvb xlfow mlg wrhgrmtfrhs tllw uiln vero. Gsv uorxpvi lu sfnzmrgb olmt vcgrmtfrhsvw drgsrm gsvn. Bvh, gsvri mfnyvih szev wdrmwovw gsilfts gsv bvzih. Yfg z uvd hgroo ilzn lfi ozmwh, luuvirmt gsvri yollwb dlip uli xlrm. Gl gsrh wzb gsvb hsznv fh drgs gsvri evib vcrhgvmxv! Gsv Mligs yovvwh, uolttvw yb dzi. Gsv yzggovh ziv gsv tlwh' dsrk, xszhgrhvnvmg uli lfi hrmh! Zmw ovg fh mlg ulitvg gsv gviilih, gsv hxlfitvh uiln yvblmw lfi dliow! Gsv Drow Sfmg irwvh gsv hpb drgs vevib ufoo nllm! Gsv wzip izrwvih zywfxg lfi xsrowivm rmgl ozmwh fmpmldm! Hlnv hzb gsvb svizow z hvxlmw Xlmqfmxgrlm! Xzm dv xszig z xlfihv yzxp rmgl gsv ortsg? Droo dv urmw gsv hgivmtgs gl yzmrhs gsv nztvh uiln lfi prmtwlnh? Fmrgv zilfmw gsv dzings lu gsv Vgvimzo Uriv? Mrts rh gsv Grnv lu gsv Hdliw zmw gsv Zcv! Mlmv droo urtsg gsrh dzi rm lfi hgvzw! Mrts rh gsv Grnv lu Nzwmvhh zmw Wrhwzrm!\",\n    )\n    assert bool(res) is True\n\n\ndef test_caesar():\n    res = decrypt(\n        Config().library_default().complete_config(),\n        \"Uryyb zl anzr vf orr naq V yvxr qbt naq nccyr naq gerr\",\n    )\n    assert res == answer_str\n\n\ndef test_decimal():\n    res = decrypt(\n        Config().library_default().complete_config(),\n        \"72 101 108 108 111 32 109 121 32 110 97 109 101 32 105 115 32 98 101 101 32 97 110 100 32 73 32 108 105 107 101 32 100 111 103 32 97 110 100 32 97 112 112 108 101 32 97 110 100 32 116 114 101 101\",\n    )\n    assert res == answer_str\n\n\ndef test_dna():\n    res = decrypt(\n        Config().library_default().complete_config(),\n        \"GAT AAT GCT ATT TCT ATT AAT ACT GAA CGT GAA TCT ACT ATT AAT GGT\",\n    )\n    assert res == \"DNAISINTERESTING\"\n\n\ndef test_dtmf():\n    res = decrypt(\n        Config().library_default().complete_config(),\n        \"1336-941 1209-697 1336-941 1336-941 1209-697 1336-941 1336-941 1336-941 1336-941 1209-697 1209-697 1336-941 1336-941 1209-697 1336-941 1209-697 1336-941 1209-697 1209-697 1336-941 1209-697 1209-697 1336-941 1336-941 1336-941 1209-697 1209-697 1336-941 1209-697 1209-697 1336-941 1336-941 1336-941 1209-697 1209-697 1336-941 1209-697 1209-697 1209-697 1209-697 1336-941 1336-941 1209-697 1336-941 1336-941 1336-941 1336-941 1336-941 1336-941 1209-697 1209-697 1336-941 1209-697 1209-697 1336-941 1209-697 1336-941 1209-697 1209-697 1209-697 1209-697 1336-941 1336-941 1209-697 1336-941 1336-941 1209-697 1336-941 1336-941 1336-941 1336-941 1336-941 1336-941 1209-697 1209-697 1336-941 1209-697 1209-697 1209-697 1336-941 1336-941 1209-697 1209-697 1336-941 1336-941 1336-941 1336-941 1209-697 1336-941 1209-697 1209-697 1336-941 1209-697 1209-697 1336-941 1209-697 1336-941 1209-697 1209-697 1336-941 1336-941 1209-697 1336-941 1209-697 1336-941 1336-941 1209-697 1336-941 1336-941 1336-941 1336-941 1336-941 1336-941 1209-697 1209-697 1336-941 1209-697 1336-941 1336-941 1209-697 1336-941 1209-697 1209-697 1209-697 1336-941 1336-941 1209-697 1209-697 1336-941 1336-941 1209-697 1336-941 1336-941 1336-941 1336-941 1336-941 1336-941 1209-697 1209-697 1336-941 1336-941 1336-941 1209-697 1336-941 1336-941 1209-697 1209-697 1336-941 1336-941 1209-697 1336-941 1209-697 1336-941 1209-697 1209-697 1336-941 1336-941 1209-697 1336-941 1209-697 1336-941 1336-941 1209-697 1336-941 1336-941 1336-941 1336-941 1336-941 1336-941 1209-697 1209-697 1336-941 1336-941 1336-941 1336-941 1209-697 1336-941 1209-697 1209-697 1336-941 1209-697 1209-697 1209-697 1336-941 1336-941 1209-697 1209-697 1336-941 1336-941 1209-697 1336-941 1336-941 1336-941 1336-941 1209-697 1336-941 1336-941 1336-941 1336-941 1336-941 1336-941 1209-697 1336-941 1336-941 1209-697 1336-941 1336-941 1209-697 1336-941 1336-941 1209-697 1336-941 1336-941 1336-941 1336-941 1336-941 1336-941 1209-697 1209-697 1336-941 1209-697 1209-697 1336-941 1336-941 1336-941 1209-697 1209-697 1336-941 1209-697 1336-941 1336-941 1209-697 1336-941 1209-697 1209-697 1336-941 1209-697 1336-941 1209-697 1209-697 1336-941 1209-697 1209-697 1336-941 1336-941 1209-697 1336-941 1209-697 1336-941 1336-941 1209-697 1336-941 1336-941 1336-941 1336-941 1336-941 1336-941 1209-697 1209-697 1336-941 1336-941 1209-697 1336-941 1336-941 1336-941 1209-697 1209-697 1336-941 1209-697 1209-697 1209-697 1209-697 1336-941 1209-697 1209-697 1336-941 1336-941 1209-697 1209-697 1209-697 1336-941 1336-941 1209-697 1336-941 1336-941 1336-941 1336-941 1336-941 1336-941 1209-697 1209-697 1336-941 1336-941 1336-941 1336-941 1209-697 1336-941 1209-697 1209-697 1336-941 1209-697 1209-697 1209-697 1336-941 1336-941 1209-697 1209-697 1336-941 1336-941 1209-697 1336-941 1336-941 1336-941 1336-941 1209-697 1336-941 1336-941 1336-941 1336-941 1336-941 1336-941 1209-697 1209-697 1336-941 1336-941 1336-941 1336-941 1209-697 1336-941 1209-697 1209-697 1209-697 1336-941 1336-941 1336-941 1336-941 1336-941 1209-697 1209-697 1209-697 1336-941 1336-941 1336-941 1336-941 1336-941 1209-697 1209-697 1336-941 1209-697 1209-697 1336-941 1336-941 1336-941 1209-697 1209-697 1336-941 1336-941 1209-697 1336-941 1209-697 1336-941 1336-941 1209-697 1336-941 1336-941 1336-941 1336-941 1336-941 1336-941 1209-697 1209-697 1336-941 1336-941 1336-941 1336-941 1209-697 1336-941 1209-697 1209-697 1336-941 1209-697 1209-697 1209-697 1336-941 1336-941 1209-697 1209-697 1336-941 1336-941 1209-697 1336-941 1336-941 1336-941 1336-941 1209-697 1336-941 1336-941 1336-941 1336-941 1336-941 1336-941 1209-697 1209-697 1209-697 1336-941 1209-697 1336-941 1336-941 1336-941 1209-697 1209-697 1209-697 1336-941 1336-941 1209-697 1336-941 1336-941 1209-697 1209-697 1336-941 1336-941 1209-697 1336-941 1209-697 1336-941 1209-697 1209-697 1336-941 1336-941 1209-697 1336-941 1209-697\",\n    )\n    assert res == answer_str\n\n\ndef test_galactic():\n    res = decrypt(\n        Config().library_default().complete_config(),\n        \"⍑ᒷꖎꖎ𝙹 ᒲ|| リᔑᒲᒷ ╎ᓭ ʖᒷᒷ ᔑリ↸ i ꖎ╎ꖌᒷ ↸𝙹⊣ ᔑリ↸ ᔑ!¡!¡ꖎᒷ ᔑリ↸ ℸ ̣ ∷ᒷᒷ\",\n    )\n    assert res == answer_str.lower()\n\n\ndef test_galactic_Xproblem():\n    res = decrypt(\n        Config().library_default().complete_config(),\n        \"⍑ᔑꖎ╎⎓ᔑ ̇/,  ̇/||ꖎ𝙹!¡⍑𝙹リᒷ, ᔑ  ̇/ ᔑꖎ𝙹リᒷ ᔑリ↸  ̇/ᒷ∷𝙹 ̇/ ⎓∷𝙹ᒲ 𝙹 ̇/⎓𝙹∷↸\",\n    )\n    assert res == \"halifax, xylophone, a x alone and xerox from oxford\"\n\n\ndef test_gzip():\n    res = decrypt(\n        Config().library_default().complete_config(),\n        \"H4sIAAzul18A/yXJzQmAMBSEwVa+ckwZT7LIw80P6sXuA3ocZpM9aC89msibXSJ6peA8RR3Hx5jTfzyXtAAbQvCyNgAAAA==\",\n    )\n    assert res == answer_str\n\n\ndef test_hexadecimal():\n    res = decrypt(\n        Config().library_default().complete_config(),\n        \"48 65 6c 6c 6f 20 6d 79 20 6e 61 6d 65 20 69 73 20 62 65 65 20 61 6e 64 20 49 20 6c 69 6b 65 20 64 6f 67 20 61 6e 64 20 61 70 70 6c 65 20 61 6e 64 20 74 72 65 65\",\n    )\n\n    assert res == answer_str\n\n\ndef test_json_problem():\n    res = decrypt(\n        Config().library_default().complete_config(),\n        \"0110100001100101011011000110110001101111\",\n    )\n    assert res != \"0110100001100101011011000110110001101111\"\n\n\ndef test_leetspeak():\n    res = decrypt(\n        Config().library_default().complete_config(),\n        \"|-|3ll0 my n4m3 1s 833 4nd 1 l1k3 D06 4ND 4ppl3 4nd 7R33\",\n    )\n    assert res.lower() == answer_str.lower()\n\n\ndef test_morse_code():\n    res = decrypt(\n        Config().library_default().complete_config(),\n        \".... . .-.. .-.. ---/-- -.--/-. .- -- ./.. .../-... . ./.- -. -../../.-.. .. -.- ./-.. --- --./.- -. -../.- .--. .--. .-.. ./.- -. -../- .-. . .\",\n    )\n    assert res == answer_str.upper()\n\n\ndef test_multi_tap():\n    res = decrypt(\n        Config().library_default().complete_config(),\n        \"44 33 555 555 666 0 6 999 0 66 2 6 33 0 444 7777 0 22 33 33 0 2 66 3 0 444 0 555 444 55 33 0 3 666 4 0 2 66 3 0 2 7 7 555 33 0 2 66 3 0 8 777 33 33\",\n    )\n    assert res == answer_str.upper()\n\n\ndef test_new_line_at_start_returns():\n    # Language Checker should return True by stripping new line\n    # but the new line should be returned to the user as new lines are important\n    res = decrypt(Config().library_default().complete_config(), \"\\npass\\n\")\n\n    assert res == \"\\npass\\n\"\n\n\ndef test_new_line_strip_and_return():\n    # Language Checker should return True by stripping new line\n    # but the new line should be returned to the user as new lines are important\n    res = decrypt(Config().library_default().complete_config(), \"pass\\n\")\n\n    assert res == \"pass\\n\"\n\n\ndef test_octal():\n    res = decrypt(\n        Config().library_default().complete_config(),\n        \"110 145 154 154 157 40 155 171 40 156 141 155 145 40 151 163 40 142 145 145 40 141 156 144 40 111 40 154 151 153 145 40 144 157 147 40 141 156 144 40 141 160 160 154 145 40 141 156 144 40 164 162 145 145\",\n    )\n    assert res == answer_str\n\n\ndef test_plaintext():\n    res = decrypt(Config().library_default().complete_config(), answer_str)\n    assert res == answer_str\n\n\ndef test_quadgrams_messed_up_spacing():\n    res = decrypt(\n        Config().library_default().complete_config(),\n        \"H ello m y na m e is b ee an d I l ik e do g a n d ap pl e a nd tr e e\",\n    )\n    assert (\n        res == \"H ello m y na m e is b ee an d I l ik e do g a n d ap pl e a nd tr e e\"\n    )\n\n\ndef test_quadgrams_no_spaces():\n    res = decrypt(\n        Config().library_default().complete_config(),\n        \"HellomynameisbeeandIlikedogandappleandtree\",\n    )\n    assert res == \"HellomynameisbeeandIlikedogandappleandtree\"\n\n\ndef test_quadgrams_space_between_every_letter():\n    res = decrypt(\n        Config().library_default().complete_config(),\n        \"H e l l o m y n a m e i s b e e a n d I l i k e d o g a n d a p p l e a n d t r e e\",\n    )\n    assert (\n        res\n        == \"H e l l o m y n a m e i s b e e a n d I l i k e d o g a n d a p p l e a n d t r e e\"\n    )\n\n\ndef test_reversed_text():\n    res = decrypt(\n        Config().library_default().complete_config(),\n        \"eert dna elppa dna god ekil I dna eeb si eman ym olleH\",\n    )\n    assert res == answer_str\n\n\ndef test_rot47():\n    res = decrypt(\n        Config().library_default().complete_config(),\n        \"$A9:?I @7 3=24< BF2CEK[ ;F586 >J G@H\",\n    )\n    assert res == \"Sphinx of black quartz, judge my vow\"\n\n\ndef test_soundex():\n    res = decrypt(\n        Config().library_default().complete_config(),\n        \"H236 I200 I500 T000 P230\",\n    )\n    assert res.lower() == \"history is in the past\"\n\n\ndef test_tap_code():\n    res = decrypt(\n        Config().library_default().complete_config(),\n        \"4,4 1,5 4,3 4,4  3,4 3,3 1,5  4,4 5,2 3,4  4,4 2,3 4,2 1,5 1,5\",\n    )\n    assert res == \"test one two three\".upper()\n\n\ndef test_url():\n    res = decrypt(\n        Config().library_default().complete_config(),\n        \"https%3A%2F%2Fwww%2Egoogle%2Ecom%2Fsearch%3Fq%3Dciphey\",\n    )\n    assert res == \"https://www.google.com/search?q=ciphey\"\n\n\ndef test_uuencode():\n    res = decrypt(\n        Config().library_default().complete_config(),\n        'begin 644 /dev/stdout\\nM2&5L;&\\\\@;7D@;F%M92!I<R!B964@86YD($D@;&EK92!D;V<@86YD(&%P<&QE\\n)(&%N9\"!T<F5E\\n`\\nend\\n',\n    )\n    assert res == answer_str\n    res = decrypt(\n        Config().library_default().complete_config(),\n        'M2&5L;&\\\\@;7D@;F%M92!I<R!B964@86YD($D@;&EK92!D;V<@86YD(&%P<&QE\\n)(&%N9\"!T<F5E\\n',\n    )\n    assert res == answer_str\n\n\ndef test_vigenere():\n    res = decrypt(\n        Config().library_default().complete_config(),\n        \"Rijvs ki rywi gc fco eln M jsoc nse krb ktnvi yxh rbic\",\n    )\n\n    assert res == answer_str\n\n\ndef test_xandy():\n    res = decrypt(\n        Config().library_default().complete_config(),\n        \"xDxxDxxx xDDxxDxD xDDxDDxx xDDxDDxx xDDxDDDD xxDxxxxx xDDxDDxD xDDDDxxD xxDxxxxx xDDxDDDx xDDxxxxD xDDxDDxD xDDxxDxD xxDxxxxx xDDxDxxD xDDDxxDD xxDxxxxx xDDxxxDx xDDxxDxD xDDxxDxD xxDxxxxx xDDxxxxD xDDxDDDx xDDxxDxx xxDxxxxx xDxxDxxD xxDxxxxx xDDxDDxx xDDxDxxD xDDxDxDD xDDxxDxD xxDxxxxx xDDxxDxx xDDxDDDD xDDxxDDD xxDxxxxx xDDxxxxD xDDxDDDx xDDxxDxx xxDxxxxx xDDxxxxD xDDDxxxx xDDDxxxx xDDxDDxx xDDxxDxD xxDxxxxx xDDxxxxD xDDxDDDx xDDxxDxx xxDxxxxx xDDDxDxx xDDDxxDx xDDxxDxD xDDxxDxD\",\n    )\n    assert res == answer_str\n"
  },
  {
    "path": "tests/test_quick.py",
    "content": "import pytest\r\n\r\nfrom ciphey import decrypt\r\nfrom ciphey.iface import Config\r\nfrom click.testing import CliRunner\r\nfrom ciphey.ciphey import main\r\nfrom ciphey.basemods.Checkers import human\r\nimport mock\r\n\r\nanswer_str = \"Hello my name is bee and I like dog and apple and tree\"\r\n\r\n\r\ndef test_quick_base32():\r\n    res = decrypt(\r\n        Config().library_default().complete_config(),\r\n        \"JBSWY3DPEBWXSIDOMFWWKIDJOMQGEZLFEBQW4ZBAJEQGY2LLMUQGI33HEBQW4ZBAMFYHA3DFEBQW4ZBAORZGKZI=\",\r\n    )\r\n    assert res.lower() == answer_str.lower()\r\n\r\n\r\ndef test_quick_base58_ripple():\r\n    res = decrypt(\r\n        Config().library_default().complete_config(),\r\n        \"aqY64A1PhaM8hgyagyw4C1Mmp5cwxGEwag8EjVm9F6YHebyfPZmsvt65XxS7ffteQgTEGbHNT8\",\r\n    )\r\n    assert res.lower() == answer_str.lower()\r\n\r\n\r\ndef test_quick_greppable_works_with_ip_address():\r\n    runner = CliRunner()\r\n    result = runner.invoke(main, [\"-g\", \"-t\", \"MTkyLjE2OC4wLjE=\"])\r\n    assert result.exit_code == 0\r\n    assert result.output == \"192.168.0.1\\n\"\r\n\r\n\r\n@mock.patch(\"ciphey.basemods.Checkers.human.HumanChecker.check\", return_value=\"\")\r\ndef test_quick_visual_output(mock_click):\r\n    # https://github.com/Ciphey/Ciphey/issues/655\r\n    runner = CliRunner()\r\n    mock_click.return_value = \"y\"\r\n    result = runner.invoke(main, [\"-t\", \"NB2HI4DTHIXS6Z3PN5TWYZJOMNXW2===\"])\r\n    assert result.exit_code == 0\r\n    assert \"base32\" in result.output\r\n"
  },
  {
    "path": "tests/test_regex.py",
    "content": "import pytest\r\n\r\nfrom ciphey import decrypt\r\nfrom ciphey.iface import Config\r\n\r\n\r\ndef test_regex_ip():\r\n    res = decrypt(\r\n        Config().library_default().complete_config(),\r\n        \"MTkyLjE2MC4wLjE=\",\r\n    )\r\n    assert res == \"192.160.0.1\"\r\n\r\n\r\ndef test_regex_domain():\r\n    res = decrypt(\r\n        Config().library_default().complete_config(),\r\n        \"aHR0cHM6Ly9nb29nbGUuY29t\",\r\n    )\r\n    assert res == \"https://google.com\"\r\n\r\n\r\ndef test_regex_bitcoin():\r\n    res = decrypt(\r\n        Config().library_default().complete_config(),\r\n        \"M0ZaYmdpMjljcGpxMkdqZHdWOGV5SHVKSm5rTHRrdFpjNQ==\",\r\n    )\r\n    assert res == \"3FZbgi29cpjq2GjdwV8eyHuJJnkLtktZc5\"\r\n"
  },
  {
    "path": "tools/freq_analysis.py",
    "content": "import json\nimport sys\n\nimport cipheycore\n\ndata = sys.stdin.read()\n\nanalysis = cipheycore.analyse_string(data)\n\nprint(json.dumps({i: j / len(data) for i, j in analysis.freqs.items()}))\n"
  },
  {
    "path": "translations/de/CODE_OF_CONDUCT.md",
    "content": "<p align=\"center\">\nÜbersetzungen <br>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/de/CODE_OF_CONDUCT.md>🇩🇪 DE   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/CODE_OF_CONDUCT.md>🇬🇧 EN   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/hu/CODE_OF_CONDUCT.md>🇭🇺 HU   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/id/CODE_OF_CONDUCT.md>🇮🇩 ID   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/it/CODE_OF_CONDUCT.md>🇮🇹 IT   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/nl/CODE_OF_CONDUCT.md>🇳🇱 NL   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/pt-br/CODE_OF_CONDUCT.md>🇧🇷 PT-BR   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/ru/CODE_OF_CONDUCT.md>🇷🇺 RU   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/zh/CODE_OF_CONDUCT.md>🇨🇳 ZH   </a>\n</p>\n\n# Vereinbarung über Verhaltenskodex für Mitwirkende\n\n## Unsere Verpflichtung\n\nIm Interesse der Förderung eines offenen und einladenden Umfeldes wollen wir uns als Teilnehmer und Verantwortliche unseres Projektes verpflichten, die Teilnahme an dem Projekt und unserer Gemeinschaft zu einer belästigungsfreien Erfahrung zu machen – unabhängig von Alter, Körpergröße, Behinderung, ethnischer Zuordnung, geschlechtlicher Identität und Ausdruck, Erfahrungsstufe, Nationalität, persönlicher Erscheinung, Rasse, Religion oder sexueller Identität oder Orientierung.\n\n## Unsere Standards\n\nBeispiele für Verhaltensweisen, welche dazu beitragen ein positives Umfeld zu erzeugen, beinhalten:\n\n- Die Verwendung von einladenden und einbindenden Formulierungen\n- Abweichenden Ansichten und Erfahrungen wird Respekt entgegengebracht\n- Konstruktive Kritik wird höflich entgegengenommen\n- Fokussierung auf das, was das Beste ist für die Gemeinschaft\n- Verständnis zeigen gegenüber anderen Mitgliedern der Gemeinschaft\n\nBeispiele für nicht akzeptables Verhalten beinhalten:\n\n- Die Verwendung sexualisierter Sprache, Bilder oder Symbolik sowie unerwünschte Versuche sexueller Anbahnung\n- Beleidigende / abwertende Kommentare, persönliche oder politische Angriffe, Nutzung des Internets für unbilliges Verhalten\n- Öffentliche oder private Belästigungen\n- Das Veröffentlichen von privaten Informationen Anderer, wie zum Beispiel physische oder elektronische Adressen, ohne deren ausdrückliche Erlaubnis\n- Anderes Verhalten, welches in einem professionellen Umfeld begründet als unangemessen betrachtet werden kann\n\n## Unsere Verantwortlichkeiten\n\nDie Projektverantwortlichen sind verantwortlich dafür, die Standards für ein akzeptables Benehmen klarzustellen und es wird von ihnen erwartet, dass sie als Reaktion auf jegliches inakzeptables Verhalten passende und faire berichtigende Maßnahmen ergreifen.\n\nDie Projektverantwortlichen haben das Recht und die Verantwortung, Kommentare, Commits, Code, Wiki-Bearbeitungen, Support-Tickets und andere Beiträge, die nicht mit diesem Verhaltenskodex vereinbar sind, zu entfernen, zu bearbeiten oder abzulehnen, und jene Mitwirkende für Verhaltensweisen, die sie für unangemessen, bedrohend, beleidigend oder verletzend halten, zeitweilig oder dauerhaft zu sperren.\n\n## Geltungsbereich\n\nDieser Verhaltenskodex gilt sowohl innerhalb des Projektbereichs als auch in öffentlichen Bereichen, wenn eine Person das Projekt oder seine Gemeinschaft repräsentiert. Beispiele für die Repräsentation eines Projektes oder der Gemeinschaft beinhalten die Verwendung einer offiziellen Projekt-E-Mail-Adresse, das Versenden von Nachrichten über einen öffentlichen Social-Media-Account oder das Handeln als Repräsentant während einer Online- oder Offline-Veranstaltung. Der Begriff \"Repräsentation des Projektes\" kann durch die Projektverantwortlichen weiter ausformuliert und klargestellt werden.\n\n## Umsetzung\n\nFälle von missbräuchlichem, belästigendem oder anderweitig nicht akzeptablem Verhalten können dem Projektteam unter brandon_skerrit gemeldet werden. Alle Beschwerden werden geprüft und untersucht und werden zu einer Antwort führen, die angesichts der Umstände für notwendig und angemessen gehalten wird. Das Projektteam ist verpflichtet, über diejenigen, die Vorfälle gemeldet haben, Verschwiegenheit zu wahren. Weitere Einzelheiten zu speziellen Umsetzungsgrundsätzen können gesondert mitgeteilt werden.\n\nProjektverantwortliche, welche den Verhaltenskodex nicht befolgen, oder nicht nach bestem Wissen und Glauben für dessen Einhaltung sorgen, können sich vorübergehenden oder dauerhaften Auswirkungen gegenüberstehen, die durch andere Mitglieder der Projektleitung bestimmt wurden.\n\n## Bezug\n\nDieser Verhaltenskodex basiert auf dem Contributor Covenant, Version 1.4, verfügbar unter <https://www.contributor-covenant.org/de/version/1/4/code-of-conduct.html>\n"
  },
  {
    "path": "translations/de/CONTRIBUTING.md",
    "content": "<p align=\"center\">\nÜbersetzungen <br>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/de/CONTRIBUTING.md>🇩🇪 DE   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/de/CONTRIBUTING.md>🇬🇧 EN   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/hu/CONTRIBUTING.md>🇭🇺 HU   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/id/CONTRIBUTING.md>🇮🇩 ID   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/it/CONTRIBUTING.md>🇮🇹 IT   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/nl/CONTRIBUTING.md>🇳🇱 NL   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/pt-br/CONTRIBUTING.md>🇧🇷 PT-BR   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/ru/CONTRIBUTING.md>🇷🇺 RU   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/zh/CONTRIBUTING.md>🇨🇳 ZH   </a>\n</p>\n\nHallo! \n\nDu hast also Interesse daran, etwas zu Ciphey beizutragen? 🤔\n\nVielleicht ist Dir nicht ganz klar, wo Du am besten anfangen sollst. Oder vielleicht denkst Du, Deine Programmierfähigkeiten seien \"nicht gut genug\". Was letzteres angeht - totaler Unsinn! Uns macht \"schlechter Code\" rein gar nichts aus. Ganz davon abgesehen spricht die Tatsache, dass Du dieses Dokument liest dafür, dass Du eine hervorragende Programmiererin/ein hervorragender Programmierer bist. Schließlich nehmen nur die wenigsten Anfänger\\*innen an GitHub-Projekten teil. 😉\n\nHier sind ein paar Möglichkeiten, wie Du etwas beitragen kannst:\n* Füge eine neue Sprache hinzu 🧏\n* Entwickle eine neue Entschüsselungsmethode, die uns bisher noch fehlt. 📚 [siehe hier für die Liste](https://github.com/Ciphey/Ciphey/issues/63)\n* Erstelle mehr Dokumentation (sehr wichtig‼️  Wir wären Dir ewig dankbar)\n* Behebe Bugs, die in GitHub Issues eingereicht wurden (wir können Dich hierbei unterstützen 😊)\n* Unsere Codebase refaktorisieren 🥺\n\nWenn das alles etwas schwer klingt, keine Sorge! Dieses Dokument begeleitet dich Schritt-für-Schritt bis zum Erfolg. Außerdem.... Dein Name wird zu Cipheys Liste der Mitwirkenden hinzugefügt! \nZu guter Letzt sind wir Dir natürlich auch noch unheimlich dankbar! 🙏\n\n\nWir haben einen Discord-Server, in dem Du Kontakt zu den Entwicklerinnen & Entwicklern aufnehmen und Hilfe erhalten kannst. Alternativ kannst Du ein GitHub-Issue mit deinem Vorschlag eröffnen. \n\n[Discord-Server](https://discord.gg/KfyRUWw)\n# Wie kann Ich beitragen?\nCiphey braucht immer neue Entschlüsselungsmodule! Um herauszufinden, wie Du Deinen Code in Ciphey integrieren kannst, schau hier rein:\n* https://github.com/Ciphey/Ciphey/wiki/Adding-your-own-ciphers für eine einfache Anleitung.\n* https://github.com/Ciphey/Ciphey/wiki/Extending-Ciphey für die API-Reference.\n\nEs wäre toll, wenn Du ein paar Tests für Deinen Code schreiben könntest. Das ist ganz einfach: \nKopiere Deine Funktion nach Ciphey/tests/test_main.py und ersetze den `ciphertext` mit etwas, das mit Deiner Methode verschlüsselt wurde. Wir werden wahrscheinlich auch Code ohne Tests mergen, dieser ist aber schwerer zu debuggen.\n\nSelbstverständlich werden wir Dich in der Liste der Mitwirkenden für Deine harte Arbeit würdigen!\n\n### Anmerkung für Deutschsprachige:\nFalls Du Hilfe dabei brauchst, die noch nicht übersetzten Teile der englischen Dokumentation zu lesen - oder deine Codekommentare lieber auf Deutsch schreibst - stehe ich Dir gerne für die Übersetzung zur Seite: [@lukasgabriel auf GitHub](https://github.com/lukasgabriel) oder [@flyomotive auf Twitter](https://twitter.com/flyomotive) und im Discord.\nDie deutsche Vereinbarung über den Verhaltenskodex der Mitwirkenden [findest Du hier](CODE_OF_CONDUCT.de.md).\n\n# Eine neue Sprache hinzufügen 🧏\nDie default-Spracherkennung `brandon` funktioniert mit mehreren Sprachen.\nObwohl es vielleicht etwas kompliziert klingt, ist es ganz einfach, eine Sprache hinzuzufügen:\nDu brauchst nur ein Wörterbuch der Sprache, das Du mithilfe eines unserer Tools analysierst. Danach fügst Du das Wörterbuch und die Analyse unserem Repository hinzu. Zuletzt fügst Du die Sprachoption der `settings.yml` hinzu.\n\n# Erstelle Dokumentation\nDie Dokumentation ist der wichtigste Teil von Ciphey. Fehlende Dokumentation stellt eine enorme [technische Schuld](https://de.wikipedia.org/wiki/Technische_Schulden) dar - welche wir natürlich vermeiden wollen.\n\nEins ist sicher: Wenn Du gute Dokumentation beiträgst, wirst Du genauso geschätzt wie alle, die guten Code beitragen! Code zu dokumentieren ist absolut überlebenswichtig für jedes Projekt.\n\nEs gibt viele Wege, zur Dokumentation beizutragen:\n* Docstrings direkt im Code\n* Verbesserung unserer bisherigen Dokumentation (READMEs, Contrib-Datei, unsere *Read The Docs* Seiten,...)\n* Übersetzung von Dokumentation\n\nUnd viele weitere!\n\n# Bugs beheben\nBesuche unsere GitHub Issues, um zu sehen, welche Bugs momentan vorliegen. Wenn Du Bugs behebst, kommst Du selbstverständlich auf die Liste der Mitwirkenden ;-)\n\n# Die Codebase refaktorisieren\nPEP8 wird nicht von unserem gesamten Code eingehalten - und viele Teile des Codes bestehen doppelt.\n"
  },
  {
    "path": "translations/de/README.md",
    "content": "<p align=\"center\">\nÜbersetzungen <br>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/de/README.md>🇩🇪 DE   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/README.md>🇬🇧 EN   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/fr/README.md>🇫🇷 FR   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/hu/README.md>🇭🇺 HU   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/id/README.md>🇮🇩 ID   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/it/README.md>🇮🇹 IT   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/nl/README.md>🇳🇱 NL   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/pt-br/README.md>🇧🇷 PT-BR   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/ru/README.md>🇷🇺 RU   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/zh/README.md>🇨🇳 ZH   </a>\n <br><br>\n➡️\n<a href=\"https://github.com/Ciphey/Ciphey/wiki\">Dokumentation</a> |\n<a href=\"https://discord.ciphey.online\">Discord</a> |\n <a href=\"https://github.com/Ciphey/Ciphey/wiki/Installation\">Installationshilfe</a>\n ⬅️\n\n<br>\n  <img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/binoculars.png\" alt=\"Ciphey\">\n</p>\n\n<p align=\"center\">\n  <img alt=\"GitHub commit activity\" src=\"https://img.shields.io/github/commit-activity/m/ciphey/ciphey\">\n<img src=\"https://pepy.tech/badge/ciphey\">\n <img src=\"https://pepy.tech/badge/ciphey/month\">\n  <a href=\"https://discord.gg/wM3scnc\"><img alt=\"Discord\" src=\"https://img.shields.io/discord/728245678895136898\"></a>\n<a href=\"https://pypi.org/project/ciphey/\"><img src=\"https://img.shields.io/pypi/v/ciphey.svg\"></a>\n  <img src=\"https://img.shields.io/badge/License-MIT-yellow.svg\" alt=\"Ciphey\">\n\n  <img src=\"https://github.com/brandonskerritt/Ciphey/workflows/Python%20application/badge.svg?branch=master\" alt=\"Ciphey\">\n<br>\nVollautomatisiertes Entschlüsselungs-Tool, gestützt durch algorithmische Sprachverarbeitung & künstliche Intelligenz.\n</p>\n<hr>\n\n## [Installationshilfe](https://github.com/Ciphey/Ciphey/wiki/Installation)\n\n| <p align=\"center\"><a href=\"https://pypi.org/project/ciphey\">🐍 Python | <p align=\"center\"><a href=\"https://hub.docker.com/r/remnux/ciphey\">🐋 Docker (Universell) | <p align=\"center\"><a href=\"https://ports.macports.org/port/ciphey/summary\">🍎 MacPorts (macOS) | <p align=\"center\"><a href=\"https://formulae.brew.sh/formula/ciphey\">🍺 Homebrew (macOS/Linux) |\n| --------------------------- | ---------------------------------| ---------------------------------| ---------------------------------|\n| <p align=\"center\"><img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/python.png\" /></p> | <p align=\"center\"><img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/docker.png\" /></p> | <p align=\"center\"><img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/macports.png\" /></p> | <p align=\"center\"><img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/homebrew.png\" /></p> |\n| `python3 -m pip install ciphey --upgrade`  | `docker run -it --rm remnux/ciphey` | `sudo port install ciphey` | `brew install ciphey` |\n\n\n| Linux       | Mac OS | Windows     |\n| ----------- | ------ | ----------- |\n| ![GitHub Workflow Status](https://img.shields.io/github/workflow/status/ciphey/ciphey/Python%20application?label=Linux) |![GitHub Workflow Status](https://img.shields.io/github/workflow/status/ciphey/ciphey/Python%20application?label=Mac%20OS) | ![GitHub Workflow Status](https://img.shields.io/github/workflow/status/ciphey/ciphey/Python%20application?label=Windows) |\n\n\n<hr>\n\n# 🤔 Was ist Ciphey?\nCiphey ist ein vollautomatisches Entschlüsselungs-Tool. Verschlüsselter Text wird eingegeben, entschlüsselter Text kommt zurück.\n> \"Welche Arten von Verschlüsselung?\"\n\nDas ist die Frage. Auch wenn die Art der Verschlüsselung unbekannt ist (und lediglich die Vermutung besteht, dass es sich um verschlüsselten Text handelt), wird Ciphey einen Lösungsweg suchen.\n\nCiphey hat in den meisten Fällen nach circa 3 Sekunden eine Lösung parat.\n\n<p align=\"center\" href=\"https://asciinema.org/a/336257\">\n  <img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/index.gif\" alt=\"Ciphey demo\">\n</p>\n\n**Der technische Teil.** In Ciphey kommt ein maßgeschneidertes KI-Modul (_AuSearch_) mit Verschlüsselungserkennung (_Cipher Detection Interface_) zum Einsatz, das abschätzen kann, mit welcher Methode etwas verschlüsselt wurde. Daraufhin prüft ein dediziertes Spracherkennungs-Interface (_Language Checker Interface_), ob es sich bei dem nun entschlüsselten Text um Klartext handelt.\n\nUnd das ist erst die Spitze des Eisbergs! Eine vollständige technische Erklärung ist in der [Dokumentation](https://docs.ciphey.online/en/latest) zu finden.\n\n# ✨ Funktionen\n\n- **Über 20 unterstützte Verschlüsselungsarten**, zum Beispiel Kodierungen (binär, base64) und traditionelle Verschlüsselungen wie die Caesar-Verschlüsselung, Transposition und weitere. **[Vollständige Liste](https://docs.ciphey.online/en/latest/ciphers.html)**\n- **Maßgeschneidertes KI-Modul mit _Augmented Search (AuSearch)_, das erkennen kann, mit welcher Methode etwas verschlüsselt wurde.** Das Ergebnis sind Laufzeiten von unter 3 Sekunden.\n- **Eigens entwickeltes Spracherkennungs-Modul** Ciphey kann erkennen, ob es sich bei etwas um Klartext handelt, oder nicht. Hierbei ist es nicht nur unglaublich genau, sondern auch unglaublich schnell.\n- **Mehrere unterstützte Sprachen** Momentan nur Deutsch & Englisch.\n- **Unterstützt Verschlüsselungen** Im Vergleich zu Alternativen wie CyberChef Magic, die dies nicht leisten können.\n- **[C++ core](https://github.com/Ciphey/CipheyCore)** Rasend schnell.\n\n# 🔭 Ciphey vs CyberChef\n\n## 🔁 Base64 42-fach kodiert\n\n<table>\n  <tr>\n  <th>Name</th>\n    <th>⚡ Ciphey ⚡ </th>\n    <th>🐢 CyberChef 🐢</th>\n  </tr>\n  <tr>\n  <th>Gif</th>\n    <td><img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/ciphey_gooder_cyberchef.gif\" alt=\"Der Typ, bei dem sie meint, du sollst dir keine Sorgen machen.\"></td>\n    <td><img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/not_dying.gif\" alt=\"Du\"></td>\n  </tr>\n  <tr>\n  <th>Zeit</th>\n    <td>2 Sekunden</td>\n    <td>6 Sekunden</td>\n  </tr>\n    <tr>\n  <th>Setup</th>\n    <td><ul><li>Ciphey mit der Datei ausführen</li></ul></td>\n    <td><ul><li>Regex-Parameter auf \"{\" setzen</li><li>Die Rekursionstiefe muss bekannt sein</li><li>Vor der Ausführung muss bekannt sein, dass es sich von Anfang bis Ende um base64 handelt</li><li>CyberChef (eine aufgeblähte JavaScript-App) muss geladen werden</li><li>Genug Vorwissen über CyberChef, um diese Pipeline überhaupt aufstellen zu können</li><li>Das gefundene Korrelat umkehren</li></ul></td>\n  </tr>\n</table>\n\n\n<sub><b>Hinweis</b> Die GIFs laden asynchron, weshalb es sein kann, dass sie nach und nach erscheinen.</sub><br>\n<sub><b>Eine Bemerkung zu Magic </b>Die Magic-Funktion von CyberChef kommt Ciphey am nächsten. Magic schlägt bei dieser Eingabe sofort fehl und stürzt ab. Die einzige Möglichkeit, CyberChef (für eine Gegenüberstellung mit Ciphey) mit diesem Input zum Laufen zu bekommen war durch eine manuelle Definition durch uns.</sub>\n\n\nAußerdem haben wir Ciphey und CyberChef mit einer **6GB Eingabedatei** gegeneinander antreten lassen. Ciphey hatte nach **5 Minuten und 54 Sekunden** ein Lösung. CyberChef ist abgestürzt, bevor die Entschlüsselung überhaupt begonnen hatte.\n\n\n\n## 📊 Ciphey vs Katana vs CyberChef Magic\n\n| **Name**                                   | ⚡ Ciphey ⚡ | 🤡 Katana 🤡 | 🐢 CyberChef Magic 🐢 |\n| ------------------------------------------ | ---------- | ---------- | ------------------- |\n| Fortschrittliche Spracherkennung           | ✅          | ❌          | ✅                   |\n| Unterstützt Verschlüsselungen              | ✅          | ✅          | ❌                   |\n| Releases benannt nach dystopischen Motiven 🌃   | ✅          | ❌          | ❌              |\n| Unterstützt Hashes                         | ✅          | ✅          | ❌                   |\n| Einfache, unkomplizierte Einrichtung       | ✅          | ❌          | ✅                   |\n| Kann abschätzen, welche Verschlüsselung verwendet wurde | ✅          | ❌          | ❌      |\n| Von Hackern, für Hacker                    | ✅          | ✅          | ❌                   |\n\n# 🎬 Erste Schritte\n\nBei Problemen bei der Installation von Ciphey, [hier weiterlesen.](https://github.com/Ciphey/Ciphey/wiki/Common-Issues-&-Their-Solutions)\n\n## ‼️ Wichtige Links (Docs, Installationshilfe, Discord Support)\n\n| Installationshilfe | Dokumentation | Discord | Docker Image (von REMnux)\n| ------------------ | ------------- | ------- | ------- |\n| 📖 [Installationshilfe](https://github.com/Ciphey/Ciphey/wiki/Installation) | 📚 [Dokumentation](https://github.com/Ciphey/Ciphey/wiki) | 🦜 [Discord](https://discord.ciphey.online) | 🐋 [Docker Dokumentation](https://docs.remnux.org/run-tools-in-containers/remnux-containers#ciphey)\n\n## 🏃‍♀️Ciphey ausführen\nEs gibt 3 Möglichkeiten, Ciphey auszuführen:\n1. Datei als Input `ciphey - verschluesselt.txt`\n2. Unqualifizierter Input `ciphey -- \"Verschlüsselter Input\"`\n3. Standard `ciphey -t \"Verschlüsselter Input\"`\n\n![GIF zeigt drei Möglichkeiten, Ciphey auszuführen.](https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/3ways.gif)\n\nUm die Fortschrittsanzeige, Wahrscheinlichkeitstabelle und andere Anzeigen loszuwerden, kann Ciphey im *Quiet Mode* ausgeführt werden:\n\n```ciphey -t \"Verschlüsselter Text\" -q```\n\nFur eine komplette Liste der Argumente: `ciphey --help`.\n\n### ⚗️ Ciphey importieren\nWer Ciphey als Teil eines eigenen Projekts verwenden will, kann es mit `from Ciphey.__main__ import main` importieren.\n\n# 🎪 Contributors\nCiphey wurde 2008 von [Brandon Skerritt](https://github.com/brandonskerritt) erfunden und 2019 wiederbelebt. Ciphey wäre nicht dort, wo es heute ist, ohne die Hilfe von [Cyclic3](https://github.com/Cyclic3) - Präsident der *Cyber Security Society* der *University of Liverpool*.\n\nCiphey wurde durch die [Cyber Security Society](https://www.cybersoc.cf/) für die Verwendung in CTFs (eine Art Hacker-Wettbewerb) aufgelegt. Wenn Du jemals in Liverpool bist, würden wir uns freuen, wenn Du einen Vortrag halten oder unsere Veranstaltungen sponsern würdest. Kontaktiere uns per E-Mail unter `cybersecurity@society.liverpoolguild.org` um mehr zu erfahren. 🤠\n\n**Einen besonderen Dienst** leistete uns George H, als er uns geholfen hat, den Suchprozess durch Algorithmen zu beschleunigen.\n**Besonderer Dank** an [varghalladesign](https://www.facebook.com/varghalladesign) für die Gestaltung unseres Logos. Schau mal in das Portfolio!\n\n## 🐕‍🦺 [Mitwirken](CONTRIBUTING.md)\nDu möchtest am Projekt teilhaben - keine Angst! Wir haben sehr viele Dinge, die du tun kannst, um uns zu helfen. Jedes Issue ist gelabelt und mit Beispielen unterlegt. Falls Du feststeckst, tagge @brandonskerritt im GitHub-Issue. ✨\n\nAlternativ kannst du unserem Discord-Server beitreten und uns dort direkt erreichen. Den Link findest du in der [Contrib-Datei](CONTRIBUTING.md) und als Badge am Anfang dieser README.\n\nDetails zur Teilnahme findest du in der [Contrib-Datei](CONTRIBUTING.md) ✨\n## 💰 Finanzielle Spender\nFinanzielle Beiträge werden für die zukünftige Entwicklung von Ciphey und dessen Autorinnen und Autoren verwendet. Außerdem kommen finanzielle Zuwendungen der Cyber Security Society an der University of Liverpool zugute.\n\nDa GitHub keine gleichmäßiger Verteilung der Sponsorenbeiträge unterstützt, kannst Du dir einfach einen Link aussuchen - wir regeln den Rest dann unter uns. 🥰\n\n## ✨ Mitwirkende\n\nEin Dankeschön an die folgenden großartigen Helfer: ([Legende](https://allcontributors.org/docs/en/emoji-key))\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://github.com/Cyclic3\"><img src=\"https://avatars1.githubusercontent.com/u/15613874?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>cyclic3</b></sub></a><br /><a href=\"#design-cyclic3\" title=\"Design\">🎨</a> <a href=\"#maintenance-cyclic3\" title=\"Maintenance\">🚧</a> <a href=\"https://github.com/Ciphey/Ciphey/commits?author=cyclic3\" title=\"Code\">💻</a> <a href=\"#ideas-cyclic3\" title=\"Ideas, Planning, & Feedback\">🤔</a></td>\n    <td align=\"center\"><a href=\"https://skerritt.blog\"><img src=\"https://avatars3.githubusercontent.com/u/10378052?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Brandon</b></sub></a><br /><a href=\"#design-brandonskerritt\" title=\"Design\">🎨</a> <a href=\"#maintenance-brandonskerritt\" title=\"Maintenance\">🚧</a> <a href=\"https://github.com/Ciphey/Ciphey/commits?author=brandonskerritt\" title=\"Code\">💻</a> <a href=\"#ideas-brandonskerritt\" title=\"Ideas, Planning, & Feedback\">🤔</a></td>\n    <td align=\"center\"><a href=\"https://github.com/michalani\"><img src=\"https://avatars0.githubusercontent.com/u/27767884?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>michalani</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=michalani\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/ashb07\"><img src=\"https://avatars2.githubusercontent.com/u/24845568?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>ashb07</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=ashb07\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/TheAlcanian\"><img src=\"https://avatars3.githubusercontent.com/u/22127191?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Shardion</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/issues?q=author%3ATheAlcanian\" title=\"Bug reports\">🐛</a></td>\n    <td align=\"center\"><a href=\"https://github.com/Bryzizzle\"><img src=\"https://avatars0.githubusercontent.com/u/57810197?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Bryan</b></sub></a><br /><a href=\"#translation-Bryzizzle\" title=\"Translation\">🌍</a> <a href=\"https://github.com/Ciphey/Ciphey/commits?author=Bryzizzle\" title=\"Documentation\">📖</a></td>\n    <td align=\"center\"><a href=\"https://lukasgabriel.net\"><img src=\"https://avatars0.githubusercontent.com/u/52338810?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Lukas Gabriel</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=lukasgabriel\" title=\"Code\">💻</a> <a href=\"https://github.com/Ciphey/Ciphey/issues?q=author%3Alukasgabriel\" title=\"Bug reports\">🐛</a></td>\n  </tr>\n  <tr>\n    <td align=\"center\"><a href=\"https://github.com/DarshanBhoi\"><img src=\"https://avatars2.githubusercontent.com/u/70128281?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Darshan</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/issues?q=author%3ADarshanBhoi\" title=\"Bug reports\">🐛</a></td>\n    <td align=\"center\"><a href=\"https://github.com/SkeletalDemise\"><img src=\"https://avatars1.githubusercontent.com/u/29117662?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>SkeletalDemise</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=SkeletalDemise\" title=\"Code\">💻</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-enable -->\n<!-- prettier-ignore-end -->\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nDieses Projekt folgt der [All-Contributors](https://github.com/all-contributors/all-contributors) Spezifikation. Jede Art von Beitrag ist herzlich willkommen!\n"
  },
  {
    "path": "translations/fr/README.md",
    "content": "<p align=\"center\">\nTraductions <br>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/de/README.md>🇩🇪 DE   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/README.md>🇬🇧 EN   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/fr/README.md>🇫🇷 FR   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/hu/README.md>🇭🇺 HU   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/id/README.md>🇮🇩 ID   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/it/README.md>🇮🇹 IT   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/nl/README.md>🇳🇱 NL   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/pt-br/README.md>🇧🇷 PT-BR   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/ru/README.md>🇷🇺 RU   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/zh/README.md>🇨🇳 ZH   </a>\n <br><br>\n➡️\n<a href=\"https://github.com/Ciphey/Ciphey/wiki\">Documentation</a> |\n<a href=\"https://discord.ciphey.online\">Discord</a> |\n <a href=\"https://github.com/Ciphey/Ciphey/wiki/Installation\">Guide d'installation</a>\n ⬅️\n\n<br>\n  <img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/binoculars.png\" alt=\"Ciphey\">\n</p>\n\n<p align=\"center\">\n  <img alt=\"GitHub commit activity\" src=\"https://img.shields.io/github/commit-activity/m/ciphey/ciphey\">\n<img src=\"https://pepy.tech/badge/ciphey\">\n <img src=\"https://pepy.tech/badge/ciphey/month\">\n  <a href=\"https://discord.gg/wM3scnc\"><img alt=\"Discord\" src=\"https://img.shields.io/discord/728245678895136898\"></a>\n<a href=\"https://pypi.org/project/ciphey/\"><img src=\"https://img.shields.io/pypi/v/ciphey.svg\"></a>\n  <img src=\"https://img.shields.io/badge/License-MIT-yellow.svg\" alt=\"Ciphey\">\n\n  <img src=\"https://github.com/brandonskerritt/Ciphey/workflows/Python%20application/badge.svg?branch=master\" alt=\"Ciphey\">\n<br>\nOutils complètement automatisé de décryptage/décodage/craquage utilisant le traitement automatique du language naturel et de l'intelligence artificiel ainsi qu'un peu de bon sens.\n</p>\n<hr>\n\n## [Guide d'installation](https://github.com/Ciphey/Ciphey/wiki/Installation)\n\n| <p align=\"center\"><a href=\"https://pypi.org/project/ciphey\">🐍 Python | <p align=\"center\"><a href=\"https://hub.docker.com/r/remnux/ciphey\">🐋 Docker (Universel) | <p align=\"center\"><a href=\"https://ports.macports.org/port/ciphey/summary\">🍎 MacPorts (macOS) | <p align=\"center\"><a href=\"https://formulae.brew.sh/formula/ciphey\">🍺 Homebrew (macOS/Linux) |\n| --------------------------------------------------------------------- | --------------------------------------------------------------------------------- | --------------------------------------------------------------------------------- | --------------------------------------------------------------------------------- |\n| <p align=\"center\"><img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/python.png\" /></p> | <p align=\"center\"><img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/docker.png\" /></p> | <p align=\"center\"><img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/macports.png\" /></p> | <p align=\"center\"><img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/homebrew.png\" /></p> |\n| `python3 -m pip install ciphey --upgrade` | `docker run -it --rm remnux/ciphey` | `sudo port install ciphey` | `brew install ciphey` |\n\n| Linux                                                                                                                   | Mac OS                                                                                                                     | Windows                                                                                                                   |\n| ----------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- |\n| ![GitHub Workflow Status](https://img.shields.io/github/workflow/status/ciphey/ciphey/Python%20application?label=Linux) | ![GitHub Workflow Status](https://img.shields.io/github/workflow/status/ciphey/ciphey/Python%20application?label=Mac%20OS) | ![GitHub Workflow Status](https://img.shields.io/github/workflow/status/ciphey/ciphey/Python%20application?label=Windows) |\n\n<hr>\n\n# 🤔 C'est quoi ?\n\nTexte en entrée crypté, texte decrypté en sortie.\n\n> \"Quel type de cryptage ?\"\n\nC'est le but. Vous ne savez pas, vous savez simplement que c'est probablement crypté. Ciphey le déterminera pour vous.\n\nCiphey peut résoudre la plupart des tâches en moins de 3 secondes.\n\n<p align=\"center\" href=\"https://asciinema.org/a/336257\">\n  <img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/index.gif\" alt=\"Ciphey demo\">\n</p>\n\nCiphey se veut un outil permettant d'automatiser un grand nombre de décryptages et de décodages tels que les codages à bases multiples, les chiffrages classiques, les hachages ou la cryptographie plus avancée.\n\nSi vous ne savez pas grand-chose sur la cryptographie, ou si vous voulez vérifier rapidement le texte chiffré avant de le traiter vous-même, Ciphey est fait pour vous.\n\n**La partie technique.** Ciphey utilise un module d'intelligence artificielle personnalisé (_AuSearch_) avec une _interface de détection de chiffrement_ pour déterminer approximativement avec quoi la donnée est chiffrée. Puis une _interface de vérification du langage_, qui peut détecter quand le texte donné devient du texte en clair.\n\nPas de réseaux neuronaux ni d'IA ici. Nous n'utilisons que ce qui est rapide et minimal.\n\nEt ce n'est que la partie visible de l'iceberg. Pour l'explication technique complète, consultez notre [documentation](https://github.com/Ciphey/Ciphey/wiki).\n\n# ✨ Fonctionnalités\n\n- **Plus de 30 cryptages pris en charge** , tels que les codages (binaire, base64) et les cryptages normaux comme le chiffrement César, la clé de répétition XOR et plus encore. **[Pour la liste complète, cliquez ici](https://github.com/Ciphey/Ciphey/wiki/Supported-Ciphers)**\n- **Intelligence artificielle sur mesure avec recherche augmentée (AuSearch) pour répondre à la question \"quel cryptage a été utilisé ?\"** Résultant à un décryptage en moins de 3 secondes.\n- **Module de traitement du langage naturel sur mesure** Ciphey peut déterminer si un texte est en clair ou non. Qu'il s'agisse de JSON, d'un drapeau du CTF ou de l'anglais, Ciphey peut l'obtenir en quelques millisecondes.\n- **Support multilingue** pour l'instant, seul l'allemand et l'anglais (avec des variantes AU, UK, CAN, USA).\n- **Supporte les cryptages et les hachages**, ce qui n'est pas le cas des alternatives telles que CyberChef Magic.\n- **[Noyau C++](https://github.com/Ciphey/CipheyCore)** ultra rapide.\n\n# 🔭 Ciphey vs CyberChef\n\n## 🔁 Base64 Encodé 42 fois\n\n<table>\n  <tr>\n  <th>Nom</th>\n    <th>⚡ Ciphey ⚡ </th>\n    <th>🐢 CyberChef 🐢</th>\n  </tr>\n  <tr>\n  <th>Gif</th>\n    <td><img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/ciphey_gooder_cyberchef.gif\" alt=\"The guy she tells you not to worry about\"></td>\n    <td><img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/not_dying.gif\" alt=\"You\"></td>\n  </tr>\n  <tr>\n  <th>Temps</th>\n    <td>2 seconds</td>\n    <td>6 seconds</td>\n  </tr>\n    <tr>\n  <th>Configuration</th>\n    <td><ul><li>Lancer ciphey sur le fichier</li></ul></td>\n    <td>\n      <ul>\n        <li>Régler le paramètre de regex sur \"{\"</li>\n        <li>Vous devez savoir combien de fois il faut recommencer</li>\n        <li>Vous devez savoir que c'est du Base64 à la fin</li>\n        <li>Vous devez charger CyberChef (c'est une application JS volumineuse)</li>\n        <li>En savoir assez sur CyberChef pour créer ce pipeline</li>\n        <li>Inverser la correspondance</li>\n      </ul>\n    </td>\n  </tr>\n</table>\n\n<sub><b>Note</b> Les gifs peuvent se charger à des moments différents, de sorte que l'un peut apparaître beaucoup plus rapidement qu'un autre.</sub><br>\n<sub><b>Une note sur la magie </b>La fonctionnalité de CyberChef la plus similaire à celle de Ciphey est la magie. Magic échoue instantanément sur cette entrée et se bloque. La seule façon de forcer CyberChef à rivaliser est de le définir manuellement.</sub>\n\nNous avons également testé CyberChef et Ciphey avec un fichier de **6gb**. Ciphey l'a cracké en **5 minutes et 54 secondes**. CyberChef s'est planté avant même d'avoir commencé.\n\n## 📊 Ciphey vs Katana vs CyberChef Magic\n\n| **Nom**                                         | ⚡ Ciphey ⚡ | 🗡️ Katana 🗡️ | 🐢 CyberChef Magic 🐢 |\n| ----------------------------------------------- | ------------ | ------------ | --------------------- |\n| Vérificateur de langue avancé                   | ✅           | ❌           | ✅                    |\n| Prise en charge des cryptages                   | ✅           | ✅           | ❌                    |\n| Sorties portant le nom de thèmes dystopiens 🌃  | ✅           | ❌           | ❌                    |\n| Supporte les hashes                             | ✅           | ✅           | ❌                    |\n| Facile à configurer                             | ✅           | ❌           | ✅                    |\n| Peut deviner avec quoi quelque chose est crypté | ✅           | ❌           | ❌                    |\n| Créé pour les hackers par les hackers           | ✅           | ✅           | ❌                    |\n\n# 🎬 Pour commencer\n\nSi vous avez des difficultés à installer Ciphey, [lisez ceci.](https://github.com/Ciphey/Ciphey/wiki/Common-Issues-&-Their-Solutions)\n\n## ‼️ Liens importants (Documentations, Guide d'installation, Support Discord)\n\n| Guide d'installation                                                          | Documentation                                             | Discord                                     | Image Docker (de REMnux)                                                                            |\n| ----------------------------------------------------------------------------- | --------------------------------------------------------- | ------------------------------------------- | --------------------------------------------------------------------------------------------------- |\n| 📖 [Guide d'installation](https://github.com/Ciphey/Ciphey/wiki/Installation) | 📚 [Documentation](https://github.com/Ciphey/Ciphey/wiki) | 🦜 [Discord](https://discord.ciphey.online) | 🐋 [Documentation Docker](https://docs.remnux.org/run-tools-in-containers/remnux-containers#ciphey) |\n\n## 🏃‍♀️ Lancer Ciphey\n\nIl y'a 3 manières de lancer Cyphey\n\n1. Fichier en entrée `ciphey -f crypte.txt`\n2. Entrée non qualifiée `ciphey -- \"entrée cryptée\"`\n3. Méthode standard `ciphey -t \"entrée cryptée\"`\n\n![Gif montrant 3 manières de lancer Cyphey](https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/3ways.gif)\n\nPour éliminer les barres de progression, le tableau des probabilités et tout le bruit, utilisez le mode silencieux.\n\n`ciphey -t \"text cryptée ici\" -q`\n\nPour une liste complète des arguments, lancez `ciphey --help`.\n\n### ⚗️ Importer Ciphey\n\nVous pouvez importer le main de Ciphey et l'utiliser dans vos propres programmes et codes. `from Ciphey.__main__ import main`\n\n# 🎪 Contributeurs\n\nCiphey a été inventé par [Brandon](https://github.com/bee-san) en 2008, et relancé en 2019. Ciphey ne serait pas où il en est aujourd'hui sans [Cyclic3](https://github.com/Cyclic3) - president de la UoL's Cyber Security Society.\n\nCiphey a été relancé et recrée par la [Cyber Security Society](https://www.cybersoc.cf/) pour une utilisation lors de CTFs. Si jamais vous êtes à Liverpool, envisagez de donner une conférence ou de parrainer nos événements. Envoyez nous un email à `cybersecurity@society.liverpoolguild.org` pour en savoir plus 🤠\n\n**Crédit majeur** à George H pour avoir trouvé comment nous pourrions utiliser des algorithmes appropriés pour accélérer le processus de recherche.\n**Remerciements particuliers** à [varghalladesign](https://www.facebook.com/varghalladesign) pour avoir designé le logo. Jetez un coup d'oeil à leurs autres créations !\n\n## 🐕‍🦺 [Contribuer](https://github.com/Ciphey/Ciphey/wiki/Contributing)\n\nN'ayez pas peur de contribuer ! Nous avons de très nombreuses choses que vous pouvez faire pour nous aider. Chacune d'entre elles est étiquetée et facilement expliquée à l'aide d'exemples. Si vous essayez de contribuer mais que vous êtes bloqué, identifiez @bee-san ou @cyclic3 dans l'issue sur GitHub ✨\n\nVous pouvez également rejoindre le groupe Discord et y envoyer un message (lien dans le fichier de [contributions](https://github.com/Ciphey/Ciphey/wiki/Contributing)) ou en haut de ce README comme un badge.\n\nVeuillez lire le [fichier de contribution](https://github.com/Ciphey/Ciphey/wiki/Contributing) pour les détails exacts sur la façon de contribuer ✨\n\nEn faisant cela, votre nom sera ajouté au README ci-dessous et vous aurez la chance de faire partie d'un projet en constante évolution !\n\n[![Stargazers dans le temps](https://starchart.cc/Ciphey/Ciphey.svg)](https://starchart.cc/Ciphey/Ciphey)\n\n## 💰 Contributeurs financier\n\nLes contributions serviront à financer non seulement l'avenir de Ciphey et de ses auteurs, mais aussi la Cyber Security Society de l'université de Liverpool.\n\nGitHub ne soutient pas l'idée de \"sponsoriser ce projet et nous distribuerons l'argent de manière équitable\", alors choisissez un lien et nous nous en occuperons de notre côté 🥰\n\n## ✨ Contributeurs\n\nMerci à ces personnes formidables ([clé emoji](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://github.com/Cyclic3\"><img src=\"https://avatars1.githubusercontent.com/u/15613874?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>cyclic3</b></sub></a><br /><a href=\"#design-cyclic3\" title=\"Design\">🎨</a> <a href=\"#maintenance-cyclic3\" title=\"Maintenance\">🚧</a> <a href=\"https://github.com/Ciphey/Ciphey/commits?author=cyclic3\" title=\"Code\">💻</a> <a href=\"#ideas-cyclic3\" title=\"Ideas, Planning, & Feedback\">🤔</a></td>\n    <td align=\"center\"><a href=\"https://skerritt.blog\"><img src=\"https://avatars3.githubusercontent.com/u/10378052?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Brandon</b></sub></a><br /><a href=\"#design-brandonskerritt\" title=\"Design\">🎨</a> <a href=\"#maintenance-brandonskerritt\" title=\"Maintenance\">🚧</a> <a href=\"https://github.com/Ciphey/Ciphey/commits?author=brandonskerritt\" title=\"Code\">💻</a> <a href=\"#ideas-brandonskerritt\" title=\"Ideas, Planning, & Feedback\">🤔</a></td>\n    <td align=\"center\"><a href=\"https://github.com/michalani\"><img src=\"https://avatars0.githubusercontent.com/u/27767884?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>michalani</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=michalani\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/ashb07\"><img src=\"https://avatars2.githubusercontent.com/u/24845568?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>ashb07</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=ashb07\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/TheAlcanian\"><img src=\"https://avatars3.githubusercontent.com/u/22127191?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Shardion</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/issues?q=author%3ATheAlcanian\" title=\"Bug reports\">🐛</a></td>\n    <td align=\"center\"><a href=\"https://github.com/Bryzizzle\"><img src=\"https://avatars0.githubusercontent.com/u/57810197?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Bryan</b></sub></a><br /><a href=\"#translation-Bryzizzle\" title=\"Translation\">🌍</a> <a href=\"https://github.com/Ciphey/Ciphey/commits?author=Bryzizzle\" title=\"Documentation\">📖</a></td>\n    <td align=\"center\"><a href=\"https://lukasgabriel.net\"><img src=\"https://avatars0.githubusercontent.com/u/52338810?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Lukas Gabriel</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=lukasgabriel\" title=\"Code\">💻</a> <a href=\"https://github.com/Ciphey/Ciphey/issues?q=author%3Alukasgabriel\" title=\"Bug reports\">🐛</a> <a href=\"#translation-lukasgabriel\" title=\"Translation\">🌍</a> <a href=\"#ideas-lukasgabriel\" title=\"Ideas, Planning, & Feedback\">🤔</a></td>\n  </tr>\n  <tr>\n    <td align=\"center\"><a href=\"https://github.com/DarshanBhoi\"><img src=\"https://avatars2.githubusercontent.com/u/70128281?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Darshan</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/issues?q=author%3ADarshanBhoi\" title=\"Bug reports\">🐛</a></td>\n    <td align=\"center\"><a href=\"https://github.com/SkeletalDemise\"><img src=\"https://avatars1.githubusercontent.com/u/29117662?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>SkeletalDemise</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=SkeletalDemise\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://www.patreon.com/cclauss\"><img src=\"https://avatars3.githubusercontent.com/u/3709715?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Christian Clauss</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=cclauss\" title=\"Code\">💻</a> <a href=\"https://github.com/Ciphey/Ciphey/issues?q=author%3Acclauss\" title=\"Bug reports\">🐛</a></td>\n    <td align=\"center\"><a href=\"http://machinexa.xss.ht\"><img src=\"https://avatars1.githubusercontent.com/u/60662297?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Machinexa2</b></sub></a><br /><a href=\"#content-machinexa2\" title=\"Content\">🖋</a></td>\n    <td align=\"center\"><a href=\"https://github.com/anantverma275\"><img src=\"https://avatars1.githubusercontent.com/u/18184503?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Anant Verma</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=anantverma275\" title=\"Code\">💻</a> <a href=\"https://github.com/Ciphey/Ciphey/issues?q=author%3Aanantverma275\" title=\"Bug reports\">🐛</a></td>\n    <td align=\"center\"><a href=\"https://github.com/XVXTOR\"><img src=\"https://avatars1.githubusercontent.com/u/40268197?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>XVXTOR</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=XVXTOR\" title=\"Documentation\">📖</a></td>\n    <td align=\"center\"><a href=\"https://github.com/Itamikame\"><img src=\"https://avatars2.githubusercontent.com/u/59034423?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Itamikame</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=Itamikame\" title=\"Code\">💻</a></td>\n  </tr>\n  <tr>\n    <td align=\"center\"><a href=\"https://github.com/MikeMerz\"><img src=\"https://avatars3.githubusercontent.com/u/50526795?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>MikeMerz</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=MikeMerz\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/jacobggman\"><img src=\"https://avatars2.githubusercontent.com/u/30216976?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Jacob Galam</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=jacobggman\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://tuxthexplorer.github.io/\"><img src=\"https://avatars1.githubusercontent.com/u/37508897?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>TuxTheXplorer</b></sub></a><br /><a href=\"#translation-TuxTheXplorer\" title=\"Translation\">🌍</a></td>\n    <td align=\"center\"><a href=\"https://github.com/Itamai\"><img src=\"https://avatars3.githubusercontent.com/u/53093696?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Itamai</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=Itamai\" title=\"Code\">💻</a> <a href=\"https://github.com/Ciphey/Ciphey/issues?q=author%3AItamai\" title=\"Bug reports\">🐛</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-enable -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n"
  },
  {
    "path": "translations/hu/CODE_OF_CONDUCT.md",
    "content": "<p align=\"center\">\nFordítások <br>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/de/CODE_OF_CONDUCT.md>🇩🇪 DE   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/CODE_OF_CONDUCT.md>🇬🇧 EN   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/hu/CODE_OF_CONDUCT.md>🇭🇺 HU   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/id/CODE_OF_CONDUCT.md>🇮🇩 ID   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/it/CODE_OF_CONDUCT.md>🇮🇹 IT   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/nl/CODE_OF_CONDUCT.md>🇳🇱 NL   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/pt-br/CODE_OF_CONDUCT.md>🇧🇷 PT-BR   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/ru/CODE_OF_CONDUCT.md>🇷🇺 RU   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/zh/CODE_OF_CONDUCT.md>🇨🇳 ZH   </a>\n</p>\n\n# Közreműködői magatartási kódex\n\n## Zálogunk\n\nA nyitott és barátságos környezet elősegítése érdekében, mi,\na közreműködők és fenntartók ígéretet teszünk arra, hogy részt veszünk projektünkben, és\nmindent megteszünk, hogy közösségünk zaklatásmentes élményt nyújtson mindenkinek,\nkortól, testtől, mérettől, fogyatékosságtól, etnikumtól, nemi jellemzőktől, nemi identitás és kifejezés,\ntapasztalati szint, végzettség, társadalmi-gazdasági helyzet, nemzetiség, személyes\nmegjelenés, faj, vallás vagy szexuális identitás és orientációtól függetlenül.\n\n## Szabványaink\n\nPéldák olyan viselkedésre, melyek hozzájárulnak a pozitív környezet kialakításához:\n\n- Üdvözlő és befogadó nyelv használata\n- Tiszteletben tartani az eltérő nézőpontokat és tapasztalatokat\n- Építő kritikák elfogadása\n- Összpontosítás arra, ami a közösség számára a legjobb\n- Empátia mutatása a közösség többi tagjával szemben\n\nPéldák a résztvevők által elfogadhatatlan viselkedésre:\n\n- Szexualizált nyelvezet vagy képek használata és nem kívánt szexuális figyelem vagy tolakodáss\n- Trollkodás, sértő / becsmérlő megjegyzések és személyes vagy politikai támadások\n- Nyilvános vagy magán zaklatás\n- Mások személyes adatainak, például fizikai vagy elektronikus címének közzététele kifejezett engedély nélkül\n- Egyéb magatartás, amely szakmai körülmények között ésszerűen helytelennek tekinthető\n\n## Feladataink\n\nA projekt fenntartói felelősek az elfogadható szabványok tisztázásáért\nviselkedését, és várhatóan megfelelő és tisztességes korrekciós intézkedéseket foganatosítanak\nválaszként az elfogadhatatlan viselkedés esetére.\n\nA projektfenntartóknak joguk és felelősségük van eltávolítani, szerkeszteni vagy\nelutasítani azokat a megjegyzéseket, elkötelezettségeket, kódokat, wiki-szerkesztéseket, kérdéseket és az egyéb hozzászólásokat amelyek nem felelnek meg ennek a magatartási kódexnek, vagy ideiglenesen vagy\ntartósan közreműködő más magatartás miatt, amelyet nem tartunk megfelelőnek, fenyegető, sértő vagy káros.\n\n## Hatály\n\nEz a magatartási kódex a projekttereken és a nyilvános tereken egyaránt érvényes\namikor az egyén képviseli a projektet vagy közösségét. Például\negy projekt vagy közösség képviseletéhez tartozik egy hivatalos projekt e-mail használata, egy hivatalos közösségi médiafiókon keresztül történő közzététel, vagy kinevezettként való eljárás\nképviselője egy online vagy offline eseményen. A projekt képviseletét\ntovább meghatározzák és pontosítják a projektfenntartók.\n\n## Végrehajtás\n\nErőszakos, zaklató vagy más módon elfogadhatatlan viselkedés\njelenltésre kerül a projekt csapatával. Minden panaszt felül fognak vizsgálni és kivizsgálják, és a körülményekhez megfelelőnek tekinthető választ fognak adni. A projekt csapata\nköteles megőrizni a titoktartást az eseménnyel kapcsolatban.\nA konkrét végrehajtási irányelvek további részleteit külön közzétehetjük.\n\nAzok a projektfenntartók, akik nem követik és nem tartják be megfelelően a magatartási kódexet, bizalmi megvonásban részesülnek átmenetileg vagy véglegesen a projekt vezetésének tagjai által.\n\n## Hozzárendelés\n\nEz a magatartási kódexet a [Contributor Covenant][homepage], formájára készült, version 1.4,\nelérhető <https://www.contributor-covenant.org/version/1/4/code-of-conduct.html>\n\n[honlap]: https://www.contributor-covenant.org\n\nA magatartási kódex-szel kapcsolatos gyakori kérdésekre adott válaszokért lásd:<https://www.contributor-covenant.org/faq>\n"
  },
  {
    "path": "translations/hu/CONTRIBUTING.md",
    "content": "<p align=\"center\">\nFordítások <br>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/de/CONTRIBUTING.md>🇩🇪 DE   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/de/CONTRIBUTING.md>🇬🇧 EN   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/hu/CONTRIBUTING.md>🇭🇺 HU   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/id/CONTRIBUTING.md>🇮🇩 ID   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/it/CONTRIBUTING.md>🇮🇹 IT   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/nl/CONTRIBUTING.md>🇳🇱 NL   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/pt-br/CONTRIBUTING.md>🇧🇷 PT-BR   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/ru/CONTRIBUTING.md>🇷🇺 RU   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/zh/CONTRIBUTING.md>🇨🇳 ZH   </a>\n</p>\n\nMizu!\n\nSzóval érdekel a Ciphey-hoz történő közreműködés? 🤔\n\nDe lehet, hogy zavarban vagy, hogy hol kezdd, vagy úgy gondolod, hogy a kódolási képességeid nem \"elég jók\". Nos, ez utóbbi - nevetséges! Teljesen rendben vagyunk a \"rossz kóddal\", és amúgy is, ha elolvastad ezt a dokumentumot, valószínűleg remek programozó vagy. Úgy értem, az újoncok nem gyakran járulnak hozzá GitHub projektekhez 😉\n\nÍme néhány módszer, amellyel hozzájárulhatsz a Ciphey-hoz:\n\n- Fordítsd le egy új nyelvre 🧏\n- Adj hozzá több titkosítási formát 📚\n- Készíts további dokumentumokat (nagyon fontos‼️ Örökké hálásak lennénk)\n- Javítsd ki a GitHub Issues-on szereplő bugokat (ebben segítünk 😊)\n- Alakítsd át a kódbázist 🥺\n\nHa ezek keményen hangzanak, ne aggódj! Ez a dokumentum pontosan bemutatja, hogyan lehet elérni ezeket. És még többet .... A neved bekerül a Ciphey közreműködői listájába, és örökké hálásak leszünk! 🙏\n\nVan egy kis Discord szerverünk, ahol beszélgethetsz a fejlesztőkkel, és segítséget kaphatsz. Alternatív megoldásként írj egy GitHub-Issue-t a javaslatodról. Ha csatlakozni akarsz a Discordhoz:\n\n[Discord Server](https://discord.gg/KfyRUWw)\n\n# Hogy lehet hozzájárulni\n\nA Ciphey-nak mindig több dekódoló eszközre van szüksége! Ha meg szeretnéd tudni, hogyan integrálhatsz egy kódot a titkosításba, nézdd meg ezeket:\n\n- <https://github.com/Ciphey/Ciphey/wiki/Adding-your-own-ciphers> Egyszerű példa\n- <https://github.com/Ciphey/Ciphey/wiki/Extending-Ciphey> API referencia\n\nJó lenne, ha néhány tesztet írnál rá, egyszerűen másolj át egy függvényt a Ciphey / tests / test_main.py fájlba, és cseréld le a rejtjelszöveget a titkosításával kódolt valamire. Ha nem adsz hozzá teszteket, valószínűleg továbbra is egyesítjük a kódot, de sokkal nehezebb lesz diagnosztizálnunk a hibákat!\n\nMagától értetődik, hogy felveszünk téged a közreműködők listájába kemény munkádért!\n\n# Adj hozzá egy új nyelvet 🧏\n\nAz alapértelmezett nyelvellenőrző, `brandon`, több nyelvvel is működik. Ez ijesztően hangozhat.\nDe őszintén szólva mindössze annyit kell tenned, hogy veszel egy szótárat, elvégzel egy kis elemzést (ehhez van segítő kódunk), majd hozzáadod a szótárat és az elemzéseket egy repóhoz. Ezután hozzáadod a nyelvet a `settings.yml` fájlhoz.\n\n# Készíts további dokumentációt\n\nA dokumentáció a Ciphey legfontosabb része. Minél több dokumentáció, annál jobb.\n\nÉs bízz bennem, amikor azt mondom, ha hozzájárulsz a nagyszerű dokumentációhoz, akkor ugyanazon a szinten leszel látható, mint a kód-közreműködők. A dokumentáció elengedhetetlen.\n\nNagyon sokféleképpen járulhatsz hozzá a dokumentációhoz.\n\n- Doc stringek beillesztése a kódba\n- A jelenlegi dokumentáció javítása (README, ez a fájl, a Read The Docs oldalunk)\n- Dokumentáció fordítása\n\nÉs még sok más!\n\n# Javíts bugokat\n\nLátogass el a GitHub-Issues oldalunkra, ahol megtalálod a Ciphey összes hibáját! Javítsd ki őket és felkerülsz a közreműködők listájára ;)\n\n# Alakítsd át a kódbázist\n\nCiphey nem minden része követi a PEP8 szabályzatot, és sok az ismétlődő kódrészlet.\n"
  },
  {
    "path": "translations/hu/README.md",
    "content": "<p align=\"center\">\nFordítások <br>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/de/README.md>🇩🇪 DE   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/README.md>🇬🇧 EN   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/fr/README.md>🇫🇷 FR   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/hu/README.md>🇭🇺 HU   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/id/README.md>🇮🇩 ID   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/it/README.md>🇮🇹 IT   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/nl/README.md>🇳🇱 NL   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/pt-br/README.md>🇧🇷 PT-BR   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/ru/README.md>🇷🇺 RU   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/zh/README.md>🇨🇳 ZH   </a>\n <br><br>\n➡️\n<a href=\"https://github.com/Ciphey/Ciphey/wiki\">Dokumentáció</a> |\n<a href=\"https://discord.ciphey.online\">Discord</a> |\n<a href=\"https://github.com/Ciphey/Ciphey/wiki/Installation\">Telepítési Útmutató</a>\n⬅️\n\n<br>\n  <img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/binoculars.png\" alt=\"Ciphey\">\n</p>\n\n<p align=\"center\">\n  <img alt=\"GitHub commit activity\" src=\"https://img.shields.io/github/commit-activity/m/ciphey/ciphey\">\n<img src=\"https://pepy.tech/badge/ciphey\">\n <img src=\"https://pepy.tech/badge/ciphey/month\">\n  <a href=\"https://discord.gg/wM3scnc\"><img alt=\"Discord\" src=\"https://img.shields.io/discord/728245678895136898\"></a>\n<a href=\"https://pypi.org/project/ciphey/\"><img src=\"https://img.shields.io/pypi/v/ciphey.svg\"></a>\n  <img src=\"https://img.shields.io/badge/License-MIT-yellow.svg\" alt=\"Ciphey\">\n\n  <img src=\"https://github.com/brandonskerritt/Ciphey/workflows/Python%20application/badge.svg?branch=master\" alt=\"Ciphey\">\n<br>\n\nTeljesen automatizált dekódoló program, mely a mesterséges intelligenciát és természetes nyelvi feldolgozást használva képes különböző fajta kódolásokat visszafejteni, feltörni és dekódolni.\n\n</p>\n<hr>\n\n## [Telepítési Útmutató](https://github.com/Ciphey/Ciphey/wiki/Installation)\n\n| <p align=\"center\"><a href=\"https://pypi.org/project/ciphey\">🐍 Python | <p align=\"center\"><a href=\"https://hub.docker.com/r/remnux/ciphey\">🐋 Docker (Universal) | <p align=\"center\"><a href=\"https://ports.macports.org/port/ciphey/summary\">🍎 MacPorts (macOS) | <p align=\"center\"><a href=\"https://formulae.brew.sh/formula/ciphey\">🍺 Homebrew (macOS/Linux) |\n| --------------------------------------------------------------------- | --------------------------------------------------------------------------------- | --------------------------------------------------------------------------------- |--------------------------------------------------------------------------------- |\n| <p align=\"center\"><img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/python.png\" /></p>    | <p align=\"center\"><img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/docker.png\" /></p> | <p align=\"center\"><img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/macports.png\" /></p> | <p align=\"center\"><img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/homebrew.png\" /></p> |\n| `python3 -m pip install ciphey --upgrade` | `docker run -it --rm remnux/ciphey` | `sudo port install ciphey` | `brew install ciphey` |\n\n| Linux                                                                                                                   | Mac OS                                                                                                                     | Windows                                                                                                                   |\n| ----------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- |\n| ![GitHub Workflow Status](https://img.shields.io/github/workflow/status/ciphey/ciphey/Python%20application?label=Linux) | ![GitHub Workflow Status](https://img.shields.io/github/workflow/status/ciphey/ciphey/Python%20application?label=Mac%20OS) | ![GitHub Workflow Status](https://img.shields.io/github/workflow/status/ciphey/ciphey/Python%20application?label=Windows) |\n\n<hr>\n\n# 🤔 Mi is ez?\n\nKódolt szöveg be, dekódolt szöveg ki.\n\n> \"Milyen kódolással működik?\"\n\nA lényeg, hogy nem tudjuk előre a kódolást, csak azt, hogy a bizonyos szöveg titkosítva van. A Ciphey kitalálja nekünk a helyes kódolást.\n\nA legtöbb kódolást Ciphey kevesebb mint 3 másodperc alatt visszafejti.\n\n<p align=\"center\" href=\"https://asciinema.org/a/336257\">\n  <img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/index.gif\" alt=\"Ciphey demo\">\n</p>\n\nA Ciphey projekt lényege, hogy automatizálja a monoton visszafejtési és dekódolási feladatokat, mint például a több rétegú base kódolás, klasszikus rejtjelek, hashek és bonyolultabb titkosítások megoldása.\n\nA Ciphey-t neked találták ki ha nem vagy jártas a kriptográfia világában vagy esetleg gyorsan tesztelni szeretnél egy rejtjelezett szöveget mielőtt komolyabban nekiülnél megfejteni.\n\n**Mélyvíz.** Ciphey egy egyedi mesterséges intelligencia modult használ (_AuSearch_), egy úgynevezett _Cipher Detection Interface_-szel egybekötve, hogy megállapítsa egy adott szöveg hogyan van titkosítva. Ezek után egy egyedileg készített, bővíthető, természetes nyelvfeldolgozó _Language Checker Interface_-en keresztül észleli, hogy mikor kerül értelmezhetőve az adott titkosított szöveg.\n\nRáadásul ez még csak a jéghegy teteje. A teljes technikai tudnivalók itt érhetők el (angolul): [dokumentáció](https://github.com/Ciphey/Ciphey/wiki).\n\n# ✨ Funkciók\n\n- **Több mint 30 támogatott dekódolás**, mint például (bináris, base64) és rendes titkosítás, például Caesar-rejtjel, kulcs-ismétlő XOR és még több. **[A teljes listáért kattint ide](https://github.com/Ciphey/Ciphey/wiki/Supported-Ciphers)**\n- **Egyedi mesterséges intelligencia kibővített kereséssel (AuSearch), ezzel megválaszolva az \"Ez milyen titkosítás?\" kérdést.** Ennek eredménye a 3 másodperc alatti munkaidő.\n- **Egyedi nyelveldolgozó modul** Ciphey el tudja dönteni, hogy mi mikor van titkosítva és mikor nincs. Legyen az sima szöveg, JSON, egy CTF játék megoldása vagy angol szöveg. Ciphey néhány milliszekundom alatt megoldja.\n- **Több nyelv támogatása** Jelenleg csak a német és angol nyelvek támogatottak (AU, UK, CAN, USA változatokat beleértve).\n- **Titkosítás és hash támogatás** Melyeket az alternatív megoldások (például CyberChef Magic) nem támogatnak.\n- **[C++ core](https://github.com/Ciphey/CipheyCore)** Irgalmatlanul gyors.\n\n# 🔭 Ciphey vs CyberChef\n\n## 🔁 Base64 Dekódolás 42 alkommal egymásba ágyazva\n\n<table>\n  <tr>\n  <th>Név</th>\n    <th>⚡ Ciphey ⚡ </th>\n    <th>🐢 CyberChef 🐢</th>\n  </tr>\n  <tr>\n  <th>Gif</th>\n    <td><img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/ciphey_gooder_cyberchef.gif\" alt=\"The guy she tells you not to worry about\"></td>\n    <td><img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/not_dying.gif\" alt=\"You\"></td>\n  </tr>\n  <tr>\n  <th>Idő</th>\n    <td>2 másodperc</td>\n    <td>6 másodperc</td>\n  </tr>\n    <tr>\n  <th>Futtatási feltételek</th>\n    <td><ul><li>Futtasd Ciphey-t a file-on</li></ul></td>\n    <td><ul><li>Állítsd be a regex paramétert \"{\"-re</li><li>Tudnod kell előre, hogy hányszor ismételődjon</li><li>Tudnod kell előre, hogy base64 dekódolás történik végig</li><li>Be kell tölteni a CyberChef-et (egy bonyolult JS app)</li><li>Tudnod kell eleget, hogy ezeket a CyberChefben beállítsd</li><li>Invertálnod kell a keresést</li></ul></td>\n  </tr>\n</table>\n\n<sub><b>Megjegyzés</b> Lehetséges, hogy a gifek nem ugyan akkor töltenek be, ezért az egyik sokkal gyorsabbnak tűnhet.</sub><br>\n<sub><b>Megjegyzés a magic-ről </b>CyberChef's leghasonlóbb funkciója Ciphey-hoz, a magic. A fentebbi teszten Magic azonnal megbukik. Egyedül úgy sikerült rávenni CyberChef-et, hogy végezzen, ha manuálisan állítottunk be mindent.</sub>\n\nTöbb tesztet is végeztünk, egy **6gb-os file** segítségével. Ciphey sikeresen visszafejtette **5 perc és 54 másodperc** alatt, míg CyberChef crashelt mielőtt be tudta volna tölteni a fájlt.\n\n## 📊 Ciphey vs Katana vs CyberChef Magic\n\n| **Name**                                 | ⚡ Ciphey ⚡ | 🗡️ Katana 🗡️ | 🐢 CyberChef Magic 🐢 |\n| ---------------------------------------- | ------------ | ------------ | --------------------- |\n| Fejlett nyelvi elemző                    | ✅           | ❌           | ✅                    |\n| Titkosítás támogatása                    | ✅           | ✅           | ❌                    |\n| Releases named after Dystopian themes 🌃 | ✅           | ❌           | ❌                    |\n| Hash támogatás                           | ✅           | ✅           | ❌                    |\n| Egyszerű használat                       | ✅           | ❌           | ✅                    |\n| Kitalálja mi mivel van titkosítva        | ✅           | ❌           | ❌                    |\n| Hackereknek, hackerektől                 | ✅           | ✅           | ❌                    |\n\n# 🎬 Kezdés\n\nHa problémáid akadnának a Ciphey telepítésével, [olvasd el ezt.](https://github.com/Ciphey/Ciphey/wiki/Common-Issues-&-Their-Solutions)\n\n## ‼️ Fontos Linkek (Doksik, Telepítési Útmutató, Discord Támogatás)\n\n| Telepítési Útmutató                                                          | Dokumentáció                                             | Discord                                     | Docker Képfájl (from REMnux)                                                                       |\n| ---------------------------------------------------------------------------- | -------------------------------------------------------- | ------------------------------------------- | -------------------------------------------------------------------------------------------------- |\n| 📖 [Telepítési Útmutató](https://github.com/Ciphey/Ciphey/wiki/Installation) | 📚 [Dokumentáció](https://github.com/Ciphey/Ciphey/wiki) | 🦜 [Discord](https://discord.ciphey.online) | 🐋 [Docker Dokumentáció](https://docs.remnux.org/run-tools-in-containers/remnux-containers#ciphey) |\n\n## 🏃‍♀️ Ciphey Futtatása\n\nCiphey három fajta módon is futtatható\n\n1. File bemenet `ciphey -f titkosított.txt`\n2. Ismeretlen bemenet `ciphey -- \"Titkosított szöveg\"`\n3. Normális mód `ciphey -t \"Titkosított szöveg\"`\n\n![Gif showing 3 ways to run Ciphey](https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/3ways.gif)\n\nCsendes módban eltűnik a haladásjelző, valószínűség táblázat és minden más zaj.\n\n`ciphey -t \"titkosított szöveg helye\" -q`\n\nA teljes parancslistához futtasd `ciphey --help`.\n\n### ⚗️ Ciphey importálása saját kódba\n\nEgyszerűen importálhatod Ciphey main fűggvényét a saját kódodba. `from Ciphey.__main__ import main`\n\n# 🎪 Közreműködők\n\nA Ciphey-t [Brandon](https://github.com/bee-san) találta fel 2008-ban, és élesztette újjá 2019-ben. Ciphey nem tartana ma ott ahol tart [Cyclic3](https://github.com/Cyclic3) nélkül - UoL Cyber Security Society elnöke.\n\nCiphey-t a [Cyber Security Society](https://www.cybersoc.cf/) élesztette újra és fejleszti, elsősorban CTF játékokban való használatra. Ha Liverpoolban járnál, gondolkodj el egy előadás tartásán vagy a rendezvényeink támogatásán. Küldj emailt a `cybersecurity@society.liverpoolguild.org`-ra, hogy többet megtudj 🤠\n\n**Fő elismerés** jár George H-nak, amiért kitalálta hogyan tudunk megefelelő algoritmusokat használni a keresés felgyorsítására.\n**Különleges köszönet** jár [varghalladesign](https://www.facebook.com/varghalladesign)-nak a logó dizájnért. Nézd meg a többi dizájnt is!\n\n## 🐕‍🦺 [Közremőködés](https://github.com/Ciphey/Ciphey/wiki/Contributing)\n\nNe ijedj meg a hozzájárulástól! Nagyon sok dolgunk van amiben segíthetsz. Minden felcímkézve, hogy egyszerűen megérthető legyen, példákkal. Ha lenne hozzájárulásod, de elakadtál, jelöld be @bee-san vagy @cyclic3 tagokat a GitHub issue felületen ✨\n\nMásképpen, csatlakozz a Discord közösséghez és küldj üzenetet (link a [contrib file-ban](https://github.com/Ciphey/Ciphey/wiki/Contributing)) vagy a README tetején.\n\nKérlek olvasd el a [közreműködési útmutatót](https://github.com/Ciphey/Ciphey/wiki/Contributing) a pontos részlekért ✨\n\nEzzel, a neved bekerül a README fájlba és részese leszel egy folyamatosan növekvő projektnek!\n\n[![Stargazers over time](https://starchart.cc/Ciphey/Ciphey.svg)](https://starchart.cc/Ciphey/Ciphey)\n\n## 💰 Anyagi hozzájárulás\n\nAz anyagi hozzájárulások nem csupán Ciphey jövőjét támogatják, hanem a készítőkét is, és a liverpooli Cyber Secuity Society-t.\n\nGitHub jelenleg nem támogatja a \"támogass és mi majd késöbb szétosztjuk a pénzt módszert\", ezért az alábbi linkek közül válassz, a többit pedig majd mi megoldjuk. 🥰\n\n## ✨ Közreműködők\n\nKöszönet az alábbi csodálatos embereknek ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://github.com/Cyclic3\"><img src=\"https://avatars1.githubusercontent.com/u/15613874?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>cyclic3</b></sub></a><br /><a href=\"#design-cyclic3\" title=\"Design\">🎨</a> <a href=\"#maintenance-cyclic3\" title=\"Maintenance\">🚧</a> <a href=\"https://github.com/Ciphey/Ciphey/commits?author=cyclic3\" title=\"Code\">💻</a> <a href=\"#ideas-cyclic3\" title=\"Ideas, Planning, & Feedback\">🤔</a></td>\n    <td align=\"center\"><a href=\"https://skerritt.blog\"><img src=\"https://avatars3.githubusercontent.com/u/10378052?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Brandon</b></sub></a><br /><a href=\"#design-brandonskerritt\" title=\"Design\">🎨</a> <a href=\"#maintenance-brandonskerritt\" title=\"Maintenance\">🚧</a> <a href=\"https://github.com/Ciphey/Ciphey/commits?author=brandonskerritt\" title=\"Code\">💻</a> <a href=\"#ideas-brandonskerritt\" title=\"Ideas, Planning, & Feedback\">🤔</a></td>\n    <td align=\"center\"><a href=\"https://github.com/michalani\"><img src=\"https://avatars0.githubusercontent.com/u/27767884?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>michalani</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=michalani\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/ashb07\"><img src=\"https://avatars2.githubusercontent.com/u/24845568?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>ashb07</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=ashb07\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/TheAlcanian\"><img src=\"https://avatars3.githubusercontent.com/u/22127191?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Shardion</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/issues?q=author%3ATheAlcanian\" title=\"Bug reports\">🐛</a></td>\n    <td align=\"center\"><a href=\"https://github.com/Bryzizzle\"><img src=\"https://avatars0.githubusercontent.com/u/57810197?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Bryan</b></sub></a><br /><a href=\"#translation-Bryzizzle\" title=\"Translation\">🌍</a> <a href=\"https://github.com/Ciphey/Ciphey/commits?author=Bryzizzle\" title=\"Documentation\">📖</a></td>\n    <td align=\"center\"><a href=\"https://lukasgabriel.net\"><img src=\"https://avatars0.githubusercontent.com/u/52338810?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Lukas Gabriel</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=lukasgabriel\" title=\"Code\">💻</a> <a href=\"https://github.com/Ciphey/Ciphey/issues?q=author%3Alukasgabriel\" title=\"Bug reports\">🐛</a> <a href=\"#translation-lukasgabriel\" title=\"Translation\">🌍</a> <a href=\"#ideas-lukasgabriel\" title=\"Ideas, Planning, & Feedback\">🤔</a></td>\n  </tr>\n  <tr>\n    <td align=\"center\"><a href=\"https://github.com/DarshanBhoi\"><img src=\"https://avatars2.githubusercontent.com/u/70128281?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Darshan</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/issues?q=author%3ADarshanBhoi\" title=\"Bug reports\">🐛</a></td>\n    <td align=\"center\"><a href=\"https://github.com/SkeletalDemise\"><img src=\"https://avatars1.githubusercontent.com/u/29117662?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>SkeletalDemise</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=SkeletalDemise\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://www.patreon.com/cclauss\"><img src=\"https://avatars3.githubusercontent.com/u/3709715?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Christian Clauss</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=cclauss\" title=\"Code\">💻</a> <a href=\"https://github.com/Ciphey/Ciphey/issues?q=author%3Acclauss\" title=\"Bug reports\">🐛</a></td>\n    <td align=\"center\"><a href=\"http://machinexa.xss.ht\"><img src=\"https://avatars1.githubusercontent.com/u/60662297?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Machinexa2</b></sub></a><br /><a href=\"#content-machinexa2\" title=\"Content\">🖋</a></td>\n    <td align=\"center\"><a href=\"https://github.com/anantverma275\"><img src=\"https://avatars1.githubusercontent.com/u/18184503?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Anant Verma</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=anantverma275\" title=\"Code\">💻</a> <a href=\"https://github.com/Ciphey/Ciphey/issues?q=author%3Aanantverma275\" title=\"Bug reports\">🐛</a></td>\n    <td align=\"center\"><a href=\"https://github.com/XVXTOR\"><img src=\"https://avatars1.githubusercontent.com/u/40268197?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>XVXTOR</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=XVXTOR\" title=\"Documentation\">📖</a></td>\n    <td align=\"center\"><a href=\"https://github.com/Itamikame\"><img src=\"https://avatars2.githubusercontent.com/u/59034423?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Itamikame</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=Itamikame\" title=\"Code\">💻</a></td>\n  </tr>\n  <tr>\n    <td align=\"center\"><a href=\"https://github.com/MikeMerz\"><img src=\"https://avatars3.githubusercontent.com/u/50526795?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>MikeMerz</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=MikeMerz\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/jacobggman\"><img src=\"https://avatars2.githubusercontent.com/u/30216976?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Jacob Galam</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=jacobggman\" title=\"Code\">💻</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-enable -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nEz a projekt megfelel az [all-contributors](https://github.com/all-contributors/all-contributors) specifikációnak. Minden nemű hozzájárulást/közreműködést szivesen látunk!\n"
  },
  {
    "path": "translations/id/CODE_OF_CONDUCT.md",
    "content": "<p align=\"center\">\nTerjemahan <br>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/de/CODE_OF_CONDUCT.md>🇩🇪 DE   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/CODE_OF_CONDUCT.md>🇬🇧 EN   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/hu/CODE_OF_CONDUCT.md>🇭🇺 HU   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/id/CODE_OF_CONDUCT.md>🇮🇩 ID   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/it/CODE_OF_CONDUCT.md>🇮🇹 IT   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/nl/CODE_OF_CONDUCT.md>🇳🇱 NL   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/pt-br/CODE_OF_CONDUCT.md>🇧🇷 PT-BR   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/ru/CODE_OF_CONDUCT.md>🇷🇺 RU   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/zh/CODE_OF_CONDUCT.md>🇨🇳 ZH   </a>\n</p>\n\n# Kode Etik Contributor Covenant\n\n## Ikrar Kami\n\nDalam minat kami untuk menumbuhkan lingkungan yang terbuka dan ramah, kami sebagai\nkontributor dan pengelola berjanji untuk membuat partisipasi dalam proyek kami\ndan komunitas kami bebas dari pelecehan bagi semua orang, tanpa memandang usia,\nukuran tubuh, disabilitas, kelompok etnis, identitas gender dan ekspresinya, tingkat pengalaman, pendidikan, status sosial ekonomi, kewarganegaraan, penampilan pribadi, ras, agama, atau identitas dan orientasi seksual.\n\n## Standar Kami\n\nContoh perilaku dalam berkontribusi yang baik untuk menciptakan sebuah lingkungan yang positif meliputi :\n\n* Memakai bahasa yang ramah dan inklusif\n* Menghormati sudut pandang dan pengalaman yang berbeda\n* Menerima kritik konstruktif dengan baik\n* Fokus terhadap apa yang terbaik bagi komunitas\n* Menunjukkan empati kepada anggota komunitas yang lain\n\nContoh perilaku yang tidak dapat diterima oleh partisipan meliputi :\n\n* Penggunaan bahasa atau citra seksual dan perhatian seksual yang tidak diinginkan.\n* Trolling, komentar menghina/merendahkan, dan serangan terhadap individual atau pandangan politik.\n* Pelecahan secara umum atau pribadi\n* Menerbitkan informasi pribadi orang lain, seperti alamat fisik atau elektronik, tanpa izin.\n* Perilaku lain yang secara wajar dapat dianggap tidak sesuai dalam lingkungan profesional\n\n## Tanggung Jawab Kami\n\nPengelola proyek bertanggung jawab untuk mengklarifikasi standar perilaku yang dapat diterima dan diharapkan untuk melakukan tindakan korektif yang tepat dan adil dalam menanggapi setiap kasus perilaku yang tidak dapat diterima.\n\nPengelola proyek mempunyai hak dan tanggung jawab untuk menghapus, mengedit, atau\nmenolak komentar, commit, kode, suntingan wiki, isu, dan kontribusi lainnya\nyang tidak sesuai dengan Kode Etik ini, atau untuk melarang sementara\natau secara permanen, berkontribusi dalam hal perilaku lain yang di anggap tidak pantas, mengancam, menyinggung, atau berbahaya.\n\n## Lingkup\n\nKode Etik ini berlaku baik di dalam proyek maupun di ruang publik\nketika seseorang mewakili proyek atau komunitasnya. Contoh dari\nmewakili sebuah proyek atau komunitas termasuk dalam menggunakan alamat email resmi proyek, posting melalui akun media sosial resmi, atau bertindak sebagai orang yang ditunjuk menjadi perwakilan di acara online atau offline. Representasi proyek mungkin selanjutnya didefinisikan dan diklarifikasi oleh pengelola proyek.\n\n## Penegakan\n\nKejadian perilaku kasar, pelecehan, atau tidak dapat diterima yang terjadi\ndapat dilaporkan kepada tim inti proyek di brandon_skerrit. Semua keluhan\nakan ditinjau, diselidiki dan akan menghasilkan tanggapan yang dianggap perlu\ndan sesuai dengan keadaan. Tim inti proyek berkewajiban menjaga kerahasiaan pelapor yang berkenaan dengan pelaporan suatu insiden. Rincian lebih lanjut tentang kebijakan penegakan khusus akan dipublikasikan secara terpisah.\n\nPengelola proyek yang tidak mengikuti atau melaksanakan Kode Etik dengan itikad\nbaik mungkin akan menghadapi dampak sementara atau permanen seperti yang ditentukan\noleh para anggota lain dari pimpinan proyek.\n\n## Atribut\n\nKode Etik ini diadaptasi dari [Contributor Covenant][homepage], versi 1.4,\ntersedia di [https://www.contributor-covenant.org/version/1/4/code-of-conduct.html][version]\n\n[homepage]: https://www.contributor-covenant.org\n[version]: http://contributor-covenant.org/version/1/4/\n"
  },
  {
    "path": "translations/id/CONTRIBUTING.md",
    "content": "<p align=\"center\">\nTerjemahan <br>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/de/CONTRIBUTING.md>🇩🇪 DE   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/de/CONTRIBUTING.md>🇬🇧 EN   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/hu/CONTRIBUTING.md>🇭🇺 HU   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/id/CONTRIBUTING.md>🇮🇩 ID   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/it/CONTRIBUTING.md>🇮🇹 IT   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/nl/CONTRIBUTING.md>🇳🇱 NL   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/pt-br/CONTRIBUTING.md>🇧🇷 PT-BR   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/ru/CONTRIBUTING.md>🇷🇺 RU   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/zh/CONTRIBUTING.md>🇨🇳 ZH   </a>\n</p>\n\nHowdy!\n\nJadi, Anda tertarik untuk berkontribusi di Ciphey? 🤔\n\nTapi mungkin Anda bingung harus mulai dari mana, atau Anda yakin bahwa keahlian coding Anda tidak \"cukup baik\". Nah, untuk yang terakhir - itu konyol! Kami baik-baik saja dengan \"kode buruk\", dan meskipun demikian, jika Anda membaca dokumen ini, Anda mungkin seorang programmer yang hebat. Maksud saya, pemula jarang sekali belajar berkontribusi pada proyek GitHub 😉\n\nBerikut beberapa cara Anda dapat berkontribusi kepada Ciphey:\n\n- Tambahkan bahasa baru 🧏\n- Tambahkan lebih banyak metode enkripsi 📚\n- Buat lebih banyak dokumentasi (sangat penting‼️ Kami akan berterima kasih selamanya)\n- Perbaiki bug yang dikirimkan melalui GitHub Issues (kami dapat membantu Anda dalam hal ini 😊)\n- Refactor basis kode 🥺\n\nJika ini terdengar sulit, jangan khawatir! Dokumen ini akan memandu Anda bagaimana tepatnya mencapai semua ini. Dan juga... Nama Anda akan ditambahkan ke daftar kontributor Ciphey, dan kami akan sangat berterima kasih! 🙏\n\nKami memiliki Discord server kecil agar Anda dapat berbicara dengan pengembang Ciphey dan mendapatkan bantuan. Atau, anda juga bisa menulis saran-saran anda di GitHub issue kita. Jika Anda ingin ditambahkan ke Discord, DM kami atau tanyakan kepada kami.\n\n[Server Discord](https://discord.gg/KfyRUWw)\n\n# Bagaimana cara berkontribusi?\n\nCiphey selalu membutuhkan lebih banyak alat dekripsi! Untuk mempelajari cara mengintegrasikan kode ke dalam ciphey, bacalah:\n\n- <https://github.com/Ciphey/Ciphey/wiki/Adding-your-own-ciphers> untuk tutorial sederhana\n- <https://github.com/Ciphey/Ciphey/wiki/Extending-Ciphey> untuk referensi API\n\nAkan lebih bagus jika anda bisa menulis beberapa test untuknya. Ini bisa dilakukan hanya dengan menyalin fungsi di Ciphey/tests/test_main.py dan menganti ciphertest dengan sesuatu yang dikodekan dengan cipher anda. Jika anda tidak menambahkan test, ada kemungkinan besar kami akan tetap menggabungkannya, tetapi akan lebih sulit bagi kamu untuk mendiagnosis bug!\n\nTak perlu dikatakan bahwa kami akan menambahkan Anda ke daftar kontributor atas kerja keras Anda!\n\n# Tambahkan bahasa baru 🧏\n\nPemeriksa bahasa yang kita pakai, `brandon`, berfungsi dengan banyak bahasa. Sekarang, ini mungkin terdengar menakutkan.\nTapi sejujurnya, yang harus Anda lakukan adalah mengambil kamus, melakukan sedikit analisis (kami telah menulis kode untuk membantu Anda dalam hal ini), menambahkan kamus dan analisisnya ke repo. Dan kemudian tambahkan opsi ke `settings.yml`.\n\n# Buat lebih banyak dokumentasi\n\nDokumentasi adalah bagian terpenting dari Ciphey. Tidak ada dokumentasi merupakan hutang kode yang ekstrim, dan kami tidak menginginkannya.\n\nDan percayalah ketika saya mengatakan, jika Anda berkontribusi dengan baik kepada dokumentasi, Anda akan berada pada level yang sama dengan kontributor kode. Dokumentasi sangatlah vital.\n\nAda banyak cara anda bisa menambahkan dokumentasi.\n\n- Menambahkan Docstrings di kode\n- Membaikan dokumentasi kamu saat ini (README, file ini, halaman Read The Docs kami)\n- Menerjemahkan dokumentasi\n\ndan lain-lain!\n\n# Perbaiki Bug\n\nKunjungi halaman GitHub Issue kami untuk menemukan semua bug yang dimiliki Ciphey! Dan hancurkan mereka, Anda akan ditambahkan ke daftar kontributor ;)\n\n# Refacor basis kode\n\nTidak semua kode Ciphey mengikuti PEP8, dan beberapa kode diulang-ulang.\n"
  },
  {
    "path": "translations/id/README.md",
    "content": "<p align=\"center\">\n<p align=\"center\">\nTerjemahan <br>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/de/README.md>🇩🇪 DE   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/README.md>🇬🇧 EN   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/fr/README.md>🇫🇷 FR   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/hu/README.md>🇭🇺 HU   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/id/README.md>🇮🇩 ID   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/it/README.md>🇮🇹 IT   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/nl/README.md>🇳🇱 NL   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/pt-br/README.md>🇧🇷 PT-BR   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/ru/README.md>🇷🇺 RU   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/zh/README.md>🇨🇳 ZH   </a>\n <br><br>\n➡️\n<a href=\"https://github.com/Ciphey/Ciphey/wiki\">Dokumentasi</a> |\n<a href=\"https://discord.ciphey.online\">Discord</a> |\n<a href=\"https://github.com/Ciphey/Ciphey/wiki/Installation\">Petunjuk Instalasi</a>\n⬅️\n\n<br>\n  <img src=\"../../Pictures_for_README/binoculars.png\" alt=\"Ciphey\">\n</p>\n\n<p align=\"center\">\n  <img alt=\"GitHub commit activity\" src=\"https://img.shields.io/github/commit-activity/m/ciphey/ciphey\">\n<img src=\"https://pepy.tech/badge/ciphey\">\n <img src=\"https://pepy.tech/badge/ciphey/month\">\n  <a href=\"https://discord.gg/wM3scnc\"><img alt=\"Discord\" src=\"https://img.shields.io/discord/728245678895136898\"></a>\n<a href=\"https://pypi.org/project/ciphey/\"><img src=\"https://img.shields.io/pypi/v/ciphey.svg\"></a>\n  <img src=\"https://img.shields.io/badge/License-MIT-yellow.svg\" alt=\"Ciphey\">\n\n  <img src=\"https://github.com/brandonskerritt/Ciphey/workflows/Python%20application/badge.svg?branch=master\" alt=\"Ciphey\">\n<br>\nAlat dekripsi otomatis yang menggunakan pemrosesan bahasa alami & kecerdasan buatan, bersama dengan beberapa akal sehat.\n</p>\n<hr>\n\n## [Petunjuk Instalasi](https://github.com/Ciphey/Ciphey/wiki/Installation)\n\n| <p align=\"center\"><a href=\"https://pypi.org/project/ciphey\">🐍 Python | <p align=\"center\"><a href=\"https://hub.docker.com/r/remnux/ciphey\">🐋 Docker (Universal) | <p align=\"center\"><a href=\"https://ports.macports.org/port/ciphey/summary\">🍎 MacPorts (macOS) | <p align=\"center\"><a href=\"https://formulae.brew.sh/formula/ciphey\">🍺 Homebrew (macOS/Linux) |\n| --------------------------------------------------------------------- | --------------------------------------------------------------------------------- | --------------------------------------------------------------------------------- |--------------------------------------------------------------------------------- |\n| <p align=\"center\"><img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/python.png\" /></p> | <p align=\"center\"><img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/docker.png\" /></p> | <p align=\"center\"><img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/macports.png\" /></p> | <p align=\"center\"><img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/homebrew.png\" /></p> |\n| `python3 -m pip install ciphey --upgrade` | `docker run -it --rm remnux/ciphey` | `sudo port install ciphey` | `brew install ciphey` |\n\n| Linux                                                                                                                   | Mac OS                                                                                                                     | Windows                                                                                                                   |\n| ----------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- |\n| ![GitHub Workflow Status](https://img.shields.io/github/workflow/status/ciphey/ciphey/Python%20application?label=Linux) | ![GitHub Workflow Status](https://img.shields.io/github/workflow/status/ciphey/ciphey/Python%20application?label=Mac%20OS) | ![GitHub Workflow Status](https://img.shields.io/github/workflow/status/ciphey/ciphey/Python%20application?label=Windows) |\n\n<hr>\n\n# 🤔 Apa itu Ciphey?\n\nCiphey adalah sebuah alat dekripsi otomatis. Masukkan teks terenkripsi, dapatkan kembali teks yang didekripsi\n\n> \"Jenis enkripsi apa?\"\n\nItulah intinya. Anda tidak tahu, Anda hanya tahu itu mungkin dienkripsi. Ciphey akan mencari tahu untuk Anda.\n\nCiphey dapat mendekripsi kebanyakan hal dalam 3 detik atau kurang.\n\n<p align=\"center\" href=\"https://asciinema.org/a/336257\">\n  <img src=\"../../Pictures_for_README/index.gif\" alt=\"Demo Ciphey\">\n</p>\n\n**Detail teknis** Ciphey mengunakan modul kecerdasan buatan (_AuSearch_) dengan sebuah _Antarmuka Deteksi Cipher_ untuk memperkirakan enkripsi teks yang diberikan. Dan kemudian, sebuah _Antarmuka Pemerika Bahasa_ yang dibuat khusus dipakai untuk mendeteksi kapan teks yang diberikan sudah terdekripsi.\n\nDan itu hanya baru puncak dari gunung es. Untuk penjelasan teknis yang lebih lengkap, lihat [dokumentasi](https://github.com/Ciphey/Ciphey/wiki) kita.\n\n# ✨ Fitur-fitur\n\n- **Lebih dari 20 jenis enkripsi didukung** seperti penyandian (binary, base64) dan enkripsi normal seperti cipher Caesar, Transposisi dan banyak lagi. **[Untuk daftar lengkap, klik disini](https://github.com/Ciphey/Ciphey/wiki/Supported-Ciphers)**\n- **Ciphey mengunakan modul kecerdasan buatan dengan Pencarian Bertambah (_AuSearch_) untuk menjawab pertanyaan \"enkripsi apa yang digunakan?\"** Ini memunkinkan dekripsi untuk membutuhkan waktu kurang dari 3 detik.\n- **Modul pemrosesan bahasa alami yang dibangun khusus** Ciphey dapat mendeteksi ketika sesuatu adalah teks biasa dengan akurasi yang sangat tinggi dan dengan cepat.\n- **Dukungan Multi Bahasa** saat ini, hanya Bahasa Jerman & Inggris (dengan varian AU, UK, CAN, USA) yang tersedia.\n- **Mendukung enkripsi** yang alternatif seperti CyberChef Magic tidak memiliki.\n- **[Memakai inti C++](https://github.com/Ciphey/CipheyCore)** Sangat Cepat.\n\n# 🔭 Ciphey vs CyberChef\n\n## 🔁 Dikodekan Base64 42 kali\n\n<table>\n  <tr>\n  <th>Name</th>\n    <th>⚡ Ciphey ⚡ </th>\n    <th>🐢 CyberChef 🐢</th>\n  </tr>\n  <tr>\n  <th>Gif</th>\n    <td><img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/ciphey_gooder_cyberchef.gif\" alt=\"The guy she tells you not to worry about\"></td>\n    <td><img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/not_dying.gif\" alt=\"You\"></td>\n  </tr>\n  <tr>\n  <th>Durasi</th>\n    <td>2 detik</td>\n    <td>6 detik</td>\n  </tr>\n    <tr>\n  <th>Pemakaian</th>\n    <td><ul><li>Jalankan ciphey pada file</li></ul></td>\n    <td><ul><li>Setel parameter regex menjadi \"{\"</li><li>Anda perlu tahu berapa kali untuk mengulang</li><li>Anda harus tahu teksnya dikodekan dengan Base64 sepenuhnya</li><li>Anda perluh memuat CyberChef (sebuah aplikasi JS yang besar)</li><li>Cukup tahu tentang CyberChef untuk menggunakannya dalam hal ini</li></ul></td>\n  </tr>\n</table>\n\n<sub><b>Catatan</b> Gif diatas dapat memuat pada waktu yang berbeda sehingga satu terlihat jauh lebih cepat daripada yang lain.</sub><br>\n<sub><b>Sebuah catatan tentang magic,</b> fitur CyberChef's yang paling mirip Ciphey. Magic gagal secara instan pada input ini dan cara satu-satunya untuk memaska CyberChef bersaing adalah untuk mendefinisikannya secara manual.</sub>\n\nKami juga menguji CyberChef dan Ciphey dengan file sebesar **6gb**. Ciphey memecahkannya dalam **5 menit dan 54 detik** dan CyberChef gagal bahkan sebelum memulai.\n\n## 📊 Ciphey vs Katana vs CyberChef Magic\n\n| **Name**                                   | ⚡ Ciphey ⚡ | 🤡 Katana 🤡 | 🐢 CyberChef Magic 🐢 |\n| ------------------------------------------ | ------------ | ------------ | --------------------- |\n| Pemerika Bahasa yang Mahir                 | ✅           | ❌           | ✅                    |\n| Mendukung Enkripsi                         | ✅           | ✅           | ❌                    |\n| Rilis diberi nama sesuai tema Dystopian 🌃 | ✅           | ❌           | ❌                    |\n| Mendukung Fungsi Hash                      | ✅           | ✅           | ❌                    |\n| Mudah dipakai                              | ✅           | ❌           | ✅                    |\n| Dapat menebak enkripsi yang dipakai        | ✅           | ❌           | ❌                    |\n| Dibuat untuk peretas oleh peretas          | ✅           | ✅           | ❌                    |\n\n# 🎬 Getting Started\n\nIf you're having trouble with installing Ciphey, [read this.](https://github.com/Ciphey/Ciphey/wiki/Common-Issues-&-Their-Solutions)\n\n## ‼️ Important Links (Docs, Installation guide, Discord Support)\n\n| Petunjuk Instalasi                                                          | Dokumentasi                                             | Discord                                     |\n| --------------------------------------------------------------------------- | ------------------------------------------------------- | ------------------------------------------- |\n| 📖 [Petunjuk Instalasi](https://github.com/Ciphey/Ciphey/wiki/Installation) | 📚 [Dokumentasi](https://github.com/Ciphey/Ciphey/wiki) | 🦜 [Discord](https://discord.ciphey.online) |\n\n## 🏃‍♀️Menggunakan Ciphey\n\nAda 3 cara untuk memakai Ciphey.\n\n1. Input File `ciphey - encrypted.txt`\n2. Input Unqualified `ciphey -- \"Teks terenkripsi di sini\"`\n3. Cara Biasa `ciphey -t \"Teks terenkripsi di sini\"`\n\n![Gif menunjukkan 3 cara untuk memakai Ciphey](../../Pictures_for_README/3ways.gif)\n\nUntuk menyingkirkan progress bar, tabel probabilitas, dan lain-lain gunakan mode senyap.\n\n`ciphey -t \"teks terenkripsi di sini\" -q`\n\nUntuk daftar argumen lengkap, jalankan `ciphey --help`.\n\n### ⚗️ Mengimpor Ciphey\n\nAnda dapat mengimpor file utama Ciphey dan menggunakannya dalam program dan kode Anda sendiri. `from Ciphey.__main__ import main`\n\n# 🎪 Kontributor\n\nCiphey dibuat oleh [Brandon Skerritt](https://github.com/brandonskerritt) pada 2008, and dihidupkan kembali pada 2019. Ciphey tidak akan berada di ia berada tanpa [Cyclic3](https://github.com/Cyclic3) - presiden Cyber Security Society UoL.\n\nCiphey dihidupkan & diciptakan kembali oleh [Cyber Security Society](https://www.cybersoc.cf/) untuk digunakan dalam CTFs. Jika Anda pernah berada di Liverpool, pertimbangkan untuk memberi ceramah atau mensponsori acara kami. Kirimkan email kepada kami di `cybersecurity@society.liverpoolguild.org` untuk mengetahui lebih lanjut 🤠\n\n**Kredit Besar** kepada George H untuk mengetahui bagaimana kami dapat menggunakan algoritma yang tepat untuk mempercepat proses pencarian. \\\n**Terima kasih khusus** untuk [varghalladesign](https://www.facebook.com/varghalladesign) untuk mendesain logo. Lihat karya desain mereka yang lain!\n\n## 🐕‍🦺 [Berkontribusi](CONTRIBUTING.md)\n\nJangan takut untuk berkontribusi! Kami memiliki banyak, banyak hal yang dapat Anda lakukan untuk membantu. Masing-masing diberi label dan mudah dijelaskan dengan contoh-contoh. Jika Anda mencoba berkontribusi tetapi macet, tag @brandonskerritt di sebuah GitHub issue ✨\n\nAtau, bergabung dengan grup Discord kita dan kirim pesan di sana (link di [file contribusi](CONTRIBUTING.md)) atau di bagian atas README ini sebagai lencana.\n\nSilakan baca [file kontribusi](CONTRIBUTING.md) untuk detail yang tepat tentang cara berkontribusi ✨\n\n## 💰 Kontributor Keuangan\n\nSemua kontribusi akan digunakan untuk mendanai tidak hanya masa depan Ciphey dan penulisnya, tetapi juga Cyber Security Society di Universitas Liverpool.\n\nGitHub tidak mendukung \"mensponsori proyek ini dan kami akan mendistribusikan uang secara merata\", jadi salah satu link dan kami akan mengatasinya di pihak kami 🥰\n\n## ✨ Kontributor\n\nTerima kasih kepada orang-orang hebat ini ([kunci emoji](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://skerritt.blog\"><img src=\"https://avatars3.githubusercontent.com/u/10378052?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Brandon</b></sub></a><br /><a href=\"#design-brandonskerritt\" title=\"Design\">🎨</a> <a href=\"#maintenance-brandonskerritt\" title=\"Maintenance\">🚧</a> <a href=\"https://github.com/Ciphey/Ciphey/commits?author=brandonskerritt\" title=\"Code\">💻</a> <a href=\"#ideas-brandonskerritt\" title=\"Ideas, Planning, & Feedback\">🤔</a></td>\n    <td align=\"center\"><a href=\"https://github.com/Cyclic3\"><img src=\"https://avatars1.githubusercontent.com/u/15613874?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>cyclic3</b></sub></a><br /><a href=\"#design-cyclic3\" title=\"Design\">🎨</a> <a href=\"#maintenance-cyclic3\" title=\"Maintenance\">🚧</a> <a href=\"https://github.com/Ciphey/Ciphey/commits?author=cyclic3\" title=\"Code\">💻</a> <a href=\"#ideas-cyclic3\" title=\"Ideas, Planning, & Feedback\">🤔</a></td>\n    <td align=\"center\"><a href=\"https://github.com/michalani\"><img src=\"https://avatars0.githubusercontent.com/u/27767884?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>michalani</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=michalani\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/ashb07\"><img src=\"https://avatars2.githubusercontent.com/u/24845568?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>ashb07</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=ashb07\" title=\"Code\">💻</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-enable -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nProyek ini mengikuti spesifikasi [all-contributors](https://github.com/all-contributors/all-contributors). Kontribusi dalam bentuk apa pun dianjurkan!\n"
  },
  {
    "path": "translations/it/CODE_OF_CONDUCT.md",
    "content": "<p align=\"center\">\nTraduzioni <br>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/de/CODE_OF_CONDUCT.md>🇩🇪 DE   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/CODE_OF_CONDUCT.md>🇬🇧 EN   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/hu/CODE_OF_CONDUCT.md>🇭🇺 HU   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/id/CODE_OF_CONDUCT.md>🇮🇩 ID   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/it/CODE_OF_CONDUCT.md>🇮🇹 IT   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/nl/CODE_OF_CONDUCT.md>🇳🇱 NL   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/pt-br/CODE_OF_CONDUCT.md>🇧🇷 PT-BR   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/ru/CODE_OF_CONDUCT.md>🇷🇺 RU   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/zh/CODE_OF_CONDUCT.md>🇨🇳 ZH   </a>\n</p>\n\n# Codice di condotta\n\n## Il nostro impegno\n\nNell'interesse di promuovere un ambiente aperto e accogliente, noi, in qualità di collaboratori e manutentori, ci impegniamo a rendere la partecipazione al nostro progetto e alla nostra comunità un'esperienza senza molestie per tutti, indipendentemente dall'età, dalle dimensioni del corpo, dalla disabilità, dall'etnia, dalle caratteristiche del sesso, dall'identità e dall'espressione di genere, dal livello di esperienza, dall'istruzione, dallo status socio-economico, dalla nazionalità, dall'aspetto personale, dalla razza, dalla religione o dall'identità e dall'orientamento sessuale.\n\n## I nostri standard\n\nEsempi di comportamenti che contribuiscono a creare un ambiente positivo includono:\n\n- Uso di un linguaggio accogliente e inclusivo\n- Essere rispettosi dei diversi punti di vista e delle diverse esperienze\n- Accettare con tolleranza le critiche costruttive\n- Concentrandosi su ciò che è meglio per la comunità\n- Mostrare empatia verso gli altri membri della comunità\n\nTra gli esempi di comportamento da parte dei partecipanti ritenuti inaccettabili vi sono i seguenti:\n\n- L'uso di un linguaggio sessualizzato o di immagini sessualizzate e di attenzioni sessuali indesiderate o progressi\n- Trolling, commenti offensivi/derogatori e attacchi personali o politici\n- Molestie pubbliche o private\n- Pubblicazione di informazioni private altrui, come ad esempio informazioni fisiche o elettroniche\n  indirizzo, senza autorizzazione esplicita\n- Altri comportamenti che potrebbero ragionevolmente essere considerati inappropriati in un\n  ambiente professionale\n\n## Le nostre responsabilità\n\nI responsabili del progetto hanno la responsabilità di chiarire gli standard di accettabilità del comportamento e ci si aspetta che intraprendano azioni correttive appropriate ed eque in risposta a qualsiasi caso di comportamento considerato inaccettabile.\n\nI responsabili del progetto hanno il diritto e la responsabilità di rimuovere, modificare o\nrifiutare commenti, impegni, codice, modifiche alla wiki, problemi e altri contributi che non sono allineati al presente Codice di Condotta, o di bloccare temporaneamente o permanentemente a qualsiasi contribuente di partecipare per altri comportamenti ritenuti inappropriati, minacciosi, offensivi o dannosi.\n\n## Portata\n\nIl presente Codice di Condotta si applica sia all'interno degli spazi di progetto che negli spazi pubblici\nquando un individuo rappresenta il progetto o la sua comunità. Esempi di rappresentare un progetto o una comunità includono l'utilizzo di una e-mail ufficiale del progetto indirizzo, invio tramite un account ufficiale sui social media o in qualità di incaricato rappresentante ad un evento online o offline. La rappresentanza di un progetto può essere ulteriormente definita e chiarita dai responsabili del progetto.\n\n## Applicazione\n\nI casi di comportamento abusivo, molesto o comunque inaccettabile possono essere segnalati contattando il team del progetto brandon_skerrit. Tutti\nI reclami saranno esaminati e analizzati e daranno luogo a una risposta che ritenuta necessaria e adeguatoa alle circostanze. Il team del progetto è obbligato a mantenere la riservatezza nei confronti del segnalante di un incidente.\nUlteriori dettagli sulle politiche di applicazione specifiche possono essere pubblicati separatamente.\n\nI responsabili del progetto che non seguono o non fanno seguire il qui presente Codice di condotta in buona fede puossono subire ripercussioni temporanee o permanenti, come determinato da altri membri incaricati della gestione del progetto.\n\n## Attribuzione\n\nIl presente Codice di Condotta è adattato dal [Contributor Covenant][homepage], versione 1.4,\ndisponibile all'indirizzo <https://www.contributor-covenant.org/version/1/4/code-of-conduct.html>\n\n[homepage]: https://www.contributor-covenant.org\n\nPer le risposte alle domande più comuni su questo codice di condotta, vedere\n<https://www.contributor-covenant.org/faq>\n"
  },
  {
    "path": "translations/it/CONTRIBUTING.md",
    "content": "<p align=\"center\">\nTraduzioni <br>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/de/CONTRIBUTING.md>🇩🇪 DE   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/de/CONTRIBUTING.md>🇬🇧 EN   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/hu/CONTRIBUTING.md>🇭🇺 HU   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/id/CONTRIBUTING.md>🇮🇩 ID   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/it/CONTRIBUTING.md>🇮🇹 IT   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/nl/CONTRIBUTING.md>🇳🇱 NL   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/pt-br/CONTRIBUTING.md>🇧🇷 PT-BR   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/ru/CONTRIBUTING.md>🇷🇺 RU   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/zh/CONTRIBUTING.md>🇨🇳 ZH   </a>\n</p>\n\nSalve!\n\nAllora, sei interessato a contribuire a Ciphey? 🤔\n\nForse sei confuso su dove cominciare, o credi che le tue capacità di codifica non siano \"abbastanza buone\"? Beh, per quest'ultimo - è ridicolo! Siamo perfettamente a nostro agio con il \"cattivo codice\" e anche così, se stai leggendo questo documento, probabilmente sei un grande programmatore. Voglio dire, i neofiti non imparano spesso a contribuire ai progetti di GitHub 😉\n\nAlcuni consigli su come contribuire a Ciphey:\n\n- Aggiungendo una nuova lingua 🧏\n- Aggiungiendo altri metodi di crittografia 📚\n- Creando più documentazione (di grande importanza! Te ne saremmo eternamente grati)\n- Correggendo i bug inviati tramite i problemi di GitHub (possiamo supportarti in questo 😊)\n- Rifattorizzando il codice base 🥺\n\nSe, a primo impatto, ciò ti sembra molto difficile, non ti preoccupare! Questo documento ti spiegherà esattamente come raggiungere uno di questi obiettivi. Inoltre, il tuo nome sarà aggiunto alla lista dei collaboratori di Ciphey, e te ne saremo eternamente grati! 🙏\n\nAbbiamo un piccolo server Discord per parlare con gli sviluppatori e chiedere aiuto. In alternativa, puoi scrivere un issue di GitHub per il tuo suggerimento. Se vuoi essere aggiunto a Discord, inviaci un DM (messaggio privato diretto) o chiedi a noi in qualche altro modo.\n\n[Server Discord](https://discord.gg/KfyRUWw)\n\n# Come contribuire\n\nCiphey ha sempre bisogno di più strumenti di decrittazione! Per imparare a integrare il codice nella cifratura, guarda:\n\n- https://github.com/Ciphey/Ciphey/wiki/Adding-your-own-ciphers per un semplice tutorial\n- https://github.com/Ciphey/Ciphey/wiki/Extending-Ciphey per un riferimento API\n\nSarebbe bello se tu scrivessi dei test per questo, semplicemente copiando una funzione nel Ciphey/tests/test_main.py e sostituendo il testo cifrato con qualcosa codificato con il tuo cifrario. Se non aggiungi dei test, probabilmente uniremo comunque i tuoi cambiamenti, ma peer noi sarà molto più difficile diagnosticare i bug!\n\nOvviamente ti aggiungeremo alla lista dei collaboratori per il tuo duro lavoro!\n\n# Aggiungere una nuova lingua 🧏\n\n\"brandon\" corregge le traduzioni e funziona con più lingue. Ora, questo può sembrare scoraggiante.\nTutto quello che devi fare è prendere un dizionario, fare una piccola analisi (abbiamo scritto del codice per aiutarti in questo), aggiungere i dizionari e l'analisi ad un repo. E poi aggiungere l'opzione a `settings.yml`.\n\n# Creare più documentazione\n\nLa documentazione è la parte più importante di Ciphey. Non avere una documentazione è una grande mancanza, e noi non vogliamo far mancare una documentazione.\n\nFidati di me quando dico che se contribuisci ad una grande documentazione sarai visto allo stesso livello di chi contribuisce al codice. La documentazione è assolutamente vitale.\n\nCi sono molti modi per aggiungere documentazione.\n\n- Stringhe di documenti nel codice\n- Migliorare la nostra attuale documentazione (il README, questo file e le pagine della wiki di Ciphey)\n- Traduzione della documentazione\n\nE molto di più!\n\n# Risolvi i bug\n\nVisita la pagina degli issue di GitHub per trovare tutti i bug che Ciphey ha! Schiacciali e sarai aggiunto alla lista dei collaboratori\n\n# Rifattorizza il codice base\n\nNon tutti i Ciphey seguono il PEP8, e una parte del codice si ripete.\n"
  },
  {
    "path": "translations/it/README.md",
    "content": "<p align=\"center\">\nTraduzioni <br>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/de/README.md>🇩🇪 DE   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/README.md>🇬🇧 EN   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/fr/README.md>🇫🇷 FR   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/hu/README.md>🇭🇺 HU   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/id/README.md>🇮🇩 ID   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/it/README.md>🇮🇹 IT   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/nl/README.md>🇳🇱 NL   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/pt-br/README.md>🇧🇷 PT-BR   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/ru/README.md>🇷🇺 RU   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/zh/README.md>🇨🇳 ZH   </a>\n <br><br>\n➡️\n<a href=\"https://github.com/Ciphey/Ciphey/wiki\">Documentazione</a> |\n<a href=\"https://discord.ciphey.online\">Discord</a> |\n <a href=\"https://github.com/Ciphey/Ciphey/wiki/Installation\">Guida all'installazione</a>\n ⬅️\n\n<br>\n  <img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/binoculars.png\" alt=\"Ciphey\">\n</p>\n\n<p align=\"center\">\n  <img alt=\"GitHub commit activity\" src=\"https://img.shields.io/github/commit-activity/m/ciphey/ciphey\">\n<img src=\"https://pepy.tech/badge/ciphey\">\n <img src=\"https://pepy.tech/badge/ciphey/month\">\n  <a href=\"https://discord.gg/wM3scnc\"><img alt=\"Discord\" src=\"https://img.shields.io/discord/728245678895136898\"></a>\n<a href=\"https://pypi.org/project/ciphey/\"><img src=\"https://img.shields.io/pypi/v/ciphey.svg\"></a>\n  <img src=\"https://img.shields.io/badge/License-MIT-yellow.svg\" alt=\"Ciphey\">\n\n  <img src=\"https://github.com/brandonskerritt/Ciphey/workflows/Python%20application/badge.svg?branch=master\" alt=\"Ciphey\">\n<br>\nCiphey è uno strumento completamente automatizzato per la decrittazione/decodificazione/cracking che usa la processazione del linguaggio naturale e l'intelligienza  artificiale, con un po' di senso comune.\n</p>\n<hr>\n\n## [Installation Guide](https://github.com/Ciphey/Ciphey/wiki/Installation)\n\n| <p align=\"center\"><a href=\"https://pypi.org/project/ciphey\">🐍 Python | <p align=\"center\"><a href=\"https://hub.docker.com/r/remnux/ciphey\">🐋 Docker (Universal) | <p align=\"center\"><a href=\"https://ports.macports.org/port/ciphey/summary\">🍎 MacPorts (macOS)| <p align=\"center\"><a href=\"https://formulae.brew.sh/formula/ciphey\">🍺 Homebrew (macOS/Linux) |\n| --------------------------------------------------------------------- | --------------------------------------------------------------------------------- | --------------------------------------------------------------------------------- |--------------------------------------------------------------------------------- |\n| <p align=\"center\"><img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/python.png\" /></p> | <p align=\"center\"><img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/docker.png\" /></p> | <p align=\"center\"><img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/macports.png\" /></p> | <p align=\"center\"><img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/homebrew.png\" /></p> |\n| `python3 -m pip install ciphey --upgrade` | `docker run -it --rm remnux/ciphey` | `sudo port install ciphey` | `brew install ciphey` |\n\n| Linux                                                                                                                   | Mac OS                                                                                                                     | Windows                                                                                                                   |\n| ----------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- |\n| ![GitHub Workflow Status](https://img.shields.io/github/workflow/status/ciphey/ciphey/Python%20application?label=Linux) | ![GitHub Workflow Status](https://img.shields.io/github/workflow/status/ciphey/ciphey/Python%20application?label=Mac%20OS) | ![GitHub Workflow Status](https://img.shields.io/github/workflow/status/ciphey/ciphey/Python%20application?label=Windows) |\n\n<hr>\n\n# 🤔 Cos'è?\n\nInserisci del testo crittografato, ottieni il testo decrittografato indietro.\n\n> \"Che tipo di crittografia?\"\n\nQuesto è il punto. Non lo sai, sai solo che forse è criptato. Ciphey lo scoprirà per te.\n\nCiphey può risolvere la maggior parte delle cose in 3 secondi o meno.\n\n<p align=\"center\" href=\"https://asciinema.org/a/336257\">\n  <img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/index.gif\" alt=\"Ciphey demo\">\n</p>\n\nCiphey mira ad essere uno strumento per automatizzare molte decodifiche come le codifiche multiple di base, i classici ciphers, gli hash o la crittografia più avanzata.\n\nSe non ne sai molto di crittografia, o vuoi controllare rapidamente il testo cifrato prima di lavorarci da solo, Ciphey fa per te.\n\n**La parte tecnica.** Ciphey usa un modulo di intelligenza artificiale costruito su misura (_AuSearch_) con un'interfaccia di rilevamento dei _Ciphers_ per approssimare ciò con cui qualcosa è criptato. Successivamente usa un'elaborazione del linguaggio naturale personalizzato e personalizzabile _Language Checker Interface_, in grado di rilevare quando il testo dato diventa in chiaro.\n\nNessuna rete neurale o IA ripiene di funzioni inutili qua. Usiamo solo ciò che e veloce e minimal.\n\nE questa è solo la punta dell'iceberg. Per l'intera spiegazione tecnica cntrolla la nostra [documentazione](https://github.com/Ciphey/Ciphey/wiki).\n\n# ✨ Features\n\n- **50+ tipi di crittografia supportati** come gli encodings (binary, base64) e tipi di crittografia normale come il cifrario di cesare, key XOR ripetuta e molto altro. **[Per la lista completa, clicca qui](https://github.com/Ciphey/Ciphey/wiki/Supported-Ciphers)**\n- **Intelligenza artificiale costruita su misura con la ricerca aumentata (AuSearch) per rispondere alla domanda \"quale algoritmo per la crittografia è stato usato?\"** Il risultato è che le decifrazioni richiedono meno di 3 secondi.\n- **Modulo di elaborazione del linguaggio naturale costruito su misura** Ciphey può determinare se qualcosa è in chiaro o meno. Se quel testo in chiaro è JSON, una flag di una CTF, o l'inglese, Ciphey può ottenerlo in un paio di millisecondi.\n- **Supporto multilingue** al momento, solo tedesco e inglese (con varianti AU, UK, CAN, USA).\n- **Supporta le crittografie e gli hash** che le alternative come CyberChef Magic non hanno.\n- **[core in C++](https://github.com/Ciphey/CipheyCore)** Rapidissimo.\n\n# 🔭 Ciphey vs CyberChef\n\n## 🔁 Base64 codificato 42 volte\n\n<table>\n  <tr>\n  <th>Nome</th>\n    <th>⚡ Ciphey ⚡ </th>\n    <th>🐢 CyberChef 🐢</th>\n  </tr>\n  <tr>\n  <th>Gif</th>\n    <td><img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/ciphey_gooder_cyberchef.gif\" alt=\"The guy she tells you not to worry about\"></td>\n    <td><img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/not_dying.gif\" alt=\"You\"></td>\n  </tr>\n  <tr>\n  <th>Tempo</th>\n    <td>2 secondi</td>\n    <td>6 secondi</td>\n  </tr>\n    <tr>\n  <th>Setup</th>\n    <td><ul><li>Esegui ciphey sul file</li></ul></td>\n    <td><ul><li>Impostare il parametro regex su \"{\"</li><li>Hai bisogno di conoscere quante volte devi decodificare il file</li><li>Devi sapere che è sempre Base64</li><li>Devi caricare CyberChef (è un'applicazione JS piena di roba)</li><li>Devi conoscere abbastanza su CyberChef per creare questa pipeline</li><li>Invert the match</li></ul></td>\n  </tr>\n</table>\n\n<sub><b>Nota: </b>Le gif possono caricarsi in tempi diversi, quindi una può apparire significativamente più veloce di un'altra.</sub><br>\n<sub><b>Una nota su CyberChef Magic: </b>La funzione di CyberChef che si avvicina di più a Ciphey è Magic. Magic fallisce istantaneamente con questo input e crasha. L'unico modo per forzare CyberChef a competere è definirlo manualmente</sub>\n\nAbbiamo anche testato un file da **6 gb**: Ciphey è riuscito a craccarlo in **5 minuti e 54 secondi**, CyberChef è crashato ancor prima di partire.\n\n## 📊 Ciphey vs Katana vs CyberChef Magic\n\n| **Nome**                                         | ⚡ Ciphey ⚡ | 🗡️ Katana 🗡️ | 🐢 CyberChef Magic 🐢 |\n| ------------------------------------------------ | ------------ | ------------ | --------------------- |\n| Controllo avanzato del linguaggio                | ✅           | ❌           | ✅                    |\n| Supporta la crittografia                         | ✅           | ✅           | ❌                    |\n| Releases named after Dystopian themes 🌃         | ✅           | ❌           | ❌                    |\n| Supporta gli hashes                              | ✅           | ✅           | ❌                    |\n| Facile da impostare                              | ✅           | ❌           | ✅                    |\n| Può indovinare con cosa è crittografato quelcosa | ✅           | ❌           | ❌                    |\n| Creato dagli hackers per gli hackers             | ✅           | ✅           | ❌                    |\n\n# 🎬 Per iniziare\n\nSe hai problemi a installare Ciphey, [leggi questo.](https://github.com/Ciphey/Ciphey/wiki/Common-Issues-&-Their-Solutions)\n\n## ‼️ Link importanti (Documentazione, Guida all'installazione, supporto via Discord)\n\n| Guida all'installazione                                                          | Documentazione                                             | Discord                                     | Immagine Docker (di REMnux)                                                                          |\n| -------------------------------------------------------------------------------- | ---------------------------------------------------------- | ------------------------------------------- | ---------------------------------------------------------------------------------------------------- |\n| 📖 [Guida all'installazione](https://github.com/Ciphey/Ciphey/wiki/Installation) | 📚 [Documentazione](https://github.com/Ciphey/Ciphey/wiki) | 🦜 [Discord](https://discord.ciphey.online) | 🐋 [Documentazione Docker](https://docs.remnux.org/run-tools-in-containers/remnux-containers#ciphey) |\n\n## 🏃‍♀️Usare Ciphey\n\nCi sono 3 modi per usare Ciphey:\n\n1. File di input `ciphey -f encrypted.txt`\n2. Unqualified input `ciphey -- \"Encrypted input\"`\n3. Modo normale `ciphey -t \"Encrypted input\"`\n\n![Gif che mostra i 3 modi per usare Ciphey](Pictures_for_README/3ways.gif)\n\nPer eliminare le barre di avanzamento, la tabella delle probabilità e tutto il resto, usa la modalità quiet.\n\n`ciphey -t \"encrypted text here\" -q`\n\nPer una lista completa di argomenti, `ciphey --help`.\n\n### ⚗️ Importare Ciphey\n\nPuoi importare il main di Ciphey e usarlo nei tuoi programmi e nel tuo codice. `from Ciphey.__main__ import main`\n\n# 🎪 Contributors\n\nCiphey è stato inventato da [Brandon](https://github.com/bee-san) nel 2008, e ripreso nel 2019. Ciphey non sarebbe quello che è oggi senza [Cyclic3](https://github.com/Cyclic3) - presidente della società di Cyber Security UoL.\n\nCiphey è stato ripreso & ricreato dalla [Cyber Security Society](https://www.cybersoc.cf/) per l'uso nei CTFs. Se sarai mai a Liverpool, prendi in considerazione la possibilità di tenere un discorso o di sponsorizzare i nostri eventi. Inviaci un'e-mail a `cybersecurity@society.liverpoolguild.org` per saperne di più 🤠\n\n**Un grande ringraziamento** a George H per aver capito come possiamo usare gli algoritmi corretti per velocizzare il processo di ricerca.\n**Un ringraziamento speciale** a [varghalladesign](https://www.facebook.com/varghalladesign) per aver progettato il logo. Guarda gli altri loro lavori sul design!\n\n## 🐕‍🦺 [Come Contribuire](https://github.com/Ciphey/Ciphey/wiki/Contributing)\n\nNon avere paura di contribuire! Abbiamo molte, molte cose che puoi fare per aiutare. Ognuna di esse è etichettata e facilmente spiegabile con esempi. Se stai cercando di contribuire ma sei bloccato, tagga @bee-san o @cyclic3 in un issue di GitHub ✨\n\nIn alternativa, unisciti al gruppo della Discordia e invia un messaggio lì (link nella [wiki](https://github.com/Ciphey/Ciphey/wiki/Contributing)) o in cima a questo README come distintivo.\n\nPer favore leggi [la wiki](https://github.com/Ciphey/Ciphey/wiki/Contributing) per i dettagli esatti su come contribuire ✨\n\nCosì facendo, il tuo nome verrà aggiunto al README qui sotto e sarai parte di un progetto in continua crescita!\n[![Stargazers nel tempo](https://starchart.cc/Ciphey/Ciphey.svg)](https://starchart.cc/Ciphey/Ciphey)\n\n## 💰 Collaboratori finanziari\n\nI contributi saranno utilizzati per finanziare non solo il futuro di Ciphey e dei suoi autori, ma anche la Cyber Security Society dell'Università di Liverpool.\n\nGitHub non supporta \"sponsorizza questo progetto e noi distribuiremo il denaro in modo equo\", quindi scegli un link e ci penseremo noi 🥰\n\n## ✨ Contributors\n\nI ringraziamenti vanno a tutte queste fantastiche persone ([legenda emoji](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://github.com/Cyclic3\"><img src=\"https://avatars1.githubusercontent.com/u/15613874?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>cyclic3</b></sub></a><br /><a href=\"#design-cyclic3\" title=\"Design\">🎨</a> <a href=\"#maintenance-cyclic3\" title=\"Maintenance\">🚧</a> <a href=\"https://github.com/Ciphey/Ciphey/commits?author=cyclic3\" title=\"Code\">💻</a> <a href=\"#ideas-cyclic3\" title=\"Ideas, Planning, & Feedback\">🤔</a></td>\n    <td align=\"center\"><a href=\"https://skerritt.blog\"><img src=\"https://avatars3.githubusercontent.com/u/10378052?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Brandon</b></sub></a><br /><a href=\"#design-brandonskerritt\" title=\"Design\">🎨</a> <a href=\"#maintenance-brandonskerritt\" title=\"Maintenance\">🚧</a> <a href=\"https://github.com/Ciphey/Ciphey/commits?author=brandonskerritt\" title=\"Code\">💻</a> <a href=\"#ideas-brandonskerritt\" title=\"Ideas, Planning, & Feedback\">🤔</a></td>\n    <td align=\"center\"><a href=\"https://github.com/michalani\"><img src=\"https://avatars0.githubusercontent.com/u/27767884?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>michalani</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=michalani\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/ashb07\"><img src=\"https://avatars2.githubusercontent.com/u/24845568?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>ashb07</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=ashb07\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/TheAlcanian\"><img src=\"https://avatars3.githubusercontent.com/u/22127191?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Shardion</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/issues?q=author%3ATheAlcanian\" title=\"Bug reports\">🐛</a></td>\n    <td align=\"center\"><a href=\"https://github.com/Bryzizzle\"><img src=\"https://avatars0.githubusercontent.com/u/57810197?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Bryan</b></sub></a><br /><a href=\"#translation-Bryzizzle\" title=\"Translation\">🌍</a> <a href=\"https://github.com/Ciphey/Ciphey/commits?author=Bryzizzle\" title=\"Documentation\">📖</a></td>\n    <td align=\"center\"><a href=\"https://lukasgabriel.net\"><img src=\"https://avatars0.githubusercontent.com/u/52338810?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Lukas Gabriel</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=lukasgabriel\" title=\"Code\">💻</a> <a href=\"https://github.com/Ciphey/Ciphey/issues?q=author%3Alukasgabriel\" title=\"Bug reports\">🐛</a> <a href=\"#translation-lukasgabriel\" title=\"Translation\">🌍</a> <a href=\"#ideas-lukasgabriel\" title=\"Ideas, Planning, & Feedback\">🤔</a></td>\n  </tr>\n  <tr>\n    <td align=\"center\"><a href=\"https://github.com/DarshanBhoi\"><img src=\"https://avatars2.githubusercontent.com/u/70128281?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Darshan</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/issues?q=author%3ADarshanBhoi\" title=\"Bug reports\">🐛</a></td>\n    <td align=\"center\"><a href=\"https://github.com/SkeletalDemise\"><img src=\"https://avatars1.githubusercontent.com/u/29117662?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>SkeletalDemise</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=SkeletalDemise\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://www.patreon.com/cclauss\"><img src=\"https://avatars3.githubusercontent.com/u/3709715?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Christian Clauss</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=cclauss\" title=\"Code\">💻</a> <a href=\"https://github.com/Ciphey/Ciphey/issues?q=author%3Acclauss\" title=\"Bug reports\">🐛</a></td>\n    <td align=\"center\"><a href=\"http://machinexa.xss.ht\"><img src=\"https://avatars1.githubusercontent.com/u/60662297?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Machinexa2</b></sub></a><br /><a href=\"#content-machinexa2\" title=\"Content\">🖋</a></td>\n    <td align=\"center\"><a href=\"https://github.com/anantverma275\"><img src=\"https://avatars1.githubusercontent.com/u/18184503?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Anant Verma</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=anantverma275\" title=\"Code\">💻</a> <a href=\"https://github.com/Ciphey/Ciphey/issues?q=author%3Aanantverma275\" title=\"Bug reports\">🐛</a></td>\n    <td align=\"center\"><a href=\"https://github.com/XVXTOR\"><img src=\"https://avatars1.githubusercontent.com/u/40268197?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>XVXTOR</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=XVXTOR\" title=\"Documentation\">📖</a></td>\n    <td align=\"center\"><a href=\"https://github.com/Itamikame\"><img src=\"https://avatars2.githubusercontent.com/u/59034423?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Itamikame</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=Itamikame\" title=\"Code\">💻</a></td>\n  </tr>\n  <tr>\n    <td align=\"center\"><a href=\"https://github.com/MikeMerz\"><img src=\"https://avatars3.githubusercontent.com/u/50526795?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>MikeMerz</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=MikeMerz\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/jacobggman\"><img src=\"https://avatars2.githubusercontent.com/u/30216976?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Jacob Galam</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=jacobggman\" title=\"Code\">💻</a> <a href=\"https://github.com/Ciphey/Ciphey/issues?q=author%3Ajacobggman\" title=\"Bug reports\">🐛</a></td>\n    <td align=\"center\"><a href=\"https://tuxthexplorer.github.io/\"><img src=\"https://avatars1.githubusercontent.com/u/37508897?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>TuxTheXplorer</b></sub></a><br /><a href=\"#translation-TuxTheXplorer\" title=\"Translation\">🌍</a></td>\n    <td align=\"center\"><a href=\"https://github.com/Itamai\"><img src=\"https://avatars3.githubusercontent.com/u/53093696?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Itamai</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=Itamai\" title=\"Code\">💻</a> <a href=\"https://github.com/Ciphey/Ciphey/issues?q=author%3AItamai\" title=\"Bug reports\">🐛</a></td>\n    <td align=\"center\"><a href=\"https://github.com/Termack\"><img src=\"https://avatars2.githubusercontent.com/u/26333901?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Filipe</b></sub></a><br /><a href=\"#translation-Termack\" title=\"Translation\">🌍</a></td>\n    <td align=\"center\"><a href=\"https://github.com/malathit\"><img src=\"https://avatars0.githubusercontent.com/u/2684148?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Malathi</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=malathit\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://hexchaos.xyz/\"><img src=\"https://avatars1.githubusercontent.com/u/8947820?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Jack</b></sub></a><br /><a href=\"#translation-HexChaos\" title=\"Translation\">🌍</a></td>\n  </tr>\n  <tr>\n    <td align=\"center\"><a href=\"https://github.com/yafkari\"><img src=\"https://avatars3.githubusercontent.com/u/41365655?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Younes</b></sub></a><br /><a href=\"#translation-yafkari\" title=\"Translation\">🌍</a></td>\n    <td align=\"center\"><a href=\"https://gitlab.com/Marnick39\"><img src=\"https://avatars2.githubusercontent.com/u/17315511?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Marnick Vandecauter</b></sub></a><br /><a href=\"#translation-Marnick39\" title=\"Translation\">🌍</a></td>\n    <td align=\"center\"><a href=\"https://github.com/mav8557\"><img src=\"https://avatars0.githubusercontent.com/u/47306745?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Michael V</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=mav8557\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/chuinzer\"><img src=\"https://avatars2.githubusercontent.com/u/64257785?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>chuinzer</b></sub></a><br /><a href=\"#translation-chuinzer\" title=\"Translation\">🌍</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-enable -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nQuesto progetto segue le specifiche [all-contributors](https://github.com/all-contributors/all-contributors) Contributi di qualunque tipo sono i benvenuti!\n"
  },
  {
    "path": "translations/nl/CODE_OF_CONDUCT.md",
    "content": "<p align=\"center\">\nVertalingen <br>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/de/CODE_OF_CONDUCT.md>🇩🇪 DE   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/CODE_OF_CONDUCT.md>🇬🇧 EN   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/hu/CODE_OF_CONDUCT.md>🇭🇺 HU   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/id/CODE_OF_CONDUCT.md>🇮🇩 ID   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/it/CODE_OF_CONDUCT.md>🇮🇹 IT   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/nl/CODE_OF_CONDUCT.md>🇳🇱 NL   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/pt-br/CODE_OF_CONDUCT.md>🇧🇷 PT-BR   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/ru/CODE_OF_CONDUCT.md>🇷🇺 RU   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/zh/CODE_OF_CONDUCT.md>🇨🇳 ZH   </a>\n</p>\n\n# Gedragscode voor Bijdragersconvenant\n\n## Onze belofte\n\nIn het belang van het bevorderen van een open en gastvrije omgeving, beloven wij als\nbijdragers en onderhouders het deelnemen aan ons project en\nonze gemeenschap een intimidatie-vrije ervaring voor iedereen, ongeacht leeftijd,\nlichaamsgrootte, handicap, etniciteit, geslachtskenmerken, genderidentiteit en expressie,\nervaringsniveau, opleiding, sociaaleconomische status, nationaliteit, uiterlijk,\nras, religie of seksuele identiteit en geaardheid.\n\n## Onze normen\n\nVoorbeelden van gedrag dat bijdraagt aan het creëren van een positieve omgeving\nomvatten:\n\n- Gastvrije en inclusieve taal gebruiken\n- Respectvol zijn voor verschillende standpunten en ervaringen\n- Constructieve kritiek aanvaarden\n- Focussen op wat het beste is voor de gemeenschap\n- Empathie tonen naar andere leden van de gemeenschap\n\nVoorbeelden van onaanvaardbaar gedrag van deelnemers omvatten:\n\n- Het gebruik van geseksualiseerde taal of beelden en ongewenste seksuele aandacht\n- Trollen, beledigende / denigrerende opmerkingen en persoonlijke of politieke aanvallen\n- Intimidatie in het openbaar of privé\n- Het publiceren van privégegevens van anderen, zoals fysieke of elektronische adressen,\n  zonder uitdrukkelijke toestemming\n- Ander gedrag dat redelijkerwijs als ongepast zou kunnen worden beschouwd in een\n  professionele setting\n\n## Onze verantwoordelijkheden\n\nProjectbeheerders zijn verantwoordelijk voor het verduidelijken van de normen van aanvaardbaar\ngedrag en wordt verwacht dat ze passende en eerlijke corrigerende maatregelen nemen in\nreactie op gevallen van onaanvaardbaar gedrag.\n\nProjectbeheerders hebben het recht en de verantwoordelijkheid om opmerkingen, commits,\ncode, wiki-bewerkingen, issues en andere contributies die niet in overeenstemming zijn\nmet deze Gedragscode te verwijderen, bewerken of weigeren, of om tijdelijk of permanent\nde toegang te verbieden van elke bijdrager voor ander gedrag dat zij ongepast,\nbedreigend, beledigend of schadelijk achten.\n\n## Reikwijdte\n\nDeze Gedragscode is zowel van toepassing binnen projectruimten als in openbare ruimten\nwanneer een persoon het project of zijn gemeenschap vertegenwoordigt. Voorbeelden van\nhet vertegenwoordigen van een project of gemeenschap omvat het gebruik van een officiële project-e-mail\nadres, posten via een officieel sociale media-account of optreden als een aangestelde\nvertegenwoordiger bij een online of offline evenement. Wat onder de vertegenwoordiging\nvan een project kan vallen kan verder gedefinieerd en verduidelijkt worden door projectbeheerders.\n\n## Handhaving\n\nGevallen van grofheid, intimidatie of anderzijds onaanvaardbaar gedrag kan\ngemeld worden door contact op te nemen met het projectteam op brandon_skerrit. Alle\nklachten worden beoordeeld en onderzocht en resulteren in een reactie die\nnoodzakelijk en passend geacht worden onder de omstandigheden. Het projectteam is\nverplicht tot geheimhouding met betrekking tot de melder van een incident.\nVerdere details van het handhavingsbeleid kunnen afzonderlijk worden gepost.\n\nProjectbeheerders die de Gedragscode niet in goed vertrouwen naleven of handhaven kunnen\ntijdelijke of permanente gevolgen ondervinden, zoals bepaald door anderen\nleden van de projectleiding.\n\n## Attributie\n\nDeze gedragscode is gebaseerd op de [Contributor Covenant][homepage], versie 1.4,\nbeschikbaar op <https://www.contributor-covenant.org/version/1/4/code-of-conduct.html>\n\n[homepage]: https://www.contributor-covenant.org\n\nVoor antwoorden op veelgestelde vragen over deze gedragscode, zie <https://www.contributor-covenant.org/faq>\n"
  },
  {
    "path": "translations/nl/CONTRIBUTING.md",
    "content": "<p align=\"center\">\nVertalingen <br>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/de/CONTRIBUTING.md>🇩🇪 DE   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/de/CONTRIBUTING.md>🇬🇧 EN   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/hu/CONTRIBUTING.md>🇭🇺 HU   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/id/CONTRIBUTING.md>🇮🇩 ID   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/it/CONTRIBUTING.md>🇮🇹 IT   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/nl/CONTRIBUTING.md>🇳🇱 NL   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/pt-br/CONTRIBUTING.md>🇧🇷 PT-BR   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/ru/CONTRIBUTING.md>🇷🇺 RU   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/zh/CONTRIBUTING.md>🇨🇳 ZH   </a>\n</p>\n\nHey daar!\n\nDus je bent geïnteresseerd om bij te dragen aan Ciphey? 🤔\n\nMisschien weet u niet waar u moet beginnen, of denkt u dat uw programmeervaardigheden niet \"goed genoeg\" zijn? Nou, voor het laatste - dat is belachelijk! We zijn helemaal in orde met \"slechte code\" en zelfs dan, als je dit document leest, ben je waarschijnlijk een geweldige programmeur. Ik bedoel, nieuwelingen leren niet vaak om bij te dragen aan GitHub-projecten 😉\n\nHier zijn enkele manieren waarop u kunt bijdragen aan Ciphey:\n\n- Voeg een nieuwe taal toe 🧏\n- Voeg meer encryptiemethoden toe 📚\n- Maak meer documentatie (erg belangrijk! We zouden je eeuwig dankbaar zijn)\n- Fix bugs die zijn ingediend via GitHub Issues (we kunnen u hierbij ondersteunen 😊)\n- Refactor de codebase 🥺\n\nAls deze moeilijk klinken, hoeft u zich geen zorgen te maken! In dit document wordt precies uitgelegd hoe u elk van deze kunt bereiken. Je naam wordt ook toegevoegd aan de lijst met bijdragers van Ciphey, en we zullen je eeuwig dankbaar zijn! 🙏\n\nWe hebben een kleine Discord-chatroom om met de ontwikkelaars te praten en hulp te krijgen. U kunt ook een GitHub Issue schrijven voor uw suggestie. Als je aan de Discord wilt worden toegevoegd, stuur ons dan een DM of vraag het ons op een of andere manier.\n[Discord Server](https://discord.gg/KfyRUWw)\n\n# Hoe u kunt bijdragen\n\nCiphey heeft altijd meer decoderingstools nodig! Voor meer informatie over het integreren van code in ciphey, ga je naar:\n\n- <https://github.com/Ciphey/Ciphey/wiki/Adding-your-own-ciphers> voor een simpele tutorial\n- <https://github.com/Ciphey/Ciphey/wiki/Extending-Ciphey> voor een API-referentie\n\nHet zou leuk zijn als je er enkele tests voor zou schrijven, door simpelweg een functie in de Ciphey/tests/test_main.py te kopiëren en de cijfertekst te vervangen door iets dat met je cipher is gecodeerd. Als u geen tests toevoegt, zullen we deze waarschijnlijk nog steeds merge,, maar het zal veel moeilijker voor ons zijn om bugs te vinden!\n\nHet is vanzelfsprekend dat we u voor uw harde werk aan de lijst met bijdragers zullen toevoegen!\n\n# Voeg een nieuwe taal toe 🧏\n\nDe standaard taalcontrole, `brandon`, werkt met meerdere talen. Dit klinkt misschien ontmoedigend.\nMaar eerlijk gezegd hoef je alleen maar een woordenboek te nemen, een kleine analyse uit te voeren (we hebben code geschreven om je hierbij te helpen), de woordenboeken en analyse toe te voegen aan een repository. En voeg dan de optie toe aan `settings.yml`.\n\n# Maak meer documentatie\n\nDocumentatie is het belangrijkste onderdeel van Ciphey. Geen enkele documentatie is een extreme 'codeschuld', en dat willen we niet.\n\nGeloof me wanneer ik zeg dat als je bijdraagt aan geweldige documentatie, je op hetzelfde niveau wordt gezien als codebijdragers. Documentatie is absoluut essentieel.\n\nEr zijn veel manieren waarop u documentatie kunt toevoegen.\n\n- Doc strings in de code\n- Verbeteren van onze huidige documentatie (README, dit bestand, onze Ciphey Wiki pagina's)\n- Vertalen van documentatie\n\nEn nog veel meer!\n\n# Fix bugs\n\nBezoek onze GitHub-problemenpagina om alle bugs te vinden die Ciphey heeft! Fix ze en je wordt toegevoegd aan de lijst met bijdragers. ;)\n\n# Refactor de codebase\n\nNiet alle Ciphey volgt PEP8, en een deel van de code wordt herhaald.\n"
  },
  {
    "path": "translations/nl/README.md",
    "content": "<p align=\"center\">\nVertalingen <br>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/de/README.md>🇩🇪 DE   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/README.md>🇬🇧 EN   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/fr/README.md>🇫🇷 FR   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/hu/README.md>🇭🇺 HU   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/id/README.md>🇮🇩 ID   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/it/README.md>🇮🇹 IT   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/nl/README.md>🇳🇱 NL   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/pt-br/README.md>🇧🇷 PT-BR   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/ru/README.md>🇷🇺 RU   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/zh/README.md>🇨🇳 ZH   </a>\n <br><br>\n➡️\n<a href=\"https://github.com/Ciphey/Ciphey/wiki\">Documentatie</a> |\n<a href=\"https://discord.ciphey.online\">Discord</a> |\n<a href=\"https://github.com/Ciphey/Ciphey/wiki/Installation\">Installatie Gids</a>\n⬅️\n\n<br>\n  <img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/binoculars.png\" alt=\"Ciphey\">\n</p>\n\n<p align=\"center\">\n  <img alt=\"GitHub commit activity\" src=\"https://img.shields.io/github/commit-activity/m/ciphey/ciphey\">\n<img src=\"https://pepy.tech/badge/ciphey\">\n <img src=\"https://pepy.tech/badge/ciphey/month\">\n  <a href=\"https://discord.gg/wM3scnc\"><img alt=\"Discord\" src=\"https://img.shields.io/discord/728245678895136898\"></a>\n<a href=\"https://pypi.org/project/ciphey/\"><img src=\"https://img.shields.io/pypi/v/ciphey.svg\"></a>\n  <img src=\"https://img.shields.io/badge/License-MIT-yellow.svg\" alt=\"Ciphey\">\n\n  <img src=\"https://github.com/brandonskerritt/Ciphey/workflows/Python%20application/badge.svg?branch=master\" alt=\"Ciphey\">\n<br>\nVolledig automatische decryptie/decodering/kraak tool die gebruik maakt van natuurlijke taal verwerking en artificiële intelligentie, samen met gezond verstand.\n</p>\n<hr>\n\n## [Installatie Gids](https://github.com/Ciphey/Ciphey/wiki/Installation)\n\n| <p align=\"center\"><a href=\"https://pypi.org/project/ciphey\">🐍 Python | <p align=\"center\"><a href=\"https://hub.docker.com/r/remnux/ciphey\">🐋 Docker (Universal) | <p align=\"center\"><a href=\"https://ports.macports.org/port/ciphey/summary\">🍎 MacPorts (macOS) | <p align=\"center\"><a href=\"https://formulae.brew.sh/formula/ciphey\">🍺 Homebrew (macOS/Linux) |\n| --------------------------------------------------------------------- | --------------------------------------------------------------------------------- | --------------------------------------------------------------------------------- |--------------------------------------------------------------------------------- |\n| <p align=\"center\"><img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/python.png\" /></p> | <p align=\"center\"><img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/docker.png\" /></p> | <p align=\"center\"><img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/macports.png\" /></p> | <p align=\"center\"><img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/homebrew.png\" /></p> |\n| `python3 -m pip install ciphey --upgrade` | `docker run -it --rm remnux/ciphey` | `sudo port install ciphey` | `brew install ciphey` |\n\n| Linux                                                                                                                   | Mac OS                                                                                                                     | Windows                                                                                                                   |\n| ----------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- |\n| ![GitHub Workflow Status](https://img.shields.io/github/workflow/status/ciphey/ciphey/Python%20application?label=Linux) | ![GitHub Workflow Status](https://img.shields.io/github/workflow/status/ciphey/ciphey/Python%20application?label=Mac%20OS) | ![GitHub Workflow Status](https://img.shields.io/github/workflow/status/ciphey/ciphey/Python%20application?label=Windows) |\n\n<hr>\n\n# 🤔 Wat is dit?\n\nGeef geëncrypteerde tekst, krijg de gedecrypteerde tekst terug.\n\n> \"Welk type encryptie?\"\n\nDat is net het punt. Dat weet je niet, je weet enkel dat het mogelijks geëncrypteerd is. Ciphey zal de rest voor jouw uitzoeken.\n\nCiphey kan de meeste dingen oplossen in 3 seconden of minder.\n\n<p align=\"center\" href=\"https://asciinema.org/a/336257\">\n  <img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/index.gif\" alt=\"Ciphey demo\">\n</p>\n\nCiphey wil een tool zijn die veel decryptie & decodering automatiseert, zoals meerdere base coderingen, klassieke coderingen of meer geavanceerde cryptografie.\n\nAls u niet veel weet over cryptografie, of als u snel de geëncrypteerde tekst wilt controleren voordat u er zelf aan gaat werken, dan is Ciphey iets voor u.\n\n**Het Technische Deel.** Ciphey maakt gebruik van een zelfgemaakte kunstmatige intelligentiemodule (_AuSearch_) met een _Cipher Detection Interface_ om te raden met wat iets is geëncrypteerd. En dan een zelfgemaakte, aanpasbare natuurlijke taalverwerking _Language Checker Interface_, dewelke kan detecteren of de gegenereerde tekst overeenkomt met gedecrypteerde tekst.\n\nGeen neurale netwerken of opgeblazen AI hier. We gebruiken enkel wat snel en minimalistisch is.\n\nEn dat is nog maar de tip van de ijsberg. Voor de volledige technische uitleg, check onze [documentatie](https://github.com/Ciphey/Ciphey/wiki).\n\n# ✨ Functies\n\n- **Ondersteuning voor 30+ soorten encryptie** zoals coderingen (binary, base64) en normale encryptie zoals Caesar cipher, repeating-key XOR en meer. **[Voor de volledige lijst, klik hier](https://github.com/Ciphey/Ciphey/wiki/Supported-Ciphers)**\n- **Zelfgemaakte kunstmatige intelligentiemodule met Augmented Search (AuSearch) voor het beantwoorden van vragen als \"Welke encryptiemethode werd hier gebruikt?\"** Wat er voor zorgt dat decryptie minder dan 3 seconden duurt.\n- **Zelfgemaakte natuurlijke taalverwerking module** Ciphey kan detecteren wanneer iets is gedecrypteerd of niet. Ongeacht of deze tekst JSON, een CTF vlag of Engels is, Ciphey krijgt het op enkele milliseconden klaar.\n- **Ondersteuning voor meerdere talen** op dit moment, wordt enkel Duits & Engels (met AU, UK, CAN, USA varianten).\n- **Ondersteuning voor encryptiemethodes en hashes** dewelke alternatieven zoals CyberChef Magic niet bevatten.\n- **[C++ kern](https://github.com/Ciphey/CipheyCore)** Razendsnel.\n\n# 🔭 Ciphey vs CyberChef\n\n## 🔁 42 keer Base64 Gecodeerd\n\n<table>\n  <tr>\n  <th>Naam</th>\n    <th>⚡ Ciphey ⚡ </th>\n    <th>🐢 CyberChef 🐢</th>\n  </tr>\n  <tr>\n  <th>Gif</th>\n    <td><img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/ciphey_gooder_cyberchef.gif\" alt=\"The guy she tells you not to worry about\"></td>\n    <td><img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/not_dying.gif\" alt=\"You\"></td>\n  </tr>\n  <tr>\n  <th>Tijd</th>\n    <td>2 seconden</td>\n    <td>6 seconden</td>\n  </tr>\n    <tr>\n  <th>Opstelling</th>\n    <td><ul><li>Voer ciphey uit op het bestand</li></ul></td>\n    <td><ul><li>Zet de regex parameter op \"{\"</li><li>Je moet weten hoeveel recursie je nodig hebt</li><li>Je moet weten dat het heel de tijd base64 nodig heeft</li><li>Je moet CyberChef inladen (het is een overbodig grote JS app)</li><li>Genoeg van CyberChef weten om deze opstelling te kunnen bekomen</li><li>Het resultaat inverteren</li></ul></td>\n  </tr>\n</table>\n\n<sub><b>Note</b> De gifs kunnen op verschillende momenten inladen, waardoor de ene significant sneller zou kunnen lijken dan de andere.</sub><br>\n<sub><b>Een opmerking over Magic</b>CyberChef's meest gelijkaardige functie aan Ciphey is Magic. Magic faalt meteen op deze input en crasht. De enige manier waarop we CyberChef konden dwingen om te concurreren was om alles manueel te definiëren.</sub>\n\nWe hehben ook CyberChef en Ciphey getest met een **6gb groot bestand**. Ciphey kraakt dit in **5 minuten en 54 seconden**. CyberChef crasht voor het nog maar kon beginnen.\n\n## 📊 Ciphey vs Katana vs CyberChef Magic\n\n| **Naam**                                     | ⚡ Ciphey ⚡ | 🗡️ Katana 🗡️ | 🐢 CyberChef Magic 🐢 |\n| -------------------------------------------- | ------------ | ------------ | --------------------- |\n| Geavanceerde Taalcontrole                    | ✅           | ❌           | ✅                    |\n| Ondersteunt Encryptie                        | ✅           | ✅           | ❌                    |\n| Releases genoemd naar Dystopische thema's 🌃 | ✅           | ❌           | ❌                    |\n| Ondersteunt hashes                           | ✅           | ✅           | ❌                    |\n| Makkelijk te installeren                     | ✅           | ❌           | ✅                    |\n| Kan raden waarmee iets is geëncrypteerd      | ✅           | ❌           | ❌                    |\n| Gemaakt voor hackers door hackers            | ✅           | ✅           | ❌                    |\n\n# 🎬 Aan de slag\n\nAls je problemen hebt met het installeren van Ciphey, [lees dit.](https://github.com/Ciphey/Ciphey/wiki/Common-Issues-&-Their-Solutions)\n\n## ‼️ Belangrijke links (Docs, Installatie Gids, Discord Support)\n\n| Installation Gids                                                         | Documentatie                                             | Discord                                     | Docker Image (from REMnux)                                                                         |\n| ------------------------------------------------------------------------- | -------------------------------------------------------- | ------------------------------------------- | -------------------------------------------------------------------------------------------------- |\n| 📖 [Installatie Gids](https://github.com/Ciphey/Ciphey/wiki/Installation) | 📚 [Documentatie](https://github.com/Ciphey/Ciphey/wiki) | 🦜 [Discord](https://discord.ciphey.online) | 🐋 [Docker Documentatie](https://docs.remnux.org/run-tools-in-containers/remnux-containers#ciphey) |\n\n## 🏃‍♀️ Ciphey Gebruiken\n\nEr zijn 3 manieren om Ciphey te gebruiken.\n\n1. Bestand invoer `ciphey -f encrypted.txt`\n2. Ongekwantificeerde input `ciphey -- \"Encrypted input\"`\n3. Normale manier `ciphey -t \"Encrypted input\"`\n\n![Gif die de 3 manieren toont om Ciphey te gebruiken](https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/3ways.gif)\n\nOm van de progressie bar, kansen tafel en al het andere lawaai af te geraken, gebruikt de stille modus.\n\n`ciphey -t \"encrypted text here\" -q`\n\nVoor een volledige lijst van argumenten, voer `ciphey --help` uit.\n\n### ⚗️ Ciphey Importeren\n\nJe kan Ciphey\\'s main importeren en gebruiken in je eigen code. `from Ciphey.__main__ import main`\n\n# 🎪 Bijdragers\n\nCiphey is uitgevonden door [Brandon](https://github.com/bee-san) in 2008, en nieuw leven ingeblazen in 2019. Ciphey zou niet staan waar het vandaag de dag staat zonder [Cyclic3](https://github.com/Cyclic3) - president van UoL's Cyber Security Society.\n\nCiphey werd nieuw leven ingeblazen & hermaakt door de [Cyber Security Society](https://www.cybersoc.cf/) voor gebruik in CTFs. Moest je ooit in Liverpool zijn, overweeg een lezing te houden of onze evenementen te sponsoren. E-mail ons op `cybersecurity@society.liverpoolguild.org` om meer te weten te komen 🤠\n\n**Zeer Grote Dank** aan George H om uit te zoeken hoe we de juiste algoritmen kunnen gebruiken om het zoekproces te versnellen.\n**Grote Dank** to [varghalladesign](https://www.facebook.com/varghalladesign) voor het ontwerpen van het logo. Bekijk hun andere ontwerpen!\n\n## 🐕‍🦺 [Bijdragen](https://github.com/Ciphey/Ciphey/wiki/Contributing)\n\nWees niet bang om bij te dragen! Wij hebben veel dingen die je kan doen om te helpen. Elk waarvan een label hebben en een uitleg met voorbeelden. Moest je vast geraken, tag @bee-san of @cyclic3 in de GithHub Issue ✨\nJe kunt ook lid worden van de Discord-groep en daar een bericht sturen (link in [bijdrager bestand](https://github.com/Ciphey/Ciphey/wiki/Contributing)) of bovenaan deze README als badge.\n\nLees het [bijdrager bestand](https://github.com/Ciphey/Ciphey/wiki/Contributing) voor exacte details over hoe u kunt bijdragen ✨\n\nDoor dit te doen, wordt uw naam toegevoegd aan de README hieronder en kunt u deel uitmaken van een steeds groter wordend project!\n[![Stargazers over tijd](https://starchart.cc/Ciphey/Ciphey.svg)](https://starchart.cc/Ciphey/Ciphey)\n\n## 💰 Financiële bijdragers\n\nDe bijdragen zullen niet alleen worden gebruikt om de toekomst van Ciphey en zijn auteurs te financieren, maar ook om Cyber Security Society aan de Universiteit van Liverpool te financieren.\n\nGitHub ondersteunt \"sponsor this project and we'll evenly distribute the money\" niet, dus kies een link en we lossen het aan onze kant op 🥰\n\n## ✨ Bijdragers\n\nDank aan deze geweldige mensen ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://github.com/Cyclic3\"><img src=\"https://avatars1.githubusercontent.com/u/15613874?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>cyclic3</b></sub></a><br /><a href=\"#design-cyclic3\" title=\"Design\">🎨</a> <a href=\"#maintenance-cyclic3\" title=\"Maintenance\">🚧</a> <a href=\"https://github.com/Ciphey/Ciphey/commits?author=cyclic3\" title=\"Code\">💻</a> <a href=\"#ideas-cyclic3\" title=\"Ideas, Planning, & Feedback\">🤔</a></td>\n    <td align=\"center\"><a href=\"https://skerritt.blog\"><img src=\"https://avatars3.githubusercontent.com/u/10378052?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Brandon</b></sub></a><br /><a href=\"#design-brandonskerritt\" title=\"Design\">🎨</a> <a href=\"#maintenance-brandonskerritt\" title=\"Maintenance\">🚧</a> <a href=\"https://github.com/Ciphey/Ciphey/commits?author=brandonskerritt\" title=\"Code\">💻</a> <a href=\"#ideas-brandonskerritt\" title=\"Ideas, Planning, & Feedback\">🤔</a></td>\n    <td align=\"center\"><a href=\"https://github.com/michalani\"><img src=\"https://avatars0.githubusercontent.com/u/27767884?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>michalani</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=michalani\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/ashb07\"><img src=\"https://avatars2.githubusercontent.com/u/24845568?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>ashb07</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=ashb07\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/TheAlcanian\"><img src=\"https://avatars3.githubusercontent.com/u/22127191?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Shardion</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/issues?q=author%3ATheAlcanian\" title=\"Bug reports\">🐛</a></td>\n    <td align=\"center\"><a href=\"https://github.com/Bryzizzle\"><img src=\"https://avatars0.githubusercontent.com/u/57810197?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Bryan</b></sub></a><br /><a href=\"#translation-Bryzizzle\" title=\"Translation\">🌍</a> <a href=\"https://github.com/Ciphey/Ciphey/commits?author=Bryzizzle\" title=\"Documentation\">📖</a></td>\n    <td align=\"center\"><a href=\"https://lukasgabriel.net\"><img src=\"https://avatars0.githubusercontent.com/u/52338810?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Lukas Gabriel</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=lukasgabriel\" title=\"Code\">💻</a> <a href=\"https://github.com/Ciphey/Ciphey/issues?q=author%3Alukasgabriel\" title=\"Bug reports\">🐛</a> <a href=\"#translation-lukasgabriel\" title=\"Translation\">🌍</a> <a href=\"#ideas-lukasgabriel\" title=\"Ideas, Planning, & Feedback\">🤔</a></td>\n  </tr>\n  <tr>\n    <td align=\"center\"><a href=\"https://github.com/DarshanBhoi\"><img src=\"https://avatars2.githubusercontent.com/u/70128281?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Darshan</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/issues?q=author%3ADarshanBhoi\" title=\"Bug reports\">🐛</a></td>\n    <td align=\"center\"><a href=\"https://github.com/SkeletalDemise\"><img src=\"https://avatars1.githubusercontent.com/u/29117662?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>SkeletalDemise</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=SkeletalDemise\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://www.patreon.com/cclauss\"><img src=\"https://avatars3.githubusercontent.com/u/3709715?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Christian Clauss</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=cclauss\" title=\"Code\">💻</a> <a href=\"https://github.com/Ciphey/Ciphey/issues?q=author%3Acclauss\" title=\"Bug reports\">🐛</a></td>\n    <td align=\"center\"><a href=\"http://machinexa.xss.ht\"><img src=\"https://avatars1.githubusercontent.com/u/60662297?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Machinexa2</b></sub></a><br /><a href=\"#content-machinexa2\" title=\"Content\">🖋</a></td>\n    <td align=\"center\"><a href=\"https://github.com/anantverma275\"><img src=\"https://avatars1.githubusercontent.com/u/18184503?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Anant Verma</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=anantverma275\" title=\"Code\">💻</a> <a href=\"https://github.com/Ciphey/Ciphey/issues?q=author%3Aanantverma275\" title=\"Bug reports\">🐛</a></td>\n    <td align=\"center\"><a href=\"https://github.com/XVXTOR\"><img src=\"https://avatars1.githubusercontent.com/u/40268197?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>XVXTOR</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=XVXTOR\" title=\"Documentation\">📖</a></td>\n    <td align=\"center\"><a href=\"https://github.com/Itamikame\"><img src=\"https://avatars2.githubusercontent.com/u/59034423?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Itamikame</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=Itamikame\" title=\"Code\">💻</a></td>\n  </tr>\n  <tr>\n    <td align=\"center\"><a href=\"https://github.com/MikeMerz\"><img src=\"https://avatars3.githubusercontent.com/u/50526795?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>MikeMerz</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=MikeMerz\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/jacobggman\"><img src=\"https://avatars2.githubusercontent.com/u/30216976?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Jacob Galam</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=jacobggman\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://tuxthexplorer.github.io/\"><img src=\"https://avatars1.githubusercontent.com/u/37508897?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>TuxTheXplorer</b></sub></a><br /><a href=\"#translation-TuxTheXplorer\" title=\"Translation\">🌍</a></td>\n    <td align=\"center\"><a href=\"https://github.com/Itamai\"><img src=\"https://avatars3.githubusercontent.com/u/53093696?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Itamai</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=Itamai\" title=\"Code\">💻</a> <a href=\"https://github.com/Ciphey/Ciphey/issues?q=author%3AItamai\" title=\"Bug reports\">🐛</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-enable -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nDit project volgt de [all-contributors](https://github.com/all-contributors/all-contributors) specificatie. Bijdragen van welke aard dan ook zijn welkom!\n"
  },
  {
    "path": "translations/pt-br/CODE_OF_CONDUCT.md",
    "content": "<p align=\"center\">\nTraduções <br>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/de/CODE_OF_CONDUCT.md>🇩🇪 DE   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/CODE_OF_CONDUCT.md>🇬🇧 EN   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/hu/CODE_OF_CONDUCT.md>🇭🇺 HU   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/id/CODE_OF_CONDUCT.md>🇮🇩 ID   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/it/CODE_OF_CONDUCT.md>🇮🇹 IT   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/nl/CODE_OF_CONDUCT.md>🇳🇱 NL   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/pt-br/CODE_OF_CONDUCT.md>🇧🇷 PT-BR   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/ru/CODE_OF_CONDUCT.md>🇷🇺 RU   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/zh/CODE_OF_CONDUCT.md>🇨🇳 ZH   </a>\n</p>\n\n# Código de conduta do colaborador\n\n## Nosso juramento\n\nNo interesse de promover um ambiente aberto e acolhedor, nós como contribuidores e mantedores juramos fazer com que a participação no nosso projeto e comunidade, uma experiência livre de assédio para todos, independente de idade, tamanho do corpo, deficiência, etnia, características sexuais, identidade de gênero e expressão, nível de experiência, educação, status sócio-econômico, nacionalidade, aparência pessoal, raça, religião ou identidade e orientação sexual.\n\n## Nossas normas\n\nExemplos de comportamentos que contribuem em criar um ambiente positivo incluem:\n\n- Usar linguagem acolhedora e inclusiva\n- Respeitar diferentes pontos de vista e experiências\n- Aceitar críticas construtivas\n- Focar no que é melhor para a comunidade\n- Demonstrar empatia para os outros membros da comunidade\n\nExemplos de comportamentos inaceitáveis por participantes incluem:\n\n- Uso de linguagem ou imagens sexuais e avanços ou atenções sexuais indesejáveis.\n- Comentários indesejáveis, insultantes/derrogatórios e ataques pessoais ou políticos.\n- Abuso público ou privado\n- Publicar informação privada de alguem, como endereço fisíco ou virtual, sem permissão explícita.\n- Outras condutas que poderiam ser consideradas inapropriadas num ambiente profissional\n\n## Nossas Responsabilidades\n\nMantedores do projeto são responsáveis por clarificar as normas de comportamento aceitável e é esperado que tomem ações corretivas apropriadas e justas em resposta a qualquer instância de comportamento inaceitável.\n\nSão responsabilidades e direitos dos mantedores do projeto:remover, editar ou rejeitar comentários, commits, códifo, edições na wiki, questões e outras contribuições que não se alinhem com esse código de conduta, ou banir temporáriamente ou permanentemente qualquer contribuidor por outro comportamento que são dados como inapropriados, ameaçadores, ofensivos ou prejudiciais.\n\n## Escopo\n\nEsse código de conduta aplica tanto em espaços para o projeto como em espaços públicos em quem um indivíduo esteja representando o projeto ou a comunidade. Exemplos de representação do projeto ou comunidade incluem usar um endereço de e-mail oficial do projeto, publicações numa conta oficial do projeto em uma rede social ouo agindo como um representante num evento online ou offline. Representação do projeto pode ser definido e clarificado posteriormente por mantedores do projeto.\n\n## Execução\n\nInstâncias de comportamento abusivo, assediante ou inaceitável poderá ser reportado contactando o time do projeto em brandon_skerrit. Todas reclamações serão revisadas e investigadas e resultarão em uma resposta que seja decidida necessária e apropriada para as circunstâncias. O time do projeto é obrigado a manter confidencialidade em relação ao relator de um incidente. Mais detalhes da política de execução específica podem ser publicados separadamente.\n\nMantedores do projeto que não seguirem ou executarem o códico de conduta em boa fé podem sofrer repercussões temporárias ou permanentes como determinado por outros membros da liderança do projeto.\n\n## Atribuição\n\nEsse código de conduta é adaptado do [Contributor Covenant][homepage], versão 1.4,\ndisponível em <https://www.contributor-covenant.org/version/1/4/code-of-conduct.html>\n\n[homepage]: https://www.contributor-covenant.org\n\nPara respostas de perguntas comuns sobre esse código de conduta, veja\n<https://www.contributor-covenant.org/faq>\n"
  },
  {
    "path": "translations/pt-br/CONTRIBUTING.md",
    "content": "<p align=\"center\">\nTraduções <br>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/de/CONTRIBUTING.md>🇩🇪 DE   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/de/CONTRIBUTING.md>🇬🇧 EN   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/hu/CONTRIBUTING.md>🇭🇺 HU   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/id/CONTRIBUTING.md>🇮🇩 ID   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/it/CONTRIBUTING.md>🇮🇹 IT   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/nl/CONTRIBUTING.md>🇳🇱 NL   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/pt-br/CONTRIBUTING.md>🇧🇷 PT-BR   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/ru/CONTRIBUTING.md>🇷🇺 RU   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/zh/CONTRIBUTING.md>🇨🇳 ZH   </a>\n</p>\n\nOlá!\n\nEntão você está interessado em contribuir com Ciphey? 🤔\n\nTalves você esteja confudo em onde começar, ou você acredita que suas habilidades em escrever código não são \"boas o bastante\"? Bom, para a segunda opção - isso é ridículo! Nós estamos de boa com \"código ruim\" e mesmo assim, se você está lendo esse documento, você provavelmente é um programador bom. Quer dizer, iniciantes normalmente não aprendem a contribuir em projetos do GitHub. 😉\n\nAqui estão algumas maneiras de contribuir com Ciphey:\n\n- Adicione uma linguagem nova 🧏\n- Adicione metodos de criptografia 📚\n- Crie mais documentação (muito importante! Nós seriamos eternamente gratos)\n- Resolva bugs nas questoes do GitHub (nós podemos te ajudar nisso 😊)\n- Refatore o código 🥺\n\nSe esses parecem difíceis, não se preocupe! Esse documento vai te ensinar exatamente como alcançar qualquer um desses. Além disso, seu nome será adicionado para a lista de contribuidores do Ciphey e nós seremos eternamente gratos! 🙏\n\nNós temos um pequeno chat do Discord para você conversar com os desenvolvedores e receber uma ajuda. Alternativamente, você pode escrever uma issue no GitHub para a sua sugestão. Se você quiser ser adicionado no Discord, mande uma DM ou nos pergunte de alguma maneira.\n\n[Servidor do Discord](https://discord.gg/KfyRUWw)\n\n# Como contribuir\n\nCiphey sempre precisa mais ferramentas de descriptografia! Para aprender como integrar código no Ciphey, dê uma olhada:\n\n- <https://github.com/Ciphey/Ciphey/wiki/Adding-your-own-ciphers> para um tutorial simples\n- <https://github.com/Ciphey/Ciphey/wiki/Extending-Ciphey> para a referência da API\n\nSeria bom se você escrever testes, simplesmente copiando a função em Ciphey/tests/test_main.py e substituindo o texto cifrado por algo codificado pela sua cifra. Se você não adicionar testes, nós provavelmente ainda aceitaremos, mas vai ser muito mais difícil para nós diagnosticar os bugs!\n\nNão precisa nem dizer que nós adicionaremos você para a lista de contribuidores por seu trabalho duro!\n\n# Adicionar uma linguagem nova 🧏\n\nO verificador de linguagem padrão, `brandon`, trabalha com multiplas linguagens. Agora, isso pode soar assustador.\nMas honestamente, tudo oque você deve fazer é pegar um dicionário, fazer uma pequena análise (nós escrevemos código para te ajudar com isso), adicionar os dicionários e análise para o repositório. E então adicionar a opção para `settings.yml`.\n\n# Criar mais documentação\n\nDocumentação é a parte mais importante de Ciphey. Sem documentação o codigo fica dificil de entender e nós não queremos isso.\n\nAcredite quando eu digo, se você contribuir com boa documentação, você será visto no mesmo nível de contribuidores de códifo. Documentação é absolutamente vital.\n\nExistem várias maneiras de adicionar documentação.\n\n- Documentando strings no código\n- Melhorando a documentação atual (README, esse arquivo, as paginas Wiki do Ciphey)\n- Traduzindo documentação\n\nE muito mais!\n\n# Resolver bugs\n\nVisite nossa página de GitHub issues para encontrar todos os bugs que Ciphey tem! Acabe com eles e você será adicionado na lista de contribuidores. ;)\n\n# Refactorar o código\n\nNem todo código de Ciphey segue PEP8 e uma parte do código é repetida.\n"
  },
  {
    "path": "translations/pt-br/README.md",
    "content": "<p align=\"center\">\nTraduções <br>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/de/README.md>🇩🇪 DE   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/README.md>🇬🇧 EN   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/fr/README.md>🇫🇷 FR   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/hu/README.md>🇭🇺 HU   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/id/README.md>🇮🇩 ID   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/it/README.md>🇮🇹 IT   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/nl/README.md>🇳🇱 NL   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/pt-br/README.md>🇧🇷 PT-BR   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/ru/README.md>🇷🇺 RU   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/zh/README.md>🇨🇳 ZH   </a>\n <br><br>\n➡️\n<a href=\"https://github.com/Ciphey/Ciphey/wiki\">Documentação</a> |\n<a href=\"https://discord.ciphey.online\">Discord</a> |\n <a href=\"https://github.com/Ciphey/Ciphey/wiki/Installation\">Guia de Instalação</a>\n ⬅️\n\n<br>\n  <img src=\"../../Pictures_for_README/binoculars.png\" alt=\"Ciphey\">\n</p>\n\n<p align=\"center\">\n  <img alt=\"GitHub commit activity\" src=\"https://img.shields.io/github/commit-activity/m/ciphey/ciphey\">\n<img src=\"https://pepy.tech/badge/ciphey\">\n <img src=\"https://pepy.tech/badge/ciphey/month\">\n  <a href=\"https://discord.gg/wM3scnc\"><img alt=\"Discord\" src=\"https://img.shields.io/discord/728245678895136898\"></a>\n<a href=\"https://pypi.org/project/ciphey/\"><img src=\"https://img.shields.io/pypi/v/ciphey.svg\"></a>\n  <img src=\"https://img.shields.io/badge/License-MIT-yellow.svg\" alt=\"Ciphey\">\n\n  <img src=\"https://github.com/brandonskerritt/Ciphey/workflows/Python%20application/badge.svg?branch=master\" alt=\"Ciphey\">\n<br>\nFerramenta de decifrar/decodificar completamente automatizada usando processamento de linguagem natural e inteligência artificial, também com um pouco de senso comum.\n</p>\n<hr>\n\n## [Guia de instalação](https://github.com/Ciphey/Ciphey/wiki/Installation) (Em inglês)\n\n| <p align=\"center\"><a href=\"https://pypi.org/project/ciphey\">🐍 Python | <p align=\"center\"><a href=\"https://hub.docker.com/r/remnux/ciphey\">🐋 Docker (Universal) | <p align=\"center\"><a href=\"https://ports.macports.org/port/ciphey/summary\">🍎 MacPorts (macOS) | <p align=\"center\"><a href=\"https://formulae.brew.sh/formula/ciphey\">🍺 Homebrew (macOS/Linux) |\n| --------------------------------------------------------------------- | --------------------------------------------------------------------------------- | --------------------------------------------------------------------------------- |--------------------------------------------------------------------------------- |\n| <p align=\"center\"><img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/python.png\" /></p> | <p align=\"center\"><img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/docker.png\" /></p> | <p align=\"center\"><img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/macports.png\" /></p> | <p align=\"center\"><img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/homebrew.png\" /></p> |\n| `python3 -m pip install ciphey --upgrade` | `docker run -it --rm remnux/ciphey` | `sudo port install ciphey` | `brew install ciphey` |\n\n| Linux                                                                                                                   | Mac OS                                                                                                                     | Windows                                                                                                                   |\n| ----------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- |\n| ![GitHub Workflow Status](https://img.shields.io/github/workflow/status/ciphey/ciphey/Python%20application?label=Linux) | ![GitHub Workflow Status](https://img.shields.io/github/workflow/status/ciphey/ciphey/Python%20application?label=Mac%20OS) | ![GitHub Workflow Status](https://img.shields.io/github/workflow/status/ciphey/ciphey/Python%20application?label=Windows) |\n\n<hr>\n\n# 🤔 Oque é ciphey?\n\nEntra texto criptografado e sai descriptografado.\n\n> \"Que tipo de criptografia?\"\n\nEsse é a questão. Você não sabe, você só sabe que está possivelmente criptografado. Ciphey vai descobrir para você.\n\nCiphey pode resolver a maioria das coisas em 3 segundos ou menos.\n\n<p align=\"center\" href=\"https://asciinema.org/a/336257\">\n  <img src=\"../../Pictures_for_README/index.gif\" alt=\"Ciphey demo\">\n</p>\n\nCiphey pretende ser uma ferramenta para automatizar uma boa parte de descriptografias e decodificações como por exemplo: codificações em multiplas bases, cifras classicas, hashes ou até criptografias mais avançadas.\n\nSe você não sabe muito sobre criptografia, ou quer verificar rapidamente o texto cifrado antes de trabalhar nele você mesmo, Ciphey é para você.\n\n**A parte técnica** Ciphey usa um módulo customizado de inteligência artificial (_AuSearch_) com uma _Interface de detecção de cifras_ para aproximar qual criptografia é usada. E então um processamento de linguagem natural customizado _Interface de verificação de linguagem_, que consegue detectar quando um texto dado vira um texto simples.\n\nSem redes neurais nem uma IA pesada. Nós apenas usamos oque é rápido e mínimo.\n\nE essa é apenas a ponta do iceberg. Para a explicação técnica completa, visite a nossa [documentação](https://github.com/Ciphey/Ciphey/wiki) (Em inglês).\n\n# ✨ Oque ciphey oferece\n\n- **Mais de 30 criptografias** como codificações (binário, base64) e criptografias normais como cifra de Caesar, XOR com chave repetida e mais. **[Para a lista inteira clique aqui](https://github.com/Ciphey/Ciphey/wiki/Supported-Ciphers)**\n- **Inteligência artificial customizada com Busca Aumentada (AuSearch) para responder a questão \"que tipo de criptografia foi usada?\"** Resultando em descriptografias que tomam menos de 3 segundos.\n- **Módulo customizado de Processamento de linguagem natural** Ciphey pode determinar quando algo é texto simples ou não. Se aquele texto é JSON, uma bandeira de CTF ou inglês. Cipey consegue descobrir em milisegundos.\n- **Suporte em multiplas linguagens** no momento apenas Alemão e Inglês (com variações de AU, UK, CAN, USA).\n- **Suporta criptografias e hashes** Que no caso as alternativas como CyberChef Magic não suportam.\n- **[Núcleo em C++](https://github.com/Ciphey/CipheyCore)** Incrivelmente rápido.\n\n# 🔭 Ciphey contra CyberChef\n\n## 🔁 Codficado 42 vezes com Base64\n\n<table>\n  <tr>\n  <th>Nome</th>\n    <th>⚡ Ciphey ⚡ </th>\n    <th>🐢 CyberChef 🐢</th>\n  </tr>\n  <tr>\n  <th>Gif</th>\n    <td><img src=\"../../Pictures_for_README/ciphey_gooder_cyberchef.gif\" alt=\"O cara que ela fala para você não se preocupar\"></td>\n    <td><img src=\"../../Pictures_for_README/not_dying.gif\" alt=\"Você\"></td>\n  </tr>\n  <tr>\n  <th>Tempo</th>\n    <td>2 segundos</td>\n    <td>6 segundos</td>\n  </tr>\n    <tr>\n  <th>Configurando</th>\n    <td><ul><li>Execute Ciphey com o arquivo.</li></ul></td>\n    <td><ul><li>Defina o parâmetro de regex como \"{\"</li>\n    <li>Você deve saber a profundidade da recursão</li>\n    <li>Você deve saber que é base64 até o fim</li>\n    <li>Você tem que carregar o CyberChef (é uma aplicação em JS pesada)</li>\n    <li>Saber o suficiente sobre CyberChef para fazer essa sequência de instruções</li>\n    <li>Inverter a combinação</li></ul></td>\n  </tr>\n</table>\n\n<sub><b>Nota</b> Os gifs podem carregar em tempos diferentes, então um pode parecer muito mais rápido que outro.</sub><br>\n<sub><b>Uma nota em Magic</b> A ferramenta do CyberChef mais similar a Ciphey é Magic. Magic falha num instante nessa entrada e quebra. A unica maneira que poderíamos forçar CyberChef para competir seria definindo-o manualmente.</sub>\n\nNós também testamos CyberChef e Ciphey com um **arquivo de 6gb**. Ciphey decifrou ele em **5 minutos e 54 segundos**. CyberChef quebrou antes de começar.\n\n## 📊 Ciphey contra Katana contra CyberChef Magic\n\n| **Name**                                               | ⚡ Ciphey ⚡ | 🗡️ Katana 🗡️ | 🐢 CyberChef Magic 🐢 |\n| ------------------------------------------------------ | ------------ | ------------ | --------------------- |\n| Verificação avançada de linguagem                      | ✅           | ❌           | ✅                    |\n| Suporta Criptografias                                  | ✅           | ✅           | ❌                    |\n| Lançamentos com nomes provindos de temas distópicos 🌃 | ✅           | ❌           | ❌                    |\n| Suporta Hashes                                         | ✅           | ✅           | ❌                    |\n| Fácil de configurar                                    | ✅           | ❌           | ✅                    |\n| Pode descobrir qual criptografia é usada para algo     | ✅           | ❌           | ❌                    |\n| Criado por hackers para hackers                        | ✅           | ✅           | ❌                    |\n\n# 🎬 Começando\n\nSe você estiver tendo problemas instalando Ciphey, [leia isso](https://github.com/Ciphey/Ciphey/wiki/Common-Issues-&-Their-Solutions) (em inglês).\n\n## ‼️ Links importantes (Documentação, Guia de instalação, Suporte do Discord)\n\n| Guia de instalação                                                          | Documentação                                             | Discord                                     | Imagem Docker (de REMnux)                                                                          |\n| --------------------------------------------------------------------------- | -------------------------------------------------------- | ------------------------------------------- | -------------------------------------------------------------------------------------------------- |\n| 📖 [Guia de instalação](https://github.com/Ciphey/Ciphey/wiki/Installation) | 📚 [Documentação](https://github.com/Ciphey/Ciphey/wiki) | 🦜 [Discord](https://discord.ciphey.online) | 🐋 [Documentação Docker](https://docs.remnux.org/run-tools-in-containers/remnux-containers#ciphey) |\n\n## 🌀Rodando Ciphey\n\nTem 3 maneiras de executar Ciphey.\n\n1. Arquivo de entrada `ciphey -f criptografado.txt`\n2. Entrada indefinida `ciphey -- \"Entrada criptografada\"`\n3. Jeito normal `ciphey -t \"Entrada criptografada\"`\n\n![Gif showing 3 ways to run Ciphey](../../Pictures_for_README/3ways.gif)\n\nPara tirar as barras de progresso, tabela de probabilidade e todo ruído use o modo quieto.\n\n`ciphey -t \"texto criptografado\" -q`\n\nPara uma lista cheia de argumentos, use `ciphey --help`.\n\n### ⚗️ Importando Ciphey\n\nVocê pode importar o arquivo main de Ciphey e usar nos seu próprio código. `from Ciphey.__main__ import main`\n\n# 🎪 Contribuidores\n\nCiphey foi inventado por [Brandon](https://github.com/bee-san) em 2008 e revivido em 2019.\nCiphey não estária aqui hoje sem [Cyclic3](https://github.com/Cyclic3) - presidente da UoL's Cyber Security Society.\n\nCiphey foi revivido e recriado pela [Cyber Security Society](https://www.cybersoc.cf/) para uso em CTFs. Se a qualquer momento você estiver em Liverpool, considere dar uma palesta ou patrocinar nossos eventos. Nos mande um Email em `cybersecurity@society.liverpoolguild.org` para saber mais 🤠\n\n**Crédito principal** para George H por trabalhar em como que poderíamos usar algorítmos adequados para acelerar o processo de busca.\n\n**Agradecimentos especiais** para [varghalladesign](https://www.facebook.com/varghalladesign) por fazer o design da logo. Confira o seu trabalho trabalho de desing!\n\n## 🐕‍🦺 [Contribuindo](CONTRIBUTING.md)\n\nNão tenha medo de contribuir! Nós temos varias coisas que você pode fazer para ajudar. Cada uma rotulada e explicada com exemplos. Se você estiver tentando contribuir mas estiver perdido, marque @bee-san ou @cyclic3 na issue do GitHub. ✨\n\nAlternativamente, entre no grupo do Discord e mande uma mensagem lá (link no [arquivo de contribuição](CONTRIBUTING.md)) ou no topo desse README.\n\nPor favor leia o [arquivo de contribuição](CONTRIBUTING.md) para detalhes exatos em como contribuir.✨\n\nContribuindo, você terá seu nome adicionado no README abaixo e será parte de um projeto que em crescimento!\n[![Stargazers over time](https://starchart.cc/Ciphey/Ciphey.svg)](https://starchart.cc/Ciphey/Ciphey)\n\n## 💰 Contribuições financeiras\n\nAs contribuições serão usadas para financiar não apenas o futuro de Ciphey e seus autores, mas também a Cyber Security Society na Universidade de Liverpool.\n\nGitHub não suporta \"patrocine esse projeto e dividiremos o dinheiro\", então escolha um link e nós dividiremos entre nós. 🥰\n\n## ✨ Contribuidores\n\nAgradecimentos para essas pessoas maravilhosas ([guia de emojis](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://github.com/Cyclic3\"><img src=\"https://avatars1.githubusercontent.com/u/15613874?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>cyclic3</b></sub></a><br /><a href=\"#design-cyclic3\" title=\"Design\">🎨</a> <a href=\"#maintenance-cyclic3\" title=\"Maintenance\">🚧</a> <a href=\"https://github.com/Ciphey/Ciphey/commits?author=cyclic3\" title=\"Code\">💻</a> <a href=\"#ideas-cyclic3\" title=\"Ideas, Planning, & Feedback\">🤔</a></td>\n    <td align=\"center\"><a href=\"https://skerritt.blog\"><img src=\"https://avatars3.githubusercontent.com/u/10378052?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Brandon</b></sub></a><br /><a href=\"#design-brandonskerritt\" title=\"Design\">🎨</a> <a href=\"#maintenance-brandonskerritt\" title=\"Maintenance\">🚧</a> <a href=\"https://github.com/Ciphey/Ciphey/commits?author=brandonskerritt\" title=\"Code\">💻</a> <a href=\"#ideas-brandonskerritt\" title=\"Ideas, Planning, & Feedback\">🤔</a></td>\n    <td align=\"center\"><a href=\"https://github.com/michalani\"><img src=\"https://avatars0.githubusercontent.com/u/27767884?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>michalani</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=michalani\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/ashb07\"><img src=\"https://avatars2.githubusercontent.com/u/24845568?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>ashb07</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=ashb07\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/TheAlcanian\"><img src=\"https://avatars3.githubusercontent.com/u/22127191?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Shardion</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/issues?q=author%3ATheAlcanian\" title=\"Bug reports\">🐛</a></td>\n    <td align=\"center\"><a href=\"https://github.com/Bryzizzle\"><img src=\"https://avatars0.githubusercontent.com/u/57810197?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Bryan</b></sub></a><br /><a href=\"#translation-Bryzizzle\" title=\"Translation\">🌍</a> <a href=\"https://github.com/Ciphey/Ciphey/commits?author=Bryzizzle\" title=\"Documentation\">📖</a></td>\n    <td align=\"center\"><a href=\"https://lukasgabriel.net\"><img src=\"https://avatars0.githubusercontent.com/u/52338810?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Lukas Gabriel</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=lukasgabriel\" title=\"Code\">💻</a> <a href=\"https://github.com/Ciphey/Ciphey/issues?q=author%3Alukasgabriel\" title=\"Bug reports\">🐛</a> <a href=\"#translation-lukasgabriel\" title=\"Translation\">🌍</a> <a href=\"#ideas-lukasgabriel\" title=\"Ideas, Planning, & Feedback\">🤔</a></td>\n  </tr>\n  <tr>\n    <td align=\"center\"><a href=\"https://github.com/DarshanBhoi\"><img src=\"https://avatars2.githubusercontent.com/u/70128281?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Darshan</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/issues?q=author%3ADarshanBhoi\" title=\"Bug reports\">🐛</a></td>\n    <td align=\"center\"><a href=\"https://github.com/SkeletalDemise\"><img src=\"https://avatars1.githubusercontent.com/u/29117662?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>SkeletalDemise</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=SkeletalDemise\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://www.patreon.com/cclauss\"><img src=\"https://avatars3.githubusercontent.com/u/3709715?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Christian Clauss</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=cclauss\" title=\"Code\">💻</a> <a href=\"https://github.com/Ciphey/Ciphey/issues?q=author%3Acclauss\" title=\"Bug reports\">🐛</a></td>\n    <td align=\"center\"><a href=\"http://machinexa.xss.ht\"><img src=\"https://avatars1.githubusercontent.com/u/60662297?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Machinexa2</b></sub></a><br /><a href=\"#content-machinexa2\" title=\"Content\">🖋</a></td>\n    <td align=\"center\"><a href=\"https://github.com/anantverma275\"><img src=\"https://avatars1.githubusercontent.com/u/18184503?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Anant Verma</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=anantverma275\" title=\"Code\">💻</a> <a href=\"https://github.com/Ciphey/Ciphey/issues?q=author%3Aanantverma275\" title=\"Bug reports\">🐛</a></td>\n    <td align=\"center\"><a href=\"https://github.com/XVXTOR\"><img src=\"https://avatars1.githubusercontent.com/u/40268197?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>XVXTOR</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=XVXTOR\" title=\"Documentation\">📖</a></td>\n    <td align=\"center\"><a href=\"https://github.com/Itamikame\"><img src=\"https://avatars2.githubusercontent.com/u/59034423?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Itamikame</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=Itamikame\" title=\"Code\">💻</a></td>\n  </tr>\n  <tr>\n    <td align=\"center\"><a href=\"https://github.com/MikeMerz\"><img src=\"https://avatars3.githubusercontent.com/u/50526795?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>MikeMerz</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=MikeMerz\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/jacobggman\"><img src=\"https://avatars2.githubusercontent.com/u/30216976?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Jacob Galam</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=jacobggman\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://tuxthexplorer.github.io/\"><img src=\"https://avatars1.githubusercontent.com/u/37508897?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>TuxTheXplorer</b></sub></a><br /><a href=\"#translation-TuxTheXplorer\" title=\"Translation\">🌍</a></td>\n    <td align=\"center\"><a href=\"https://github.com/Itamai\"><img src=\"https://avatars3.githubusercontent.com/u/53093696?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Itamai</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=Itamai\" title=\"Code\">💻</a> <a href=\"https://github.com/Ciphey/Ciphey/issues?q=author%3AItamai\" title=\"Bug reports\">🐛</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-enable -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nEsse projeto segue a especificação [todos contribuidores](https://github.com/all-contributors/all-contributors). Contribuições de qualquer tipo são bem vindas!\n"
  },
  {
    "path": "translations/ru/CODE_OF_CONDUCT.md",
    "content": "<p align=\"center\">\nTranslations <br>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/de/CODE_OF_CONDUCT.md>🇩🇪 DE   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/CODE_OF_CONDUCT.md>🇬🇧 EN   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/hu/CODE_OF_CONDUCT.md>🇭🇺 HU   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/id/CODE_OF_CONDUCT.md>🇮🇩 ID   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/it/CODE_OF_CONDUCT.md>🇮🇹 IT   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/nl/CODE_OF_CONDUCT.md>🇳🇱 NL   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/pt-br/CODE_OF_CONDUCT.md>🇧🇷 PT-BR   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/ru/CODE_OF_CONDUCT.md>🇷🇺 RU   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/zh/CODE_OF_CONDUCT.md>🇨🇳 ZH   </a>\n</p>\n\n# Кодекс поведения участников\n\n## Наши обязательства\n\nВ интересах создания открытой и доброжелательной атмосферы мы, разработчики и соавторы проекта, обязуемся сделать участие в нашем проекте и сообществе свободным от притеснений для всех, независимо от возраста, размеров тела, инвалидности, этнической принадлежности, половых признаков, гендерной идентичности и самовыражения, уровня опыта, образования, социально-экономического статуса, национальности, внешнего вида, расы, религии, сексуальной идентичности и ориентации.\n\n## Наши стандарты\n\nПримеры поведения, способствующего созданию благоприятной среды:\n\n* Использовать приветливый и инклюзивный язык\n* Уважительно относиться к различным точкам зрения и опыту\n* Великодушно принимать конструктивную критику\n* Сосредотачиваться на том, что лучше для сообщества\n* Проявлять эмпатию по отношению к другим членам сообщества\n\nПримеры неприемлемого поведения участников:\n\n* Использование сексуально окрашенного языка или образов, а также нежелательное сексуальное внимание или ухаживания.\n* Троллинг, оскорбительные/уничижительные комментарии, личные или политические нападки\n* Публичные или частные домогательства\n* Публикация чужой частной информации, такой как физический или электронный адрес, без прямого разрешения.\n* Другое поведение, которое можно обоснованно считать неуместным в профессиональной среде.\n\n## Наша ответственность\n\nРуководители проекта несут ответственность за разъяснение стандартов приемлемого поведения и должны предпринимать соответствующие и справедливые меры по исправлению ситуации в случаях неприемлемого поведения.\n\nРазработчики проекта имеют право и несут ответственность за удаление, редактирование или отклонение комментариев, коммитов, кода, правок в Вики, вопросов и других материалов, которые не соответствуют этому Кодексу поведения, или временно или навсегда забанить любого участника за поведение, которое они считают неприемлемым, угрожающим, оскорбительным или вредным.\n\n## Область применения\n\nНастоящий Кодекс поведения применяется как в рамках проекта, так и в общественном пространстве, когда пользователь представляет проект или его сообщество. Примерами представления проекта или сообщества являются использование официального адреса электронной почты проекта, размещение информации через официальный аккаунт в социальных сетях, или выступление в качестве назначенного представителя на онлайн или офлайн мероприятии. Представление проекта может быть определяться и уточняться разработчиками проекта.\n\n## Правоприменение\n\nО случаях оскорбительного, притеснительного или иного неприемлемого поведения можно сообщить, обратившись к команде проекта на имя brandon_skerrit. Все жалобы будут рассмотрены и расследованы, по результатам чего будет принят ответ, который будет сочтен необходимым и соответствующим обстоятельствам. Команда проекта обязуется соблюдать конфиденциальность в отношении лица, сообщившего об инциденте. Более подробная информация о конкретных политиках правоприменения может быть опубликована отдельно.\n\nУчастники проекта, не соблюдающие или недобросовестно выполняющие Кодекс поведения, могут быть подвержены временным или постоянным мерам воздействия, которые определяются руководством проекта.\n\n## Авторстов\n\nНастоящий Кодекс поведения составлен на основе [Contributor Covenant][homepage], версии 1.4, оригинал доступен по ссылке <https://www.contributor-covenant.org/version/1/4/code-of-conduct.html>\n\n[homepage]: https://www.contributor-covenant.org\n\nОтветы на распространенные вопросы о данном кодексе поведения см. <https://www.contributor-covenant.org/faq>\n"
  },
  {
    "path": "translations/ru/CONTRIBUTING.md",
    "content": "<p align=\"center\">\nTranslations <br>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/de/CONTRIBUTING.md>🇩🇪 DE   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/de/CONTRIBUTING.md>🇬🇧 EN   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/hu/CONTRIBUTING.md>🇭🇺 HU   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/id/CONTRIBUTING.md>🇮🇩 ID   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/it/CONTRIBUTING.md>🇮🇹 IT   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/nl/CONTRIBUTING.md>🇳🇱 NL   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/pt-br/CONTRIBUTING.md>🇧🇷 PT-BR   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/ru/CONTRIBUTING.md>🇷🇺 RU   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/zh/CONTRIBUTING.md>🇨🇳 ZH   </a>\n</p>\n\nПривет!\n\nИтак, вы заинтересованы в том, чтобы внести свой вклад в Ciphey? 🤔\n\nМожет быть, ты не совсем уверен, с чего начать. Или, может быть, вы считаете, что ваши навыки программирования \"недостаточно хороши\". Что касается последнего - полная чушь! Мы совсем не против \"плохого кода\". Кроме того, то, что вы читаете этот документ, говорит о том, что вы отличный программист. Ведь в проектах GitHub участвует очень мало новичков. 😉.\n\nВот несколько способов, которыми вы можете внести свой вклад:\n\n- Добавить новый язык 🧏\n- Добавьте больше методов шифрования\n- Доработать документацию (очень важно! Мы будем бесконечно благодарны)\n- Исправить ошибки, представленные через GitHub issues (мы можем поддержать вас в этом 😊)\n- Рефакторинг нашей кодовой базы 🥺\n\nЕсли все это кажется сложным, не волнуйтесь! В этом документе вы узнаете, как достичь любой из этих целей. Кроме того, ваше имя будет добавлено в список соавторов Ciphey, и мы будем вам бесконечно благодарны! 🙏\n\nУ нас есть небольшой чат Discord, где вы можете пообщаться с разработчиками и получить помощь. Кроме того, вы можете написать GitHub issue в отношении вашего предложения. Если вы хотите, чтобы вас добавили в Discord, напишите нам DM или попросите нас как-то иначе.\n\n[Discord Server](https://discord.gg/KfyRUWw)\n\n# Как внести вклад\n\nCiphey всегда нуждается в новых инструментах расшифровки! Чтобы узнать, как интегрировать код в Ciphey, посмотрите:\n\n- <https://github.com/Ciphey/Ciphey/wiki/Adding-your-own-ciphers> - простое руководство\n- <https://github.com/Ciphey/Ciphey/wiki/Extending-Ciphey> - справка по API\n\nБыло бы неплохо, если бы вы написали несколько тестов для своего кода. Это очень просто: скопируйте функцию в **Ciphey/tests/test_main.py** и замените шифрованный текст на что-то, закодированное вашим шифром. Если вы не добавите тесты, мы, вероятно, все равно примем ваш код, но нам будет гораздо труднее диагностировать ошибки!\n\nСамо собой разумеется, что мы добавим вас в список участниуов за вашу тяжелую работу!\n\n## Добавить новый язык 🧏\n\nСтандартная программа проверки языка, `brandon`, работает с несколькими языками. Это может показаться сложным.\nНо, честно говоря, все, что вам нужно сделать, это взять словарь, сделать небольшой анализ (мы написали код, чтобы помочь вам в этом), добавить словари и анализ в репозиторий. А затем добавить опцию в `settings.yml`.\n\n## Доработать документацию\n\nДокументация - самая важная часть Ciphey. Отсутствие документации - это огромный технический долг кода, а мы хотим этого избежать.\n\nПоверьте мне, когда я говорю, что если вы внесете свой вклад в создание отличной документации, вас будут воспринимать на том же уровне, что и авторов кода. Документация абсолютно необходима.\n\nСуществует множество способов добавления документации.\n\n- Строки документации в коде\n- Улучшение нашей текущей документации (README, этот файл, наши страницы Ciphey Wiki)\n- Перевод документации\n\nИ многое другое!\n\n# Исправление ошибок\n\nПосетите нашу страницу проблем на GitHub, чтобы посмотреть все известные ошибки, которые есть в Ciphey! Исправьте их, и вы будете добавлены в список соавторов. ;)\n\n# Рефакторинг кодовой базы\n\nНе весь Ciphey следует PEP8, и часть кода повторяется.\n"
  },
  {
    "path": "translations/ru/README.md",
    "content": "<!-- comunity -->\n<!-- [markdownlint-enable](https://github.com/AABur) -->\n\n<p align=\"center\">\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/de/README.md>🇩🇪 DE   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/README.md>🇬🇧 EN   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/fr/README.md>🇫🇷 FR   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/hu/README.md>🇭🇺 HU   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/id/README.md>🇮🇩 ID   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/it/README.md>🇮🇹 IT   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/nl/README.md>🇳🇱 NL   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/pt-br/README.md>🇧🇷 PT-BR   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/ru/README.md>🇷🇺 RU   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/zh/README.md>🇨🇳 ZH   </a>\n <br><br>\n➡️\n<a href=\"https://github.com/Ciphey/Ciphey/wiki\">Документация</a> |\n<a href=\"https://discord.ciphey.online\">Discord</a> |\n <a href=\"https://github.com/Ciphey/Ciphey/wiki/Installation\">Руководство по установке</a>\n ⬅️\n\n<br>\n  <img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/binoculars.png\" alt=\"Ciphey\">\n</p>\n\n<p align=\"center\">\n  <img alt=\"GitHub commit activity\" src=\"https://img.shields.io/github/commit-activity/m/ciphey/ciphey\">\n<img src=\"https://pepy.tech/badge/ciphey\">\n <img src=\"https://pepy.tech/badge/ciphey/month\">\n  <a href=\"https://discord.gg/wM3scnc\"><img alt=\"Discord\" src=\"https://img.shields.io/discord/728245678895136898\"></a>\n<a href=\"https://pypi.org/project/ciphey/\"><img src=\"https://img.shields.io/pypi/v/ciphey.svg\"></a>\n  <img src=\"https://img.shields.io/badge/License-MIT-yellow.svg\" alt=\"Ciphey\">\n\n  <img src=\"https://github.com/brandonskerritt/Ciphey/workflows/Python%20application/badge.svg?branch=master\" alt=\"Ciphey\">\n<br><br>\nПолностью автоматизированный инструмент для дешифровки/декодирования/взлома, основанный на обработке естественного языка и искусственном интеллекте, и немного на здравом смысле.\n<br><br>\n</p>\n<hr>\n\n## [Руководство по установке](https://github.com/Ciphey/Ciphey/wiki/Installation)\n\n| <p align=\"center\"><a href=\"https://pypi.org/project/ciphey\">🐍 Python                                           | <p align=\"center\"><a href=\"https://hub.docker.com/r/remnux/ciphey\">🐋 Docker (Universal)                        | <p align=\"center\"><a href=\"https://ports.macports.org/port/ciphey/summary\">🍎 MacPorts (macOS)                    | <p align=\"center\"><a href=\"https://formulae.brew.sh/formula/ciphey\">🍺 Homebrew (macOS/Linux)                     |\n| -------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- |\n| <p align=\"center\"><img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/python.png\" /></p> | <p align=\"center\"><img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/docker.png\" /></p> | <p align=\"center\"><img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/macports.png\" /></p> | <p align=\"center\"><img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/homebrew.png\" /></p> |\n| `python3 -m pip install ciphey --upgrade`                                                                      | `docker run -it --rm remnux/ciphey`                                                                            | `sudo port install ciphey`                                                                                       | `brew install ciphey`                                                                                            |\n\n| Linux                                                                                                                   | Mac OS                                                                                                                     | Windows                                                                                                                   |\n| ----------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- |\n| ![GitHub Workflow Status](https://img.shields.io/github/workflow/status/ciphey/ciphey/Python%20application?label=Linux) | ![GitHub Workflow Status](https://img.shields.io/github/workflow/status/ciphey/ciphey/Python%20application?label=Mac%20OS) | ![GitHub Workflow Status](https://img.shields.io/github/workflow/status/ciphey/ciphey/Python%20application?label=Windows) |\n\n<hr>\n\n# 🤔 Что это?\n\nВведите зашифрованный текст, получите расшифрованный текст.\n\n> \"Какой тип шифрования?\"\n\nВ том-то и дело. Ты не знаешь, ты просто знаешь, что это, возможно, зашифровано. Ciphey поможет тебе разобраться.\n\nCiphey может справиться с большинством задач за 3 секунды и даже меньше.\n\n<p align=\"center\" href=\"https://asciinema.org/a/336257\">\n  <img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/index.gif\" alt=\"Ciphey demo\">\n</p>\n\nЦель Ciphey - стать инструментом для автоматизации множества расшифровок и дешифровок, таких как шифрование на нескольких базах, классические шифры, хэши и более сложные криптографии.\n\nЕсли вы не знаете достаточно много о криптографии или хотите быстро проверить зашифрованный текст, прежде чем работать над ним самостоятельно, Ciphey - для вас.\n\n**Техническая часть.** Ciphey использует специально созданный модуль искусственного интеллекта (_AuSearch_) с интерфейсом обнаружения шифров, чтобы приблизительно определить, чем что-то зашифровано. Затем используется собственный настраиваемый интерфейс обработки естественного языка, который может определить, когда полученный зашифрованный текст становится обычным.\n\nЗдесь нет нейронных сетей или раздутого ИИ. Мы используем только то, что быстро и минимально.\n\nИ это только верхушка айсберга. Полное техническое объяснение можно найти в нашей [документации](https://github.com/Ciphey/Ciphey/wiki).\n\n# ✨ Возможности\n\n- Поддерживается **50+ шифров и кодировок**, таких как двоичный код, код Морзе и Base64. Классические шифры, такие как шифр Цезаря, Аффинный шифр и шифр Виженера. А также современные шифры, такие как XOR с повторяющимся ключом и другие. **[Полный список можно посмотреть здесь](https://github.com/Ciphey/Ciphey/wiki/Supported-Ciphers)**\n- **Собственный искусственный интеллект с расширенным поиском (AuSearch) для ответа на вопрос \"какое шифрование использовалось?\"**. В результате расшифровка занимает менее 3 секунд.\n- **Собственный модуль обработки естественного языка** Ciphey может определить, является ли нечто простым текстом или нет. Будь то JSON, CTF-флаг или английский язык, Ciphey может определить это за пару миллисекунд.\n- **Мультиязычная поддержка** _(в настоящее время только немецкий и английский языки (с вариантами AU, UK, CAN, USA))_.\n- **Поддерживает шифрование и хэширование**, которых нет у других продуктов, таких как CyberChef Magic.\n- **[Ядро на C++](https://github.com/Ciphey/CipheyCore)** Работает невероятно быстро.\n\n# 🔭 Ciphey в сравнении с CyberChef\n\n## 🔁 Base64 закодированный 42 раза\n\n<table>\n  <tr>\n  <th>Продукт</th>\n    <th>⚡ Ciphey ⚡ </th>\n    <th>🐢 CyberChef 🐢</th>\n  </tr>\n  <tr>\n  <th>Gif</th>\n    <td><img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/ciphey_gooder_cyberchef.gif\" alt=\"The guy she tells you not to worry about\"></td>\n    <td><img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/not_dying.gif\" alt=\"You\"></td>\n  </tr>\n  <tr>\n  <th>Время</th>\n    <td>2 секунды</td>\n    <td>6 секунд</td>\n  </tr>\n    <tr>\n  <th>Настройка</th>\n    <td><ul><li>Запустите Ciphey с файлом</li></ul></td>\n    <td><ul><li>Установить параметр регекса - \"{\"</li><li>Вам нужно знать, сколько раз нужно выполнить перебор.</li><li>Вы должны заранее знать, что это Base64</li><li>Вы необходимо загрузить CyberChef (это раздутое JS-приложение)</li><li>Знать достаточно о CyberChef, чтобы создать этот пайплайн</li><li>Инвертировать соответствия</li></ul></td>.\n  </tr>\n</table>\n\n<sub><b>Примечание:</b> gif могут загружаться в разное время, поэтому один из них может появиться значительно быстрее другого.</sub><br>\n<sub><b>Примечание о магии:</b> Сильнее всего CyberChef схож с Ciphey операцией Magic. На этих данных Magic мгновенно падает и выходит из строя. Единственный способ заставить CyberChef работать - это вручную задать параметры.</b>.\n\n\nМы также протестировали CyberChef и Ciphey с **файлом размером 6 Гб**. Ciphey взломал его за **5 минут и 54 секунды**. CyberChef потерпел крах, даже не начав работу.\n\n## 📊 Сравнение Ciphey с Katana и CyberChef Magic\n\n| **Продукт**                                           | ⚡ Ciphey ⚡ | 🗡️ Katana 🗡️ | 🐢 CyberChef Magic 🐢 |\n| ----------------------------------------------------- | ---------- | ---------- | ------------------- |\n| Расширенная проверка языка                            | ✅          | ❌          | ✅                   |\n| Поддержка шифрования                                  | ✅          | ✅          | ❌                   |\n| Выпуски, названные в честь антиутопий 🌃               | ✅          | ❌          | ❌                   |\n| Поддержка хеширования                                 | ✅          | ✅          | ❌                   |\n| Простая настройка                                     | ✅          | ❌          | ✅                   |\n| Может предположить использованное средство шифрования | ✅          | ❌          | ❌                   |\n| Создано хакерами для хакеров                          | ✅          | ✅          | ❌                   |\n\n# 🎬 Начало работы\n\nЕсли у вас возникли проблемы с установкой Ciphey, [прочтите это.](https://github.com/Ciphey/Ciphey/wiki/Common-Issues-&-Their-Solutions)\n\n## ‼️ Важные ссылки (Документация, Руководство по установке, Поддержка в Discord)\n\n| Руководство по установке                                                         | Документация                                            | Discord                                    | Docker Image (REMnux)                                                                               |\n| -------------------------------------------------------------------------------- | ------------------------------------------------------- | ------------------------------------------ | --------------------------------------------------------------------------------------------------- |\n| 📖 [Руководство по установке](https://github.com/Ciphey/Ciphey/wiki/Installation) | 📚 [Документация](https://github.com/Ciphey/Ciphey/wiki) | 🦜 [Discord](https://discord.ciphey.online) | 🐋 [Docker Image (REMnux)](https://docs.remnux.org/run-tools-in-containers/remnux-containers#ciphey) |\n\n## 🏃‍♀️Запуск Ciphey\n\nЕсть 3 способа запустить Ciphey:\n\n1. запуск с файлом `ciphey -f encrypted.txt`\n2. запуск с неопределённым текстом `ciphey -- \"Encrypted input\"`\n3. нормальный способ запуска `ciphey -t \"Encrypted input\"`\n\n![Gif, показывающий 3 способа запуска Ciphey](https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/3ways.gif)\n\nЧтобы избавиться от прогресс-баров, таблицы вероятностей и всего шума, используйте тихий режим.\n\n```sh\nciphey -t \"encrypted text here\" -q\n```\n\nЧтобы получить полный список аргументов, запустите `ciphey --help`.\n\n### ⚗️ Импорт Ciphey\n\nВы можете импортировать Ciphey и использовать его в своих собственных программах и коде.\n```python\nfrom Ciphey.__main__ import main\n```\n\n# 🎪 Создатели\n\n**Ciphey** был придуман [Bee](https://github.com/bee-san) в 2008 году и возрожден в 2019 году. **Ciphey** не был бы там, где он сейчас, без [Cyclic3](https://github.com/Cyclic3) - президента [UoL's Cyber Security Society](https://www.cybersoc.cf/).\n\n**Ciphey** был возрожден и воссоздан UoL's Cyber Security Society для использования в CTF. Если вы когда-нибудь будете в Ливерпуле, подумайте о том, чтобы выступить с докладом или стать спонсором наших мероприятий. Напишите нам на `cybersecurity@society.liverpoolguild.org`, чтобы узнать больше 🤠.\n\nОгромная благодарность George H за то, что он придумал, как мы можем использовать правильные алгоритмы для ускорения процесса поиска.\nОтдельное спасибо [varghalladesign](https://www.facebook.com/varghalladesign) за разработку логотипа.\n\n## 🐕‍🦺 [Помощь проекту](https://github.com/Ciphey/Ciphey/wiki/Contributing)\n\nНе бойтесь вносить свой вклад! У нас есть много, много вещей, которые вы можете сделать, чтобы помочь. Каждая из них описана и легко объясняется на примерах. Если вы хотите внести свой вклад, но застряли, напишите GitHub issue укажите @bee-san ✨.\n\nИли присоединитесь к группе Discord и отправьте сообщение там [ссылка на Wiki](https://github.com/Ciphey/Ciphey/wiki/Contributing) или в верхней части этого README в виде бейджика.\n\nПожалуйста, прочитайте [раздел Wiki о помощи проекту](https://github.com/Ciphey/Ciphey/wiki/Contributing) для получения точной информации о том, как внести вклад ✨.\n\nТем самым вы добавите свое имя в README и станете частью постоянно растущего проекта!\n[![starchart.cc](https://starchart.cc/Ciphey/Ciphey.svg)](https://starchart.cc/Ciphey/Ciphey)\n\n## 💰 Финансовая помощь\n\nВзносы будут использованы для финансирования не только будущего Ciphey и его авторов, но и UoL's Cyber Security Society.\n\nGitHub не поддерживает функцию \"спонсируй этот проект, и мы равномерно распределим деньги\", поэтому воспользуйтесь ссылкой, и мы разберемся с этим на нашей стороне 🥰.\n\n## ✨ Авторы\n\nСпасибо этим замечательным людям ([расшифровка emoji](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://github.com/Cyclic3\"><img src=\"https://avatars1.githubusercontent.com/u/15613874?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>cyclic3</b></sub></a><br /><a href=\"#design-cyclic3\" title=\"Design\">🎨</a> <a href=\"#maintenance-cyclic3\" title=\"Maintenance\">🚧</a> <a href=\"https://github.com/Ciphey/Ciphey/commits?author=cyclic3\" title=\"Code\">💻</a> <a href=\"#ideas-cyclic3\" title=\"Ideas, Planning, & Feedback\">🤔</a></td>\n    <td align=\"center\"><a href=\"https://skerritt.blog\"><img src=\"https://avatars3.githubusercontent.com/u/10378052?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Brandon</b></sub></a><br /><a href=\"#design-brandonskerritt\" title=\"Design\">🎨</a> <a href=\"#maintenance-brandonskerritt\" title=\"Maintenance\">🚧</a> <a href=\"https://github.com/Ciphey/Ciphey/commits?author=brandonskerritt\" title=\"Code\">💻</a> <a href=\"#ideas-brandonskerritt\" title=\"Ideas, Planning, & Feedback\">🤔</a></td>\n    <td align=\"center\"><a href=\"https://github.com/michalani\"><img src=\"https://avatars0.githubusercontent.com/u/27767884?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>michalani</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=michalani\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/ashb07\"><img src=\"https://avatars2.githubusercontent.com/u/24845568?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>ashb07</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=ashb07\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/TheAlcanian\"><img src=\"https://avatars3.githubusercontent.com/u/22127191?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Shardion</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/issues?q=author%3ATheAlcanian\" title=\"Bug reports\">🐛</a></td>\n    <td align=\"center\"><a href=\"https://github.com/Bryzizzle\"><img src=\"https://avatars0.githubusercontent.com/u/57810197?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Bryan</b></sub></a><br /><a href=\"#translation-Bryzizzle\" title=\"Translation\">🌍</a> <a href=\"https://github.com/Ciphey/Ciphey/commits?author=Bryzizzle\" title=\"Documentation\">📖</a></td>\n    <td align=\"center\"><a href=\"https://lukasgabriel.net\"><img src=\"https://avatars0.githubusercontent.com/u/52338810?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Lukas Gabriel</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=lukasgabriel\" title=\"Code\">💻</a> <a href=\"https://github.com/Ciphey/Ciphey/issues?q=author%3Alukasgabriel\" title=\"Bug reports\">🐛</a> <a href=\"#translation-lukasgabriel\" title=\"Translation\">🌍</a> <a href=\"#ideas-lukasgabriel\" title=\"Ideas, Planning, & Feedback\">🤔</a></td>\n  </tr>\n  <tr>\n    <td align=\"center\"><a href=\"https://github.com/DarshanBhoi\"><img src=\"https://avatars2.githubusercontent.com/u/70128281?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Darshan</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/issues?q=author%3ADarshanBhoi\" title=\"Bug reports\">🐛</a></td>\n    <td align=\"center\"><a href=\"https://github.com/SkeletalDemise\"><img src=\"https://avatars1.githubusercontent.com/u/29117662?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>SkeletalDemise</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=SkeletalDemise\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://www.patreon.com/cclauss\"><img src=\"https://avatars3.githubusercontent.com/u/3709715?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Christian Clauss</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=cclauss\" title=\"Code\">💻</a> <a href=\"https://github.com/Ciphey/Ciphey/issues?q=author%3Acclauss\" title=\"Bug reports\">🐛</a></td>\n    <td align=\"center\"><a href=\"http://machinexa.xss.ht\"><img src=\"https://avatars1.githubusercontent.com/u/60662297?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Machinexa2</b></sub></a><br /><a href=\"#content-machinexa2\" title=\"Content\">🖋</a></td>\n    <td align=\"center\"><a href=\"https://github.com/anantverma275\"><img src=\"https://avatars1.githubusercontent.com/u/18184503?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Anant Verma</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=anantverma275\" title=\"Code\">💻</a> <a href=\"https://github.com/Ciphey/Ciphey/issues?q=author%3Aanantverma275\" title=\"Bug reports\">🐛</a></td>\n    <td align=\"center\"><a href=\"https://github.com/XVXTOR\"><img src=\"https://avatars1.githubusercontent.com/u/40268197?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>XVXTOR</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=XVXTOR\" title=\"Documentation\">📖</a></td>\n    <td align=\"center\"><a href=\"https://github.com/Itamikame\"><img src=\"https://avatars2.githubusercontent.com/u/59034423?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Itamikame</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=Itamikame\" title=\"Code\">💻</a></td>\n  </tr>\n  <tr>\n    <td align=\"center\"><a href=\"https://github.com/MikeMerz\"><img src=\"https://avatars3.githubusercontent.com/u/50526795?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>MikeMerz</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=MikeMerz\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/jacobggman\"><img src=\"https://avatars2.githubusercontent.com/u/30216976?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Jacob Galam</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=jacobggman\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://tuxthexplorer.github.io/\"><img src=\"https://avatars1.githubusercontent.com/u/37508897?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>TuxTheXplorer</b></sub></a><br /><a href=\"#translation-TuxTheXplorer\" title=\"Translation\">🌍</a></td>\n    <td align=\"center\"><a href=\"https://github.com/Itamai\"><img src=\"https://avatars3.githubusercontent.com/u/53093696?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Itamai</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=Itamai\" title=\"Code\">💻</a> <a href=\"https://github.com/Ciphey/Ciphey/issues?q=author%3AItamai\" title=\"Bug reports\">🐛</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-enable -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nЭтот проект следует спецификации [all-contributors](https://github.com/all-contributors/all-contributors). Вклад любого рода приветствуется!\n"
  },
  {
    "path": "translations/th/CODE_OF_CONDUCT.md",
    "content": "<p align=\"center\">\nการแปล <br>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/de/README.md>🇩🇪 DE   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/fr/README.md>🇫🇷 FR   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/hu/README.md>🇭🇺 HU   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/id/README.md>🇮🇩 ID   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/it/README.md>🇮🇹 IT   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/nl/README.md>🇳🇱 NL   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/pt-br/README.md>🇧🇷 PT-BR   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/ru/README.md>🇷🇺 RU   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/zh/README.md>🇨🇳 ZH   </a>\n<a href=\"https://github.com/Ciphey/Ciphey/tree/master/translations/th/README.md\">🇹🇭 TH   </a>\n</p>\n\nหลักจรรยาบรรณของข้อตกลงผู้ร่วมให้ข้อมูล\n\n## คำมั่นสัญญาของเรา\n\nเพื่อสร้างบรรยากาศที่เปิดกว้างและเป็นสิ่งที่เป็นมิตรต่อผู้ร่วมโครงการและชุมชนของเรา เราภาคผู้ร่วมและผู้รักษาความสะดวกสบายของเรา ขอสานักการเข้าร่วมโครงการของเราและชุมชนของเราให้เป็นประสบการณ์ที่ไม่มีการรบกวนสำหรับทุกคน ไม่ว่าจะเป็นอายุ ขนาดร่างกาย ความพิการ เชื้อชาติ ลักษณะทางเพศ เพศและออกแบบ เรื่องระดับความชำนาญ การศึกษา สถานะทางเศรษฐกิจ สัญชาติ ลักษณะภายนอกส่วนบุคคล เช่นการปรากฏตัว กลุ่มชน ศาสนา หรือเพศและเพศสัมพันธ์\n\n## มาตรฐานของเรา\n\nตัวอย่างพฤติกรรมที่เป็นประโยชน์เพื่อสร้างสภาพแวดล้อมที่เชิดชู:\n\n- ใช้ภาษาที่เปิดกว้างและเป็นมิตร\n- เคารพความคิดต่างกันและประสบการณ์ที่แตกต่างกัน\n- ยอมรับคำวิจารณ์ที่สร้างสรรค์ได้อย่างสงบสุข\n- ให้ความสำคัญกับสิ่งที่ดีที่สุดสำหรับชุมชน\n- แสดงความเห็นอกหักใจต่อสมาชิกอื่นในชุมชน\n\nตัวอย่างของพฤติกรรมที่ไม่ยอมรับโดยผู้ร่วม:\n\n- ใช้ภาษาหรือภาพลางรูปทางเพศและความสนใจทางเพศที่ไม่เหมาะสมและความสนใจทางเพศที่ไม่เหมาะสม\n- การแสดงพูดด่า ความเหยียดหยาม และการโจมตีส่วนตัวหรือการโจมตีทางการเมือง\n- การรังเกียจและการล่วงละเมิดทางสาธารณะหรือทางส่วนตัว\n- เผยแพร่ข้อมูลส่วนตัวของผู้อื่น เช่นที่อยู่ทางกายหรือทางอิเล็กทรอนิกส์โดยไม่ได้รับอนุญาตโดยชัดแจ้ง\n- พฤติกรรมอื่นที่สามารถถือว่าไม่เหมาะสมในการตั้งค่าองค์ก\n\n## ความรับผิดชอบของเรา\n\nผู้รักษาโครงการมีความรับผิดชอบในการแจ้งกำหนดมาตรฐานของพฤติกรรมที่ยอมรับได้อย่างชัดเจน และคาดหวังว่าจะดำเนินการแก้ไขที่เหมาะสมและเป็นธรรมต่อกรณีใดกรณีหนึ่งที่พฤติกรรมที่ไม่ยอมรับเกิดขึ้น\n\nผู้รักษาโครงการมีสิทธิและมีความรับผิดชอบในการลบหรือปฏิเสธความคิดเห็น เซอร์วิส รหัส การแก้ไขวิกิ ปัญหา และการมีส่วนร่วมอื่นๆ ซึ่งไม่สอดคล้องกับหลักนี้ หรือแบนชั่วคราวหรือถาวรนักมีพฤติกรรมอื่นที่พวกเขาถือว่าไม่เหมาะสม ซึ่งอาจเป็นการก่อให้เกิดความเสี่ยง ทุกประการ ที่พวกเขาถือว่าไม่เหมาะสม ที่พวกเขาพิจารณาเหมาะสม ที่กรรมการโครงการจะตัดสินใจในเรื่องของความเสี่ยง การรุกราน การทำให้เกิดความเสียหายหรือความเจ็บป่วย\n\n## ขอบเขต\n\nรหัสจริยธรรมนี้ใช้กับทั้งในพื้นที่โครงการและในพื้นที่สาธารณะเมื่อบุคคลรายบุคคลแสดงตัวเป็นโครงการหรือชุมชน เช่นการใช้ที่อยู่อีเมลโครงการทางการโพสต์ผ่านทางบัญชีโซเชียลมีเดียทางการหรือการเป็นตัวแทนที่ได้รับการแต่งตั้งในเหตุการณ์ออนไลน์หรือแบบออฟไลน์ การแสดงตัวของโครงการอาจถูกกำหนดและระบุโดยผู้รักษาโครงการอีกต่อไป\n\n## การบังคับใช้\n\nกรณีที่มีพฤติกรรมที่ไม่เหมาะสม มีการล่วงละเมิดหรือพฤติกรรมที่ไม่ยอมรับอื่น สามารถรายงานได้โดยติดต่อทีมโครงการที่ brandon_skerrit. รายงานทั้งหมดจะถูกตรวจสอบและตรวจสอบ และจะได้รับการตอบสนองที่ถูกต้องและเหมาะสมตามสถานการณ์ ทีมโครงการมีหน้าที่รักษาความลับเกี่ยวกับผู้รายงานเหตุการณ์เป็นสิ่งที่เป็นปกติ รายละเอียดเพิ่มเติมเกี่ยวกับนโยบายการบังคับใช้เฉพาะได้รับการโพสต์แยกต่างหาก\n\nผู้รักษาโครงการที่ไม่ปฏิบัติตามหรือประพฤติตนไม่ด้วยความสุจริตตามข้อกำหนดของจรรยธรรมอาจเผชิญความผิดร่วมเกณฑ์ชั่วคราวหรือถาวรตามที่สมาชิกผู้นำโครงการกำหนด\n\n## การกำหนดเครดิต\n\nหลักจรรยาบรรณนี้ได้รับการปรับปรุงจาก [Contributor Covenant][homepage] เวอร์ชัน 1.4\nที่มีอยู่ที่ <https://www.contributor-covenant.org/version/1/4/code-of-conduct.html>\n\n[homepage]: https://www.contributor-covenant.org\n\nสำหรับคำตอบสำหรับคำถามที่พบบ่อยเกี่ยวกับหลักจรรยาบรรณนี้ ดู\n<https://www.contributor-covenant.org/faq>\n"
  },
  {
    "path": "translations/th/CONTRIBUTING.md",
    "content": "<p align=\"center\">\nการแปล <br>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/de/README.md>🇩🇪 DE   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/fr/README.md>🇫🇷 FR   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/hu/README.md>🇭🇺 HU   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/id/README.md>🇮🇩 ID   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/it/README.md>🇮🇹 IT   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/nl/README.md>🇳🇱 NL   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/pt-br/README.md>🇧🇷 PT-BR   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/ru/README.md>🇷🇺 RU   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/zh/README.md>🇨🇳 ZH   </a>\n<a href=\"https://github.com/Ciphey/Ciphey/tree/master/translations/th/README.md\">🇹🇭 TH   </a>\n</p>\n\nสวัสดี!\n\nดังนั้นคุณสนใจที่จะช่วยเสริมสร้าง Ciphey ใช่ไหม? 🤔\n\nบางทีคุณอาจงงว่าจะเริ่มต้นที่ไหนหรือคุณอาจเชื่อว่าทักษะการเขียนโค้ดของคุณไม่เพียงพอ? เรื่องหลังนั้นไม่มีความเห็น! เรายินดีที่ได้รับ \"โค้ดที่ไม่ดี\" และถ้าคุณกำลังอ่านเอกสารนี้ คุณน่าจะเป็นโปรแกรมเมอร์ที่ยอดเยี่ยม คนใหม่ไม่ค่อยเรียนรู้วิธีการมีส่วนร่วมในโปรเจ็กต์ GitHub บ่อยครั้ง 😉\n\nนี่คือวิธีบางอย่างที่คุณสามารถมีส่วนร่วมกับ Ciphey ได้:\n\n- เพิ่มภาษาใหม่ 🧏\n- เพิ่มวิธีการเข้ารหัสเพิ่มเติม 📚\n- สร้างเอกสารเพิ่มเติม (สำคัญมาก! เราจะยินดีแหล่งกับนี้ได้)\n- แก้ไขข้อบกพร่องที่ส่งผ่าน GitHub issues (เราสามารถสนับสนุนคุณในสิ่งนี้ได้ 😊)\n- ทำการระบบโค้ดใหม่ 🥺\n\nหากเหล่านี้ดูยาก ไม่ต้องกังวล! เอกสารนี้จะแนะนำวิธีที่แน่นอนสำหรับการทำให้สามารถทำได้ นอกจากนี้ ชื่อของคุณจะถูกเพิ่มในรายชื่อผู้มีส่วนร่วมของ Ciphey และเราจะเป็นอย่างยิ่งที่จะดนตรีของคุณ! 🙏\n\nเรามีแชท Discord เล็ก ๆ เพื่อให้คุณสามารถสนทนากับนักพัฒนาและรับความช่วยเหลือ หรือถ้าคุณต้องการให้เราเพิ่มคุณใน Discord กรุณาส่งข้อความส่วนตัวหรือถามเราในวิธีอื่น ๆ\n\n[Discord Server](https://discord.gg/KfyRUWw)\n\n# วิธีการร่วมสนุก\n\nCiphey ต้องการเครื่องมือถอดรหัสเพิ่มเติมเสมอ! หากต้องการเรียนรู้วิธีการรวมรหัสเข้ากับ Ciphey โปรดดูที่:\n\n- <https://github.com/Ciphey/Ciphey/wiki/Adding-your-own-ciphers> สำหรับบทแนะนำที่เรียบง่าย\n- <https://github.com/Ciphey/Ciphey/wiki/Extending-Ciphey> สำหรับ API reference\n\nหากคุณสร้างฟังก์ชันใหม่ ๆ โปรดเขียนการทดสอบสำหรับมัน โดยเพียงแค่คัดลอกฟังก์ชันในไฟล์ Ciphey/tests/test_main.py และแทนที่ข้อความที่เข้ารหัสด้วยรหัสของคุณ หากคุณไม่เพิ่มการทดสอบเราอาจจะรวมมัน แต่มันจะยากมากที่เราจะแก้ไขข้อบกพร่อง!\n\nไม่ต้องกล่าวถึงเราจะเพิ่มชื่อของคุณในรายการผู้มีส่วนร่วมสำหรับงานที่ทำหนักของคุณ!\n\n# เพิ่มภาษาใหม่ 🧏\n\nตัวตรวจสอบภาษาเริ่มต้นชื่อ `brandon` ใช้งานกับภาษาหลายภาษา อาจจะฟังเสียหน่อยเมื่อฟัง แต่ในความจริงแล้วทุกอย่างที่คุณต้องทำคือนำพจนานุกรมมาบางส่วน ทำการวิเคราะห์เล็กน้อย (เราเขียนโค้ดเพื่อช่วยคุณในส่วนนี้) เพิ่มพจนานุกรมและการวิเคราะห์ลงในเรปอีกที แล้วเพิ่มตัวเลือกในไฟล์ `settings.yml`\n\n# สร้างเอกสารเพิ่มเติม\n\nเอกสารเป็นส่วนสำคัญที่สุดของ Ciphey ไม่มีเอกสารคือหนี้สินที่สุดเยี่ยงใด และเราไม่ต้องการสิ่งนั้น\n\nเชื่อฉันเมื่อฉันพูดว่าหากคุณมีส่วนร่วมในเอกสารที่ยอดเยี่ยมคุณจะถูกพิจารณาในระดับเดียวกันกับผู้มีส่วนร่วมในโค้ด การเพิ่มเอกสารมีความสำคัญอย่างยิ่ง\n\nมีหลายวิธีที่คุณสามารถเพิ่มเอกสารได้\n\n- ตรรกะข้อความในโค้ด\n- ปรับปรุงเอกสารปัจจุบันของเรา (README, ไฟล์นี้, หน้าวิกิ Ciphey ของเรา)\n- แปลเอกสาร\n\nและอื่น ๆ อีกมากมาย!\n\n# แก้ไขข้อบกพร่อง\n\nเยี่ยมชมหน้า GitHub issues เพื่อหาข้อบกพร่องทั้งหมดที่ Ciphey มี! แก้ไขและคุณจะถูกเพิ่มในรายชื่อผู้มีส่วนร่วม ;)\n\n# ทำการระบบโค้ดใหม่\n\nไม่ใช่ทั้งหมดของ Ciphey ที่ปฏิบัติตาม PEP8 และบางส่วนของโค้ดทำซ้ำกัน\n"
  },
  {
    "path": "translations/th/README.md",
    "content": "<p align=\"center\">\nการแปล <br>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/de/README.md>🇩🇪 DE   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/fr/README.md>🇫🇷 FR   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/hu/README.md>🇭🇺 HU   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/id/README.md>🇮🇩 ID   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/it/README.md>🇮🇹 IT   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/nl/README.md>🇳🇱 NL   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/pt-br/README.md>🇧🇷 PT-BR   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/ru/README.md>🇷🇺 RU   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/zh/README.md>🇨🇳 ZH   </a>\n<a href=\"https://github.com/Ciphey/Ciphey/tree/master/translations/th/README.md\">🇹🇭 TH   </a>\n <br><br>\n➡️\n<a href=\"https://github.com/Ciphey/Ciphey/wiki\">เอกสาร</a> |\n<a href=\"https://discord.gg/zYTM3rZM4T\">Discord</a> |\n <a href=\"https://github.com/Ciphey/Ciphey/wiki/Installation\">คู่มือการติดตั้ง</a> |\n ⬅️\n\n<br>\n  <img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/binoculars.png\" alt=\"Ciphey\">\n</p>\n\n<p align=\"center\">\n<img src=\"https://pepy.tech/badge/ciphey\">\n <img src=\"https://pepy.tech/badge/ciphey/month\">\n  <a href=\"https://discord.gg/zYTM3rZM4T\"><img alt=\"Discord\" src=\"https://img.shields.io/discord/754001738184392704\"></a>\n<a href=\"https://pypi.org/project/ciphey/\"><img src=\"https://img.shields.io/pypi/v/ciphey.svg\"></a>\n  <img src=\"https://img.shields.io/badge/License-MIT-yellow.svg\" alt=\"Ciphey\">\n\n<br>\nเครื่องมือถอดรหัส/ถอดรหัส/แฮ็กโค้ดอัตโนมัติโดยใช้การประมวลผลภาษาธรรมชาติและปัญญาประดิษฐ์พร้อมกับบางสิ่งที่เป็นสาธารณะ\n</p>\n<hr>\n\n## [คู่มือการติดตั้ง](https://github.com/Ciphey/Ciphey/wiki/Installation)\n\n| <p align=\"center\"><a href=\"https://pypi.org/project/ciphey\">🐍 Python                                          | <p align=\"center\"><a href=\"https://hub.docker.com/r/remnux/ciphey\">🐋 Docker (Universal)                       | <p align=\"center\"><a href=\"https://ports.macports.org/port/ciphey/summary\">🍎 MacPorts (macOS)                   | <p align=\"center\"><a href=\"https://formulae.brew.sh/formula/ciphey\">🍺 Homebrew (macOS/Linux)                    |\n| -------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- |\n| <p align=\"center\"><img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/python.png\" /></p> | <p align=\"center\"><img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/docker.png\" /></p> | <p align=\"center\"><img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/macports.png\" /></p> | <p align=\"center\"><img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/homebrew.png\" /></p> |\n| `python3 -m pip install ciphey --upgrade`                                                                      | `docker run -it --rm remnux/ciphey`                                                                            | `sudo port install ciphey`                                                                                       | `brew install ciphey`                                                                                            |\n\n| Linux                                                                                                                   | Mac OS                                                                                                                     | Windows                                                                                                                   |\n| ----------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- |\n| ![GitHub Workflow Status](https://img.shields.io/github/workflow/status/ciphey/ciphey/Python%20application?label=Linux) | ![GitHub Workflow Status](https://img.shields.io/github/workflow/status/ciphey/ciphey/Python%20application?label=Mac%20OS) | ![GitHub Workflow Status](https://img.shields.io/github/workflow/status/ciphey/ciphey/Python%20application?label=Windows) |\n\n<hr>\n\n# 🤔 นี่คืออะไร?\n\nใส่ข้อความที่ถูกเข้ารหัสแล้วได้ข้อความที่ถอดรหัสแล้วกลับมา\n\n> \"การเข้ารหัสประเภทใด?\"\n\nนั่นคือจุดประสงค์ คุณไม่รู้ คุณแค่รู้ว่ามันเป็นไปได้ที่จะถูกเข้ารหัส Ciphey จะค้นหาสำหรับคุณ\n\nCiphey สามารถแก้ไขสิ่งที่ซับซ้อนได้ในเวลาไม่เกิน 3 วินาที\n\n<p align=\"center\" href=\"https://asciinema.org/a/336257\">\n  <img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/index.gif\" alt=\"Ciphey demo\">\n</p>\n\nCiphey เป็นเครื่องมือที่มีจุดมุ่งหมายเพื่ออัตโนมัติการถอดรหัสและการถอดรหัสหลายอย่างเช่นการเข้ารหัสฐานหลายรูปแบบ, รหัสคลาสสิก, แฮชหรือการเข้ารหัสที่ซับซ้อนมากขึ้น\n\nถ้าคุณไม่รู้จักการเข้ารหัสมากนักหรือคุณต้องการตรวจสอบข้อความที่ถูกเข้ารหัสก่อนที่จะทำงานด้วยตัวคุณเอง Ciphey ก็เหมาะกับคุณ\n\n**ส่วนทางเทคนิค** Ciphey ใช้โมดูลปัญญาประดิษฐ์ที่สร้างขึ้นเอง (_AuSearch_) พร้อมกับ _Cipher Detection Interface_ เพื่อประมาณว่าสิ่งที่ถูกเข้ารหัสด้วยอะไร และจากนั้นมี _Language Checker Interface_ ที่สร้างขึ้นเอง สามารถตรวจสอบได้ว่าข้อความที่กำหนดเป็นข้อความธรรมดาหรือไม่\n\nไม่มีเครือข่ายประสาทเทียมหรือ AI ที่ขนาดใหญ่อีกต่อไป เราใช้เฉพาะสิ่งที่เร็วและมีขนาดเล็ก\n\nและนั่นเป็นแค่ปลายของไอซ์เบิร์ก สำหรับคำอธิบายทางเทคนิคทั้งหมด โปรดดูที่ [เอกสาร](https://github.com/Ciphey/Ciphey/wiki).\n\n# ✨ คุณสมบัติ\n\n- **รองรับการเข้ารหัส/การเข้ารหัส 50+ รูปแบบ** เช่น ไบนารี, โมร์สโค้ด และเบส64 รหัสคลาสสิกเช่นรหัสซีซาร์, รหัสแอฟฟินและรหัสวิจิเนร์ พร้อมกับการเข้ารหัสที่ทันสมัยเช่นการเข้ารหัส XOR แบบทำซ้ำและอื่น ๆ **[สำหรับรายการเต็ม ๆ คลิกที่นี่](https://github.com/Ciphey/Ciphey/wiki/Supported-Ciphers)**\n- **ปัญญาประดิษฐ์ที่สร้างขึ้นเองพร้อมกับการค้นหาเพิ่มเติม (AuSearch) เพื่อตอบคำถาม \"การเข้ารหัสที่ใช้?\"** ส่งผลให้การถอดรหัสใช้เวลาน้อยกว่า 3 วินาที\n- **โมดูลประมวลผลภาษาธรรมชาติที่สร้างขึ้นเอง** Ciphey สามารถระบุว่าสิ่งใดเป็นข้อความธรรมดาหรือไม่ ไม่ว่าข้อความธรรมดานั้นจะเป็น JSON, ธง CTF หรือภาษาอังกฤษ Ciphey ก็สามารถทำได้ในไม่กี่มิลลิวินาที\n- **รับรองหลายภาษา** ณ ปัจจุบัน มีเพียงภาษาเยอรมันและภาษาอังกฤษ (พร้อม AU, UK, CAN, USA variants)\n- **รองรับการเข้ารหัสและการเข้ารหัส** ซึ่งเครื่องมือทดแทนเช่น CyberChef Magic ไม่รองรับ\n- **[C++ core](https://github.com/Ciphey/CipheyCore)** ทำงานเร็วเหมือนแสง\n\n# 🔭 Ciphey เทียบกับ CyberChef\n\n## 🔁 Base64 ถูกเข้ารหัส 42 ครั้ง\n\n<table>\n  <tr>\n  <th>ชื่อ</th>\n    <th>⚡ Ciphey ⚡ </th>\n    <th>🐢 CyberChef 🐢</th>\n  </tr>\n  <tr>\n  <th>ภาพเคลื่อนไหว</th>\n    <td><img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/ciphey_gooder_cyberchef.gif\" alt=\"The guy she tells you not to worry about\"></td>\n    <td><img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/not_dying.gif\" alt=\"You\"></td>\n  </tr>\n  <tr>\n  <th>เวลา</th>\n    <td>2 seconds</td>\n    <td>6 seconds</td>\n  </tr>\n    <tr>\n  <th>การติดตั้ง</th>\n    <td><ul><li>รัน ciphey บนไฟล์</li></ul></td>\n    <td><ul><li>ตั้งค่าพารามิเตอร์ regex เป็น \"{\"</li><li>คุณต้องรู้ว่าจะต้องทำซ้ำกี่ครั้ง</li><li>คุณต้องรู้ว่ามันเป็น Base64 ตลอด</li><li>คุณต้องโหลด CyberChef (มันเป็นแอป JS ที่อ้วน)</li><li>รู้จักกับ CyberChef เพียงพอที่จะสร้างท่อนี้</li><li>กลับด้านการจับคู่</li></ul></td>\n  </tr>\n</table>\n\n<sub><b>หมายเหตุ</b> ภาพเคลื่อนไหวอาจโหลดในเวลาที่แตกต่างกันดังนั้นอาจมีหนึ่งภาพเคลื่อนไหวที่ดูเร็วกว่าอีกภาพเคลื่อนไหวหนึ่ง</sub><br>\n<sub><b>หมายเหตุเกี่ยวกับ magic</b> คุณลักษณะที่คล้ายกันที่สุดของ CyberChef กับ Ciphey คือ Magic แต่ Magic ล้มเหลวทันทีในข้อมูลนี้และล้มเหลว วิธีเดียวที่เราสามารถบังคับ CyberChef ให้แข่งขันได้คือการกำหนดค่าด้วยตนเอง</sub>\n\nเราทดสอบ CyberChef และ Ciphey ด้วย **ไฟล์ขนาด 6gb** Ciphey แฮ็กเข้ารหัสได้ใน **5 นาที 54 วินาที** CyberChef ล้มเหลวก่อนที่จะเริ่มต้น\n\n## 📊 Ciphey เทียบกับ Katana และเทียบกับ CyberChef Magic\n\n| **Name**                                      | ⚡ Ciphey ⚡ | 🗡️ Katana 🗡️ | 🐢 CyberChef Magic 🐢 |\n| --------------------------------------------- | ------------ | ------------ | --------------------- |\n| ตรวจสอบภาษาขั้นสูง                            | ✅           | ❌           | ✅                    |\n| รองรับการเข้ารหัส                             | ✅           | ✅           | ❌                    |\n| การเผยแพร่ที่มีชื่อตามธีมที่เป็น Dystopian 🌃 | ✅           | ❌           | ❌                    |\n| รองรับการ hash                                | ✅           | ✅           | ❌                    |\n| ง่ายต่อการติดตั้ง                             | ✅           | ❌           | ✅                    |\n| สามารถคาดเดาสิ่งที่เข้ารหัสด้วย               | ✅           | ❌           | ❌                    |\n| ถูกสร้างขึ้นโดยนักแฮ็กเกอร์สำหรับนักแฮ็กเกอร์ | ✅           | ❌           | ❌                    |\n\n# 🎬 เริ่มต้นการใช้งาน\n\nถ้าคุณมีปัญหาในการติดตั้ง Ciphey โปรด[อ่านนี้](https://github.com/Ciphey/Ciphey/wiki/Common-Issues-&-Their-Solutions)\n\n## !! ลิงก์สำคัญ (เอกสาร, คู่มือการติดตั้ง, การสนับสนุนผ่าน Discord)\n\n| คู่มือการติดตั้ง                                                          | เอกสาร                                             | Discord                                     | Docker Image (from REMnux)                                                                   |\n| ------------------------------------------------------------------------- | -------------------------------------------------- | ------------------------------------------- | -------------------------------------------------------------------------------------------- |\n| 📖 [คู่มือการติดตั้ง](https://github.com/Ciphey/Ciphey/wiki/Installation) | 📚 [เอกสาร](https://github.com/Ciphey/Ciphey/wiki) | 🦜 [Discord](https://discord.gg/zYTM3rZM4T) | 🐋 [เอกสาร Docker](https://docs.remnux.org/run-tools-in-containers/remnux-containers#ciphey) |\n\n## 🏃‍♀️ การรัน Ciphey\n\nมีวิธีการรัน Ciphey 3 วิธี\n\n1. รับข้อมูลจากไฟล์ `ciphey -f encrypted.txt`\n2. รับข้อมูลจากคำสั่ง `ciphey -- \"Encrypted input\"`\n3. วิธีปกติ `ciphey -t \"Encrypted input\"`\n\n![ภาพเคลื่อนไหวที่แสดงวิธีการรัน Ciphey 3 วิธี](https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/3ways.gif)\n\nถ้าคุณต้องการที่จะกำจัดแถบความคืบหน้า ตารางความน่าจะเป็น และเสียงรบกวนทั้งหมดให้ใช้โหมดเงียบ\n\n`ciphey -t \"encrypted text here\" -q`\n\nสำรหับการรับรายการเต็มของอาร์กิวเมนต์ ให้รัน `ciphey --help`\n\n### ⚗️ การนำเข้า Ciphey\n\nคุณสามารถนำเข้า Ciphey และใช้ในโปรแกรมและโค้ดของคุณเองได้ `from Ciphey.__main__ import main`\n\n# 🎪 ผู้ร่วมพัฒนา\n\nCiphey ถูกสร้างขึ้นโดย [Bee](https://github.com/bee-san) ในปีค.ศ. 2008 และถูกสร้างขึ้นใหม่ในปีค.ศ. 2019 Ciphey จะไม่ได้อยู่ที่ที่นี่วันนี้หากไม่มี [Cyclic3](https://github.com/Cyclic3) - ประธานสมาคมความปลอดภัยไซเบอร์ของ UoL\n\nCiphey ถูกสร้างขึ้นใหม่และสร้างขึ้นใหม่โดย [Cyber Security Society](https://www.cybersoc.cf/) สำหรับการใช้ใน CTFs หากคุณอยู่ในลิเวอร์พูล โปรดพิจารณาให้การสนทนาหรือสปอนเซอร์กิจกรรมของเรา ส่งอีเมลถึงเราที่ `cybersecurity@society.liverpoolguild.org` เพื่อหาข้อมูลเพิ่มเติม 🤠\n\n**เครดิตรายหลัก** ถึง George H สำหรับการทำงานออกว่าเราสามารถใช้อัลกอริทึมที่เหมาะสมเพื่อเพิ่มความเร็วในการค้นหา\n**ขอขอบคุณเป็นพิเศษ** ถึง [varghalladesign](https://www.facebook.com/varghalladesign) สำหรับการสนับสนุนและการสนับสนุนที่ยอดเยี่ยม\n\n## 🐕‍🦺 [การร่วมมือ](https://github.com/Ciphey/Ciphey/wiki/Contributing)\n\nอย่ากลัวที่จะร่วมมือ! เรามีสิ่งมากมายที่คุณสามารถทำเพื่อช่วยเหลือ แต่ละสิ่งที่มีป้ายชื่อและอธิบายได้อย่างง่ายดายด้วยตัวอย่าง หากคุณพยายามที่จะร่วมมือแต่ติดอยู่ แท็ก @bee-san ✨\n\nหรือจะเข้าร่วมกลุ่ม Discord และส่งข้อความไปที่นั่น (ลิงก์ใน [ไฟล์การร่วมมือ](https://github.com/Ciphey/Ciphey/wiki/Contributing)) หรือที่ด้านบนของ README นี้เป็นตัวแทน\n\nโปรดอ่าน[ไฟล์การร่วมมือ](https://github.com/Ciphey/Ciphey/wiki/Contributing) เพื่อดูรายละเอียดที่แน่นอนเกี่ยวกับวิธีการร่วมมือ ✨\n\nโดยการทำเช่นนั้นคุณจะได้รับการเพิ่มชื่อของคุณไปยัง README ด้านล่างและได้เป็นส่วนหนึ่งของโครงการที่เติบโตอย่างต่อเนื่อง!\n[![Stargazers over time](https://starchart.cc/Ciphey/Ciphey.svg)](https://starchart.cc/Ciphey/Ciphey)\n\n## 💰 ผู้สนับสนุนทางการเงิน\n\nการสนับสนุนจะถูกใช้เพื่อสนับสนุนไม่เพียงอนาคตของ Ciphey และผู้เขียนของมัน แต่ยังสนับสนุน Cyber Security Society ที่มหาวิทยาลัยลิเวอร์พูล\n\nGitHub ยังไม่รองรับ \"สปอนเซอร์โปรเจกต์นี้และเราจะแจกเงินไปทั่วไป\" ดังนั้นเลือกลิงก์และเราจะจัดการให้ 🥰\n\n## ✨ ผู้ร่วมมือ\n\nขอบคุณคนที่ยอดเยี่ยมเหล่านี้ ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://github.com/Cyclic3\"><img src=\"https://avatars1.githubusercontent.com/u/15613874?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>cyclic3</b></sub></a><br /><a href=\"#design-cyclic3\" title=\"Design\">🎨</a> <a href=\"#maintenance-cyclic3\" title=\"Maintenance\">🚧</a> <a href=\"https://github.com/Ciphey/Ciphey/commits?author=cyclic3\" title=\"Code\">💻</a> <a href=\"#ideas-cyclic3\" title=\"Ideas, Planning, & Feedback\">🤔</a></td>\n    <td align=\"center\"><a href=\"https://skerritt.blog\"><img src=\"https://avatars3.githubusercontent.com/u/10378052?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Brandon</b></sub></a><br /><a href=\"#design-brandonskerritt\" title=\"Design\">🎨</a> <a href=\"#maintenance-brandonskerritt\" title=\"Maintenance\">🚧</a> <a href=\"https://github.com/Ciphey/Ciphey/commits?author=brandonskerritt\" title=\"Code\">💻</a> <a href=\"#ideas-brandonskerritt\" title=\"Ideas, Planning, & Feedback\">🤔</a></td>\n    <td align=\"center\"><a href=\"https://github.com/michalani\"><img src=\"https://avatars0.githubusercontent.com/u/27767884?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>michalani</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=michalani\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/ashb07\"><img src=\"https://avatars2.githubusercontent.com/u/24845568?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>ashb07</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=ashb07\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/TheAlcanian\"><img src=\"https://avatars3.githubusercontent.com/u/22127191?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Shardion</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/issues?q=author%3ATheAlcanian\" title=\"Bug reports\">🐛</a></td>\n    <td align=\"center\"><a href=\"https://github.com/Bryzizzle\"><img src=\"https://avatars0.githubusercontent.com/u/57810197?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Bryan</b></sub></a><br /><a href=\"#translation-Bryzizzle\" title=\"Translation\">🌍</a> <a href=\"https://github.com/Ciphey/Ciphey/commits?author=Bryzizzle\" title=\"Documentation\">📖</a></td>\n    <td align=\"center\"><a href=\"https://lukasgabriel.net\"><img src=\"https://avatars0.githubusercontent.com/u/52338810?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Lukas Gabriel</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=lukasgabriel\" title=\"Code\">💻</a> <a href=\"https://github.com/Ciphey/Ciphey/issues?q=author%3Alukasgabriel\" title=\"Bug reports\">🐛</a> <a href=\"#translation-lukasgabriel\" title=\"Translation\">🌍</a> <a href=\"#ideas-lukasgabriel\" title=\"Ideas, Planning, & Feedback\">🤔</a></td>\n  </tr>\n  <tr>\n    <td align=\"center\"><a href=\"https://github.com/DarshanBhoi\"><img src=\"https://avatars2.githubusercontent.com/u/70128281?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Darshan</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/issues?q=author%3ADarshanBhoi\" title=\"Bug reports\">🐛</a></td>\n    <td align=\"center\"><a href=\"https://github.com/SkeletalDemise\"><img src=\"https://avatars1.githubusercontent.com/u/29117662?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>SkeletalDemise</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=SkeletalDemise\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://www.patreon.com/cclauss\"><img src=\"https://avatars3.githubusercontent.com/u/3709715?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Christian Clauss</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=cclauss\" title=\"Code\">💻</a> <a href=\"https://github.com/Ciphey/Ciphey/issues?q=author%3Acclauss\" title=\"Bug reports\">🐛</a></td>\n    <td align=\"center\"><a href=\"http://machinexa.xss.ht\"><img src=\"https://avatars1.githubusercontent.com/u/60662297?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Machinexa2</b></sub></a><br /><a href=\"#content-machinexa2\" title=\"Content\">🖋</a></td>\n    <td align=\"center\"><a href=\"https://github.com/anantverma275\"><img src=\"https://avatars1.githubusercontent.com/u/18184503?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Anant Verma</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=anantverma275\" title=\"Code\">💻</a> <a href=\"https://github.com/Ciphey/Ciphey/issues?q=author%3Aanantverma275\" title=\"Bug reports\">🐛</a></td>\n    <td align=\"center\"><a href=\"https://github.com/XVXTOR\"><img src=\"https://avatars1.githubusercontent.com/u/40268197?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>XVXTOR</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=XVXTOR\" title=\"Documentation\">📖</a></td>\n    <td align=\"center\"><a href=\"https://github.com/Itamikame\"><img src=\"https://avatars2.githubusercontent.com/u/59034423?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Itamikame</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=Itamikame\" title=\"Code\">💻</a></td>\n  </tr>\n  <tr>\n    <td align=\"center\"><a href=\"https://github.com/MikeMerz\"><img src=\"https://avatars3.githubusercontent.com/u/50526795?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>MikeMerz</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=MikeMerz\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/jacobggman\"><img src=\"https://avatars2.githubusercontent.com/u/30216976?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Jacob Galam</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=jacobggman\" title=\"Code\">💻</a> <a href=\"https://github.com/Ciphey/Ciphey/issues?q=author%3Ajacobggman\" title=\"Bug reports\">🐛</a></td>\n    <td align=\"center\"><a href=\"https://tuxthexplorer.github.io/\"><img src=\"https://avatars1.githubusercontent.com/u/37508897?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>TuxTheXplorer</b></sub></a><br /><a href=\"#translation-TuxTheXplorer\" title=\"Translation\">🌍</a></td>\n    <td align=\"center\"><a href=\"https://github.com/Itamai\"><img src=\"https://avatars3.githubusercontent.com/u/53093696?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Itamai</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=Itamai\" title=\"Code\">💻</a> <a href=\"https://github.com/Ciphey/Ciphey/issues?q=author%3AItamai\" title=\"Bug reports\">🐛</a></td>\n    <td align=\"center\"><a href=\"https://github.com/Termack\"><img src=\"https://avatars2.githubusercontent.com/u/26333901?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Filipe</b></sub></a><br /><a href=\"#translation-Termack\" title=\"Translation\">🌍</a></td>\n    <td align=\"center\"><a href=\"https://github.com/malathit\"><img src=\"https://avatars0.githubusercontent.com/u/2684148?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Malathi</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=malathit\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://hexchaos.xyz/\"><img src=\"https://avatars1.githubusercontent.com/u/8947820?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Jack</b></sub></a><br /><a href=\"#translation-HexChaos\" title=\"Translation\">🌍</a></td>\n  </tr>\n  <tr>\n    <td align=\"center\"><a href=\"https://github.com/yafkari\"><img src=\"https://avatars3.githubusercontent.com/u/41365655?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Younes</b></sub></a><br /><a href=\"#translation-yafkari\" title=\"Translation\">🌍</a></td>\n    <td align=\"center\"><a href=\"https://gitlab.com/Marnick39\"><img src=\"https://avatars2.githubusercontent.com/u/17315511?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Marnick Vandecauter</b></sub></a><br /><a href=\"#translation-Marnick39\" title=\"Translation\">🌍</a></td>\n    <td align=\"center\"><a href=\"https://github.com/mav8557\"><img src=\"https://avatars0.githubusercontent.com/u/47306745?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Michael V</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=mav8557\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/chuinzer\"><img src=\"https://avatars2.githubusercontent.com/u/64257785?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>chuinzer</b></sub></a><br /><a href=\"#translation-chuinzer\" title=\"Translation\">🌍</a></td>\n    <td align=\"center\"><a href=\"https://github.com/blackcat-917\"><img src=\"https://avatars1.githubusercontent.com/u/53786619?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>blackcat-917</b></sub></a><br /><a href=\"#translation-blackcat-917\" title=\"Translation\">🌍</a> <a href=\"https://github.com/Ciphey/Ciphey/commits?author=blackcat-917\" title=\"Documentation\">📖</a></td>\n    <td align=\"center\"><a href=\"https://github.com/Ozzyz\"><img src=\"https://avatars3.githubusercontent.com/u/6113447?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Åsmund Brekke</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=Ozzyz\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/sashreek1\"><img src=\"https://avatars1.githubusercontent.com/u/45600974?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Sashreek Shankar</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=sashreek1\" title=\"Code\">💻</a></td>\n  </tr>\n  <tr>\n    <td align=\"center\"><a href=\"https://github.com/cryptobadger\"><img src=\"https://avatars2.githubusercontent.com/u/26308101?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>cryptobadger</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=cryptobadger\" title=\"Code\">💻</a> <a href=\"https://github.com/Ciphey/Ciphey/issues?q=author%3Acryptobadger\" title=\"Bug reports\">🐛</a></td>\n    <td align=\"center\"><a href=\"https://github.com/e1fy\"><img src=\"https://avatars3.githubusercontent.com/u/61194758?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>elf</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=e1fy\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/rogercyyu\"><img src=\"https://avatars0.githubusercontent.com/u/45835736?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Roger Yu</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=rogercyyu\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/JesseEmond\"><img src=\"https://avatars.githubusercontent.com/u/1843555?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>dysleixa</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=JesseEmond\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"http://mohzulfikar.me\"><img src=\"https://avatars.githubusercontent.com/u/48849323?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Mohammad Zulfikar</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=mohzulfikar\" title=\"Documentation\">📖</a></td>\n    <td align=\"center\"><a href=\"https://github.com/AABur\"><img src=\"https://avatars.githubusercontent.com/u/41373199?v=4?s=100\" width=\"100px;\" alt=\"\"/><br /><sub><b>Alexander Burchenko</b></sub></a><br /><a href=\"#translation-AABur\" title=\"Translation\">🌍</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nโครงการนี้เป็นไปตามข้อกำหนดของ [all-contributors](https://github.com/all-contributors/all-contributors) ยินดีต้อนรับผลงานใด ๆ !\n"
  },
  {
    "path": "translations/zh/CODE_OF_CONDUCT.md",
    "content": "<p align=\"center\">\n翻译 <br>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/de/CODE_OF_CONDUCT.md>🇩🇪 DE   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/CODE_OF_CONDUCT.md>🇬🇧 EN   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/hu/CODE_OF_CONDUCT.md>🇭🇺 HU   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/id/CODE_OF_CONDUCT.md>🇮🇩 ID   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/it/CODE_OF_CONDUCT.md>🇮🇹 IT   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/nl/CODE_OF_CONDUCT.md>🇳🇱 NL   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/pt-br/CODE_OF_CONDUCT.md>🇧🇷 PT-BR   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/ru/CODE_OF_CONDUCT.md>🇷🇺 RU   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/zh/CODE_OF_CONDUCT.md>🇨🇳 ZH   </a>\n</p>\n\n# 贡献者公约行为准则\n\n## 我们的承诺\n\n为了营造开放和热情的环境，我们贡献者和维护者保证参与我们的项目，\n并且我们的社区为每个人，\n不论年龄，身材，提供无骚扰的体验大小，残疾，种族，性别特征，性别认同和表达，\n经验水平，教育程度，社会经济地位，国籍，个人\n外观，种族，宗教或性身份和性取向。\n\n## 我们的标准\n\n有助于创造积极环境的行为例子\n包括:\n\n- 使用欢迎和包容的语言\n- 尊重不同的观点和经验\n- 优雅地接受建设性的批评\n- 专注于对社会最有利的事物\n- 对其他成员表示同情\n\n参与者不可接受的行为包括：\n\n- 使用性化的语言或图像，以及不受欢迎的性关注或进步\n- 拖钓，侮辱性/贬损性评论以及人身或政治攻击\n- 公开或私人骚扰 \\*未经明确许可发布他人的私人信息，例如物理或电子信息\n  地址，\n- 可以合理地认为不适当的其他行为\n  专业设置\n\n## 我们的责任\n\n项目维护者负责澄清可接受的标准行为，\n并期望在其中采取适当和公平的纠正措施\n对任何不可接受行为的回应。\n\n项目维护者有权利和责任删除，编辑或\n拒绝评论，提交，代码，Wiki 编辑，问题和其他贡献\n不符合本行为准则或暂时禁止或\n永久为他们认为不适当的其他行为做出贡献，\n威胁，冒犯或有害的\n\n## 范围\n\n这个《行为准则》适用于项目空间和公共空间\n当个人代表项目或其社区时。示例\n代表项目或社区，包括使用正式项目电子邮件\n地址，通过官方社交媒体帐户发布或担任指定人员\n代表在线或离线活动。项目的代表可能是\n由项目维护者进一步定义和阐明。\n\n## Enforcement\n\n虐待，骚扰或其他不可接受的行为可能是\n通过与 brandon_skerrit 联系项目团队进行报告。所有\n投诉将进行审查和调查，并会做出以下回应：\n被认为是必要且适合于具体情况的。项目团队是\n有责任对事件的举报人保密。\n具体实施政策的更多详细信息可能会单独发布。\n\n未严格遵守或执行行为准则的项目维护者\n信仰可能会面临其项目负责人决定的暂时或永久性影响。\n\n## Attribution\n\n这个的行为准则是根据 [贡献者盟约][主页], 1.4 版本,\n可在 <https://www.contributor-covenant.org/version/1/4/code-of-conduct.html> 获得\n\n[主页]: https://www.contributor-covenant.org\n\n有关此行为准则的常见问题的答案，请参见\n<https://www.contributor-covenant.org/faq>\n"
  },
  {
    "path": "translations/zh/CONTRIBUTING.md",
    "content": "<p align=\"center\">\n翻译 <br>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/de/CONTRIBUTING.md>🇩🇪 DE   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/de/CONTRIBUTING.md>🇬🇧 EN   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/hu/CONTRIBUTING.md>🇭🇺 HU   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/id/CONTRIBUTING.md>🇮🇩 ID   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/it/CONTRIBUTING.md>🇮🇹 IT   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/nl/CONTRIBUTING.md>🇳🇱 NL   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/pt-br/CONTRIBUTING.md>🇧🇷 PT-BR   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/ru/CONTRIBUTING.md>🇷🇺 RU   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/zh/CONTRIBUTING.md>🇨🇳 ZH   </a>\n</p>\n\n你好！\n\n您有兴趣为 Ciphey 做贡献吗？ 🤔\n\n也许您对从哪里开始感到困惑，或者您认为自己的编码技能还不够“好”？好吧，对于后者-这太荒谬了！我们对“错误的代码”完全没问题，即使如此，如果您正在阅读本文档，您可能也是一个不错的程序员。我的意思是，新手通常不会学会为 GitHub 项目做贡献 😉\n\n您可以通过以下方法为 Ciphey 做出贡献:\n\n- 新增语言 🧏\n- 添加更多加密方法 📚\n- 创建更多文档（非常重要！我们将非常感激）\n- 修复通过 GitHub 问题提交的错误（我们可以在此方面为您提供支持 😊)\n- 重构代码库 🥺\n\n如果这些听起来很难，请不要担心！本文档将引导您确切地实现这些目标。另外，您的名字也会被添加到 Ciphey 的贡献者列表中，我们将永远感谢您！ 🙏\n\n我们有一个小的 Discord 聊天室供您与开发人员交谈并获得帮助。或者，您可以为您的建议写一个 GitHub 问题。如果您想加入 Discord，请与我们联系或以某种方式询问我们[Discord 链接](https://discord.gg/KfyRUWw)\n\n# 如何贡献\n\nCiphey 始终需要更多解密工具！要了解如何将代码集成到 ciphey 中，请查看:\n\n- <https://github.com/Ciphey/Ciphey/wiki/Adding-your-own-ciphers> 一个非常简单的教程\n- <https://github.com/Ciphey/Ciphey/wiki/Extending-Ciphey> 有关 API 的参考\n\n如果您为此编写了一些测试，那就很好了，只需在 Ciphey / tests / test_main.py 中复制一个函数，并用用密码编码的内容替换密文。如果您不添加测试，我们可能仍会合并它，但是对我们来说，诊断错误会更加困难！\n不用说，我们将把您添加到您的辛勤工作的贡献者名单中！\n\n# 新增语言 🧏\n\n默认的语言检查器“ brandon”可使用多种语言。现在，这听起来令人生畏。\n但老实说，您要做的就是拿字典，做一些分析（我们编写了代码来帮助您），将字典和分析添加到仓库中。然后将选项添加到“ settings.yml”。\n\n# 创建更多文档\n\n文档是 Ciphey 最重要的部分。没有文档是极端的代码负担，我们不希望如此。\n当我说的时候请相信我，如果您为出色的文档做出了贡献，那么您将与代码贡献者处于同一水平。文档非常重要。\n\n您可以通过多种方式添加文档.\n\n- 代码中的文档字符串\n- 改进我们当前的文档（自述文件，此文件，Ciphey Wiki 页面）\n- 翻译文件 （这是非常重要的，越多的语言版本越好）\n\n以及更多！\n\n# 修正代码中的错误\n\n访问我们的 GitHub 问题页面，查找 Ciphey 的所有错误！压扁它们，您将被添加到贡献者列表。 ;）\n\n# 重构代码库\n\n并非所有 Ciphey 都遵循 PEP8，并且某些代码会重复。\n"
  },
  {
    "path": "translations/zh/README.md",
    "content": "<p align=\"center\">\n翻译 <br>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/de/README.md>🇩🇪 DE   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/README.md>🇬🇧 EN   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/fr/README.md>🇫🇷 FR   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/hu/README.md>🇭🇺 HU   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/id/README.md>🇮🇩 ID   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/it/README.md>🇮🇹 IT   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/nl/README.md>🇳🇱 NL   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/pt-br/README.md>🇧🇷 PT-BR   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/ru/README.md>🇷🇺 RU   </a>\n<a href=https://github.com/Ciphey/Ciphey/tree/master/translations/zh/README.md>🇨🇳 ZH   </a>\n <br><br>\n➡️\n<a href=\"https://github.com/Ciphey/Ciphey/wiki\">文献资料</a> |\n<a href=\"https://discord.ciphey.online\">Discord 链接</a> |\n <a href=\"https://github.com/Ciphey/Ciphey/wiki/Installation\">安装指南</a>\n ⬅️\n\n<br>\n  <img src=\"../../Pictures_for_README/binoculars.png\" alt=\"Ciphey\">\n</p>\n\n<p align=\"center\">\n  <img alt=\"GitHub commit activity\" src=\"https://img.shields.io/github/commit-activity/m/ciphey/ciphey\">\n<img src=\"https://pepy.tech/badge/ciphey\">\n <img src=\"https://pepy.tech/badge/ciphey/month\">\n  <a href=\"https://discord.gg/wM3scnc\"><img alt=\"Discord\" src=\"https://img.shields.io/discord/728245678895136898\"></a>\n<a href=\"https://pypi.org/project/ciphey/\"><img src=\"https://img.shields.io/pypi/v/ciphey.svg\"></a>\n  <img src=\"https://img.shields.io/badge/License-MIT-yellow.svg\" alt=\"Ciphey\">\n\n  <img src=\"https://github.com/brandonskerritt/Ciphey/workflows/Python%20application/badge.svg?branch=master\" alt=\"Ciphey\">\n<br>\n使用自然语言处理和人工智能以及一些全自动解密/解码/破解工具。\n</p>\n<hr>\n\n## [安装指南](https://github.com/Ciphey/Ciphey/wiki/Installation)\n\n| <p align=\"center\"><a href=\"https://pypi.org/project/ciphey\">🐍 Python | <p align=\"center\"><a href=\"https://hub.docker.com/r/remnux/ciphey\">🐋 Docker (普遍) | <p align=\"center\"><a href=\"https://ports.macports.org/port/ciphey/summary\">🍎 MacPorts (macOS) | <p align=\"center\"><a href=\"https://formulae.brew.sh/formula/ciphey\">🍺 Homebrew (macOS/Linux) |\n| --------------------------------------------------------------------- | --------------------------------------------------------------------------------- | --------------------------------------------------------------------------------- |--------------------------------------------------------------------------------- |\n| <p align=\"center\"><img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/python.png\" /></p> | <p align=\"center\"><img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/docker.png\" /></p> | <p align=\"center\"><img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/macports.png\" /></p> | <p align=\"center\"><img src=\"https://github.com/Ciphey/Ciphey/raw/master/Pictures_for_README/homebrew.png\" /></p> |\n| `python3 -m pip install ciphey --upgrade` | `docker run -it --rm remnux/ciphey` | `sudo port install ciphey` | `brew install ciphey` |\n\n| Linux                                                                                                                   | Mac OS                                                                                                                     | Windows                                                                                                                   |\n| ----------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- |\n| ![GitHub Workflow Status](https://img.shields.io/github/workflow/status/ciphey/ciphey/Python%20application?label=Linux) | ![GitHub Workflow Status](https://img.shields.io/github/workflow/status/ciphey/ciphey/Python%20application?label=Mac%20OS) | ![GitHub Workflow Status](https://img.shields.io/github/workflow/status/ciphey/ciphey/Python%20application?label=Windows) |\n\n<hr>\n\n# 🤔 这是什么?\n\n输入加密的文本，取回解密的文本。\n\n> \"什么类型的加密?\"\n\n这才是重点。您不知道，只是知道它可能已加密。 Ciphey 将为您解决。\n\nCiphey 可以在 3 秒或更短的时间内解密大多数加密的文本。\n\n<p align=\"center\" href=\"https://asciinema.org/a/336257\">\n  <img src=\"../../Pictures_for_README/index.gif\" alt=\"Ciphey demo\">\n</p>\n\nCiphey 旨在成为一种工具，用于自动执行许多解密和解码，例如多种基本编码，经典密码，哈希或更高级的加密技术。\n\n如果您对密码学不太了解，或者想在自己进行密文处理之前快速检查密文，那么 Ciphey 就是您的理想之选。\n\n**技术部分.** Ciphey 使用一个带有密文检测接口(_Cipher Detection Interface_)的定制 AI 模型(_AuSearch_)来估测一个东西是用什么方式加密的。以及一个定制过的自然语言处理接口(_Language Checker Interface_)来检测给定文本何时变为纯文本。\n\n这里没有神经网络或缓慢的 AI。我们只使用快速和最小的东西。\n\n那只是冰山一角. 如果您要完整的技术部分的解释, 看看我们的[文档](https://github.com/Ciphey/Ciphey/wiki).\n\n# ✨ 特性\n\n- **支持 30+的加密方法** 例如编码（二进制，base64）和常规加密（例如 Caesar 密码，重复密钥 XOR 等）。 **[有关完整列表，请单击此处](https://github.com/Ciphey/Ciphey/wiki/Supported-Ciphers)**\n- **具有增强搜索功能的定制人工智能（AuSearch）可以回答“使用了哪种加密技术?\"** 解密时间不到 3 秒。\n- **定制的自然语言处理系统** Ciphey 可以确定某些东西是否是纯文本。无论该纯文本是 JSON，CTF 标志还是英语 Ciphey，都可以在几毫秒内获得它。\n- **多国语言支持** 目前，仅有德语和英语（带有 AU，UK，CAN，USA 变体）。\n- **支持加密和哈希** 诸如 CyberChef Magic 之类的替代品则没有。\n- **[C++ 核心](https://github.com/Ciphey/CipheyCore)** 这会使整个过程变得非常快。\n\n# 🔭 Ciphey 与 CyberChef 的对比\n\n## 🔁 Base64 加密 42 次\n\n<table>\n  <tr>\n  <th>名字</th>\n    <th>⚡ Ciphey ⚡ </th>\n    <th>🐢 CyberChef 🐢</th>\n  </tr>\n  <tr>\n  <th>Gif</th>\n    <td><img src=\"../../Pictures_for_README/ciphey_gooder_cyberchef.gif\" alt=\"The guy she tells you not to worry about\"></td>\n    <td><img src=\"../../Pictures_for_README/not_dying.gif\" alt=\"You\"></td>\n  </tr>\n  <tr>\n  <th>时间</th>\n    <td>2 秒</td>\n    <td>6 秒</td>\n  </tr>\n    <tr>\n  <th>建立</th>\n    <td><ul><li>在文件上运行ciphey</li></ul></td>\n    <td><ul><li>将正则表达式参数设置为 \"{\"</li><li>您需要知道要重复多少次</li><li>您需要一直知道它是使用Base64加密法</li><li>您需要运行 CyberChef (它是一个超级超级慢的JS 应用程序)</li><li>对CyberChef有足够了解以创建此管道</li><li>反转匹配</li></ul></td>\n  </tr>\n</table>\n\n<sub><b>Note</b> 这些 gif 可能在不同的时间加载，因此一个 gif 的显示速度可能明显快于另一个.</sub><br>\n<sub><b>A note on magic</b> CyberChef 与 Ciphey 最相似的功能是 Magic。Magic 在此输入上立即失败并崩溃。我们迫使 CyberChef 竞争的唯一方法是手动定义它。</sub>\n\n我们还使用**6gb 文件**测试了 CyberChef 和 Ciphey。Ciphey 在 5 分钟 54 秒内破解了它。CyberChef 在开始之前就系统崩溃了。\n\n## 📊 Ciphey 和 Katana 和 CyberChef Magic 的对比\n\n| **名字**                    | ⚡ Ciphey ⚡ | 🗡️ Katana 🗡️ | 🐢 CyberChef Magic 🐢 |\n| --------------------------- | ------------ | ------------ | --------------------- |\n| 高级语言检查器              | ✅           | ❌           | ✅                    |\n| 支持加密法                  | ✅           | ✅           | ❌                    |\n| 以反乌托邦主题命名的发行 🌃 | ✅           | ❌           | ❌                    |\n| 支持哈希算法                | ✅           | ✅           | ❌                    |\n| 易于设置                    | ✅           | ❌           | ✅                    |\n| 可以猜测使用什么加密        | ✅           | ❌           | ❌                    |\n| 由黑客为黑客创建            | ✅           | ✅           | ❌                    |\n\n# 🎬 入门\n\n如果您在安装 Ciphey 时遇到问题，请 [阅读此内容](https://github.com/Ciphey/Ciphey/wiki/Common-Issues-&-Their-Solutions)\n\n## ‼️ 重要链接（文档，安装指南，Discord 链接）\n\n| 安装指南                                                          | 文献资料                                             | Discord                                     | Docker 图像（来自 REMnux）                                                                     |\n| ----------------------------------------------------------------- | ---------------------------------------------------- | ------------------------------------------- | ---------------------------------------------------------------------------------------------- |\n| 📖 [安装指南](https://github.com/Ciphey/Ciphey/wiki/Installation) | 📚 [文献资料](https://github.com/Ciphey/Ciphey/wiki) | 🦜 [Discord](https://discord.ciphey.online) | 🐋 [Docker 文献资料](https://docs.remnux.org/run-tools-in-containers/remnux-containers#ciphey) |\n\n## 🏃‍♀️ 运行 Ciphey\n\n有 3 种方式可以运行 Ciphey。\n\n1. 文件输入 `ciphey -f encrypted.txt`\n2. 不合格输入 `ciphey -- \"Encrypted input\"`\n3. 正常方式 `ciphey -t \"Encrypted input\"`\n\n![Gif显示3种运行Ciphey的方法](../../Pictures_for_README/3ways.gif)\n\n要消除进度条，概率表和所有杂音，请使用安静模式。\n\n`ciphey -t \"encrypted text here\" -q`\n\n有关命令的完整列表，请运行 `ciphey --help`.\n\n### ⚗️ 导入 Ciphey\n\n您可以导入 Ciphey\\'s main，并在您自己的程序和代码中使用它。 `from Ciphey.__main__ import main`\n\n# 🎪 贡献者\n\nCiphey 是由[Brandon](https://github.com/bee-san)在 2008 年发明的，并在 2019 年重写。如果没有[Cyclic3](https://github.com/Cyclic3) - UoL 网络安全协会主席，Ciphey 将不会是今天的样子\n\nCiphey 由[网络安全协会](https://www.cybersoc.cf/)进行了复兴和重建以用于 CTF。如果您曾经在利物浦，请考虑发表演讲或赞助我们的活动。给我们发电子邮件 `cybersecurity@society.liverpoolguild.org` 以了解更多 🤠\n\n**主要信用** 感谢 George H 找出如何使用适当的算法来加快搜索过程。\n**特别感谢** 至 [varghalladesign](https://www.facebook.com/varghalladesign) 用于设计徽标。查看他们的其他设计工作！\n\n## 🐕‍🦺 [参与贡献](https://github.com/Ciphey/Ciphey/wiki/Contributing)\n\n不要害怕参与！您可以做很多事情来帮助我们。它们每个都带有标签，并通过示例轻松解释。如果您想贡献但被停止，请在 GitHub 问题中标记 @bee-san 或 @cyclic3✨\n\n或者，加入 Discord 群组并在那里发送消息（链接在 [贡献文件](https://github.com/Ciphey/Ciphey/wiki/Contributing)）或在本自述文件的顶部的徽章。\n\n请阅读 [参与贡献文件](https://github.com/Ciphey/Ciphey/wiki/Contributing) 有关如何参与制作的细节 ✨\n\nBy doing so, you'll get your name added to the README below and get to be apart of an ever-growing project!\n[![Stargazers over time](https://starchart.cc/Ciphey/Ciphey.svg)](https://starchart.cc/Ciphey/Ciphey)\n\n## 💰 财务贡献者\n\n这些捐款将不仅用于资助 Ciphey 及其作者的未来，而且还将用于利物浦大学的网络安全协会。\n\nGitHub 不支持“赞助此项目，我们将平均分配资金”，因此选择一个链接，我们将对其进行最终整理 🥰\n\n## ✨ Contributors\n\n感谢这些很棒的人([表情符号](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tr>\n    <td align=\"center\"><a href=\"https://github.com/Cyclic3\"><img src=\"https://avatars1.githubusercontent.com/u/15613874?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>cyclic3</b></sub></a><br /><a href=\"#design-cyclic3\" title=\"Design\">🎨</a> <a href=\"#maintenance-cyclic3\" title=\"Maintenance\">🚧</a> <a href=\"https://github.com/Ciphey/Ciphey/commits?author=cyclic3\" title=\"Code\">💻</a> <a href=\"#ideas-cyclic3\" title=\"Ideas, Planning, & Feedback\">🤔</a></td>\n    <td align=\"center\"><a href=\"https://skerritt.blog\"><img src=\"https://avatars3.githubusercontent.com/u/10378052?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Brandon</b></sub></a><br /><a href=\"#design-brandonskerritt\" title=\"Design\">🎨</a> <a href=\"#maintenance-brandonskerritt\" title=\"Maintenance\">🚧</a> <a href=\"https://github.com/Ciphey/Ciphey/commits?author=brandonskerritt\" title=\"Code\">💻</a> <a href=\"#ideas-brandonskerritt\" title=\"Ideas, Planning, & Feedback\">🤔</a></td>\n    <td align=\"center\"><a href=\"https://github.com/michalani\"><img src=\"https://avatars0.githubusercontent.com/u/27767884?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>michalani</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=michalani\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/ashb07\"><img src=\"https://avatars2.githubusercontent.com/u/24845568?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>ashb07</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=ashb07\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/TheAlcanian\"><img src=\"https://avatars3.githubusercontent.com/u/22127191?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Shardion</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/issues?q=author%3ATheAlcanian\" title=\"Bug reports\">🐛</a></td>\n    <td align=\"center\"><a href=\"https://github.com/Bryzizzle\"><img src=\"https://avatars0.githubusercontent.com/u/57810197?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Bryan</b></sub></a><br /><a href=\"#translation-Bryzizzle\" title=\"Translation\">🌍</a> <a href=\"https://github.com/Ciphey/Ciphey/commits?author=Bryzizzle\" title=\"Documentation\">📖</a></td>\n    <td align=\"center\"><a href=\"https://lukasgabriel.net\"><img src=\"https://avatars0.githubusercontent.com/u/52338810?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Lukas Gabriel</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=lukasgabriel\" title=\"Code\">💻</a> <a href=\"https://github.com/Ciphey/Ciphey/issues?q=author%3Alukasgabriel\" title=\"Bug reports\">🐛</a> <a href=\"#translation-lukasgabriel\" title=\"Translation\">🌍</a> <a href=\"#ideas-lukasgabriel\" title=\"Ideas, Planning, & Feedback\">🤔</a></td>\n  </tr>\n  <tr>\n    <td align=\"center\"><a href=\"https://github.com/DarshanBhoi\"><img src=\"https://avatars2.githubusercontent.com/u/70128281?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Darshan</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/issues?q=author%3ADarshanBhoi\" title=\"Bug reports\">🐛</a></td>\n    <td align=\"center\"><a href=\"https://github.com/SkeletalDemise\"><img src=\"https://avatars1.githubusercontent.com/u/29117662?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>SkeletalDemise</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=SkeletalDemise\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://www.patreon.com/cclauss\"><img src=\"https://avatars3.githubusercontent.com/u/3709715?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Christian Clauss</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=cclauss\" title=\"Code\">💻</a> <a href=\"https://github.com/Ciphey/Ciphey/issues?q=author%3Acclauss\" title=\"Bug reports\">🐛</a></td>\n    <td align=\"center\"><a href=\"http://machinexa.xss.ht\"><img src=\"https://avatars1.githubusercontent.com/u/60662297?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Machinexa2</b></sub></a><br /><a href=\"#content-machinexa2\" title=\"Content\">🖋</a></td>\n    <td align=\"center\"><a href=\"https://github.com/anantverma275\"><img src=\"https://avatars1.githubusercontent.com/u/18184503?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Anant Verma</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=anantverma275\" title=\"Code\">💻</a> <a href=\"https://github.com/Ciphey/Ciphey/issues?q=author%3Aanantverma275\" title=\"Bug reports\">🐛</a></td>\n    <td align=\"center\"><a href=\"https://github.com/XVXTOR\"><img src=\"https://avatars1.githubusercontent.com/u/40268197?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>XVXTOR</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=XVXTOR\" title=\"Documentation\">📖</a></td>\n    <td align=\"center\"><a href=\"https://github.com/Itamikame\"><img src=\"https://avatars2.githubusercontent.com/u/59034423?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Itamikame</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=Itamikame\" title=\"Code\">💻</a></td>\n  </tr>\n  <tr>\n    <td align=\"center\"><a href=\"https://github.com/MikeMerz\"><img src=\"https://avatars3.githubusercontent.com/u/50526795?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>MikeMerz</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=MikeMerz\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://github.com/jacobggman\"><img src=\"https://avatars2.githubusercontent.com/u/30216976?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Jacob Galam</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=jacobggman\" title=\"Code\">💻</a> <a href=\"https://github.com/Ciphey/Ciphey/issues?q=author%3Ajacobggman\" title=\"Bug reports\">🐛</a></td>\n    <td align=\"center\"><a href=\"https://tuxthexplorer.github.io/\"><img src=\"https://avatars1.githubusercontent.com/u/37508897?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>TuxTheXplorer</b></sub></a><br /><a href=\"#translation-TuxTheXplorer\" title=\"Translation\">🌍</a></td>\n    <td align=\"center\"><a href=\"https://github.com/Itamai\"><img src=\"https://avatars3.githubusercontent.com/u/53093696?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Itamai</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=Itamai\" title=\"Code\">💻</a> <a href=\"https://github.com/Ciphey/Ciphey/issues?q=author%3AItamai\" title=\"Bug reports\">🐛</a></td>\n    <td align=\"center\"><a href=\"https://github.com/Termack\"><img src=\"https://avatars2.githubusercontent.com/u/26333901?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Filipe</b></sub></a><br /><a href=\"#translation-Termack\" title=\"Translation\">🌍</a></td>\n    <td align=\"center\"><a href=\"https://github.com/malathit\"><img src=\"https://avatars0.githubusercontent.com/u/2684148?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Malathi</b></sub></a><br /><a href=\"https://github.com/Ciphey/Ciphey/commits?author=malathit\" title=\"Code\">💻</a></td>\n    <td align=\"center\"><a href=\"https://hexchaos.xyz/\"><img src=\"https://avatars1.githubusercontent.com/u/8947820?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Jack</b></sub></a><br /><a href=\"#translation-HexChaos\" title=\"Translation\">🌍</a></td>\n  </tr>\n  <tr>\n    <td align=\"center\"><a href=\"https://github.com/yafkari\"><img src=\"https://avatars3.githubusercontent.com/u/41365655?v=4\" width=\"100px;\" alt=\"\"/><br /><sub><b>Younes</b></sub></a><br /><a href=\"#translation-yafkari\" title=\"Translation\">🌍</a></td>\n  </tr>\n</table>\n\n<!-- markdownlint-enable -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\n该项目遵循 [all-contributors](https://github.com/all-contributors/all-contributors) 的规范。 欢迎任何形式的捐助和帮助!\n"
  }
]