Implementation of CipherGAN, used to obtain the results detailed in Unsupervised Cipher-Cracking Using Neural Networks.
Authors: Aidan N. Gomez, Sīcōng Huang, Ivan Zhang, Bryan Li, Muhammad Osama, Łukasz Kaiser
Running this code
pip install -r CipherGAN/requirements.txt to install all dependencies.
We make use of data generators to generate the TFRecords that are used for training. Of particular note is
cipher_generator, which may be used to generate data for the shift and Vigenère ciphers that were tested in the paper.
The settings for the included generators are passed as flags. For example, to generate a word-level Vigenère Cipher (key:
CDE) on the Brown Corpus with a sample length of 200, call:
python CipherGAN/data/data_generators/cipher_generator.py \ --cipher=vigenere \ --vigenere_key=345 \ --percentage_training=0.9 \ --corpus=brown \ --vocab_size=200 \ --test_name=vigenere345-brown200-eval \ --train_name=vigenere345-brown200-train \ --output_dir=tmp/data \ --vocab_filename=vigenere345_brown200_vocab.txt
All training can be performed by calling
train.py. Training requires the TFRecords generated by the included generators.
Please refer to the flags accepted by
train.py for a full set of options.
python -m CipherGAN.train \ --output_dir=runs/vig345 \ --test_name="vigenere345-brown200-eval*" \ --train_name="vigenere345-brown200-train*" \ --hparam_sets=vigenere_brown_vocab_200
We'd love to accept your contributions to this project. Please feel free to open an issue, or submit a pull request as necessary. If you have implementations of this repository in other ML frameworks, please reach out so we may highlight them here.
Our thanks to Michal Wiszniewski for his assistance in developing this codebase.
In addition, this repository borrows and builds upon code from: