Project

sixword

0.0
No commit activity in last 3 years
No release in over 3 years
Sixword implements the 6-word binary encoding created for S/Key (tm) and standardized by RFC 2289, RFC 1760, and RFC 1751. Binary data may be encoded using a dictionary of 2048 English words of 1-4 characters in length. Each block of 64 bits is encoded using 6 words, which includes 2 parity bits. It is ideal for transmitting binary data such as cryptographic keys where humans must communicate or enter the values. See also: Bubble Babble, PGP Word List, Diceware, Base64, Base32
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
 Dependencies

Development

>= 0
>= 0
~> 3.0
~> 0.49
>= 0
~> 2.2
 Project Readme

Sixword

Gem Version Build status Code Climate Inline Docs

Sixword implements the 6-word binary encoding created for S/Key (tm) and standardized by RFC 2289, RFC 1760, and RFC 1751. Binary data may be encoded using a dictionary of 2048 English words of 1-4 characters in length. Each block of 64 bits is encoded using 6 words, which includes 2 parity bits. It is ideal for transmitting binary data such as cryptographic keys where humans must communicate or enter the values.

Comparison to other encodings

See also: Bubble Babble, PGP Word List, Diceware, Base64, Base32

  • Bubble Babble does not use full words, so it is more difficult for humans to type or communicate over the phone.

  • The PGP Word List is optimized for communicating fingerprints, so it uses much longer and more distinct words. This is less convenient when you actually expect a human to type the whole sentence. Sixword handles error detection with the built-in parity bits.

  • Diceware is optimized for creating passphrases by a roll of standard 6-sided dice, so it uses a word list that is a power of 6. This is not very convenient as an encoding for arbitrary binary data.

  • Base64 is well suited as a machine encoding where an ASCII transport is desired. It is not very convenient for humans, and has no parity built in.

  • Base32 is somewhat better for humans than Base64 because it is case insensitive and doesn't include 0 or 1. However it is still not very convenient for humans to type or visually inspect.

Installation

Add this line to your application's Gemfile:

gem 'sixword'

And then execute:

$ bundle

Or install it yourself as:

$ gem install sixword

Usage: Command Line

Sixword operates similarly to base64(1), it operates on a file or on STDIN in two modes:

  • encode: accept binary data (or hexadecimal in hex modes) and print six-word encoded data on stdout.
  • decode: accept six-word encoded data and print binary data (or hex) on stdout.

Examples

Normal encoding and decoding

$ sixword <<< 'Testing'
BEAK NET SITE ROTH SWIM FORM

$ sixword -d <<< 'BEAK NET SITE ROTH SWIM FORM'
Testing

$ sixword -d <<< 'beak net site roth swim form'
Testing

The same data, but hex encoded

$ sixword -H <<< '54:65:73:74:69:6e:67:0a'
BEAK NET SITE ROTH SWIM FORM

$ sixword -dH <<< 'BEAK NET SITE ROTH SWIM FORM'
54657374696e670a

$ sixword -df <<< 'BEAK NET SITE ROTH SWIM FORM'
5465 7374 696E 670A

$ sixword -d -S colons <<< 'BEAK NET SITE ROTH SWIM FORM'
54:65:73:74:69:6e:67:0a

Error handling

$ sixword -d <<< 'BEAK NET SITE ROTH SWIM FOR'
sixword: Parity bits do not match
[exit status 3]

$ sixword -p <<< '.'
sixword: Must pad bytes to multiple of 8 or use pad_encode

Usage: Library

See the YARD documentation. The top-level Sixword module contains the main API (Sixword.encode and Sixword.decode), while various utilities can be found in Sixword::Hex and Sixword::Lib. Most of the code powering the command line interface is in Sixword::CLI.

>> require 'sixword'

>> Sixword.encode('Hi world')
=> ["ACRE", "ADEN", "INN", "SLID", "MAD", "PAP"]

>> Sixword.decode(["ACRE", "ADEN", "INN", "SLID", "MAD", "PAP"])
=> 'Hi world'

>> Sixword.decode("acre aden inn slid mad pap")
=> 'Hi world'

Contributing

  1. Fork it
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Add some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create new Pull Request