Skip to content

FEAT: Add VigenereConverter - #2333

Open
diamond8658 wants to merge 2 commits into
microsoft:mainfrom
diamond8658:feature/vigenere-converter
Open

FEAT: Add VigenereConverter#2333
diamond8658 wants to merge 2 commits into
microsoft:mainfrom
diamond8658:feature/vigenere-converter

Conversation

@diamond8658

Copy link
Copy Markdown

Description

Adds VigenereConverter, a classical polyalphabetic cipher converter that generalizes CaesarConverter using a repeating keyword instead of a fixed shift. Closes #2304.

Follows the existing CaesarConverter/AtbashConverter structure:

  • __init__(self, *, key: str, append_description: bool = False), validates the key is non-empty and ASCII alphabetic
  • _build_identifier() returns a ComponentIdentifier with key as a param
  • convert_async encodes the prompt, with the same append_description behavior rendering vigenere_description.yaml
  • Non-alphabetic characters pass through unchanged and don't consume a position in the key, matching Caesar's handling of digits and punctuation

vigenere_description.yaml cites Handa et al. (arXiv:2402.10601), the paper specifically covering word substitution cipher jailbreaking, rather than the CipherChat paper cited by Caesar/Atbash, since that paper doesn't cover Vigenère.

Per the discussion on #2304, this does not touch pyrit/scenario/scenarios/garak/encoding.py (garak has no corresponding probe) or FoundryTechnique (will be picked up when Foundry's converter set is refreshed separately).

Tests and Documentation

New tests/unit/converter/test_vigenere_converter.py, 13 tests covering basic encoding, case preservation, key case insensitivity, non-alphabetic passthrough (including non-ASCII alphabetic characters, which was a real bug caught during development, see note below), wraparound, append_description, and invalid key handling.

Added VigenereConverter to the existing parametrized fixtures in tests/unit/converter/test_converter.py alongside Caesar/Atbash.

Verified against tests/unit/registry/test_converter_registry.py, confirms the converter is discovered, correctly classified as non-LLM-based, and buildable through the registry.

pyrit/converter/__init__.py updated with the import and __all__ export.

doc/code/converters/1_text_to_text_converters.py updated with a demo line. Ran with jupytext --execute --to notebook doc/code/converters/1_text_to_text_converters.py, all cells including the new one execute cleanly.

Implementation note: the initial version used str.isalpha() to detect letters, which returns True for non-ASCII characters (accented letters, etc.) not present in the cipher alphabet, causing a crash. Fixed by checking ASCII letter membership explicitly. Caesar and Atbash avoid this because they use str.translate(), which passes through unmapped characters silently.

@diamond8658

Copy link
Copy Markdown
Author

@diamond8658 please read the following Contributor License Agreement(CLA). If you agree with the CLA, please reply with the following information.

@microsoft-github-policy-service agree [company="{your company}"]

Options:

  • (default - no company specified) I have sole ownership of intellectual property rights to my Submissions and I am not making Submissions in the course of work for my employer.
@microsoft-github-policy-service agree
  • (when company given) I am making Submissions in the course of work for my employer (or my employer has intellectual property rights in my Submissions by contract or applicable law). I have permission from my employer to make Submissions and enter into this Agreement on behalf of my employer. By signing below, the defined term “You” includes me and my employer.
@microsoft-github-policy-service agree company="Microsoft"

Contributor License Agreement

@microsoft-github-policy-service agree

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

FEAT: Add VigenereConverter

1 participant