Skip to content
Morse code toolkit including decoder and statistics generator, and transmitter with optional inclusion of statistical characterization and noise. Now includes a covert channel
Branch: master
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.

cwtoolkit version 0.3b

joshua davis (cwtoolkit -*-


This was designed for Linux, with Python 2.7. This software was created for proof-of-concept demonstration of a covert channel. This is not production grade. It does do a pretty good job of encoding, and decoding as long as the input isn't too noisy. It does have the capability of forming statistics from the CW message, which may be unique among such systems. If you have trouble using the decoder, adjust the amplification, offset, and other relevant parameters.

Required packages include: numpy, scipy, and scikits.audiolab Decode and generate statistics for Morse code from a wav audio file. Statistics include the average and standard deviation for intervals (dots, dashes, voids). Generate Morse code and optionally apply statistical variation and noise to it. E.g. you can determine the statistics of a signal using, then apply those statistics to a computer generated message using this tool. Gaussian noise can be added with user defined parameters. The statfile can be generated by (-o STATFILE). If statistics are given to via the -s switch, it will ignore the -w wpm switch and generate 'characterized' output; that is, the signal elements will be formulated according to the statistics in STATFILE. We use a normal distribution for this.


The -h switch gives help for any of the commands.

The transmitter and receiver now include the capability to send covert messages. This is done by varying the timing of the overt (carrier) message. See -h for usage information.

Transmitting and recovering covert messages

Send a covert message like this: $ ./ -m "this is a cover message" -o message.wav -s statfile -c "covert message" -k "secret"

The covert message must be shorter than the cover message.

Recovering a covert message is more difficult, due to sampling in digital systems, and radio effects on the signal. See the paper on for a more detailed explaination.

First, try this:
$ ./ -i message.wav -c statfile -k "secret"

Then mess with the tolerance and the filter. For a weak signal you may have to turn off the filter and reduce the tolerance, even to get the overt message:
$ ./ -i message.wav -c statfile -k "secret" -n -t 0.9


You can’t perform that action at this time.