TensorFlow implementation of CipherGAN
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.
data #1 - Add support for 32 bit int in generator_utils (#3) Jun 3, 2018
hparams Updated README and fixed import error. Jan 16, 2018
metrics Initial public release. Jan 15, 2018
models Fix #4 Aug 13, 2018
tests Initial public release. Jan 15, 2018
train_utils Initial public release. Jan 15, 2018
LICENSE Initial commit Oct 19, 2017
README.md Update README.md Sep 30, 2018
__init__.py Initial public release. Jan 15, 2018
train.py Initial public release. Jan 15, 2018



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 M. Li, Muhammad Osama, Łukasz Kaiser

Citing this work

    title={Unsupervised Cipher Cracking Using Discrete {GAN}s},
    author={Aidan N. Gomez and Sicong Huang and Ivan Zhang and Bryan M. Li and Muhammad Osama and Lukasz Kaiser},
    booktitle={International Conference on Learning Representations},

Running this code

Call pip install -r CipherGAN/requirements.txt to install all dependencies.

Generating Data

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.

Sample Call

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 \


All training can be performed by calling train.py. Training requires the TFRecords generated by the included generators.

Sample Call

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*" \


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: