Code Monkey home page Code Monkey logo

ciphersaber2's Introduction

ciphersaber2

Copyright © 2015 Bart Massey

This package provides a Haskell library and driver program implementing CipherSaber-2(CS2) stream encryption based on the RC4 stream encryption algorithm. This implementation has been tested against and is compatible with existing CipherSaber implementations.

CS2

The documentation for CS2 is a bit out-of-date and scattered.

History

CS2 is based on the RC4 stream cipher. Wikipedia has a nice history of RC4 as well as current reports on its cryptanalysis.

In 1999, Arnold Reinhold suggested using RC4 as the basis for citizens to learn to build their own encryption software, along the lines of Jedi Light Sabers. Reinhold proposed a stream protocol for RC4 ciphertext that he called CipherSaber (Note that the CipherSaber website is mostly abandoned and in some state of disrepair.)

In 2003, after cryptographic attacks were found against RC4 as used in CipherSaber, Reinhold modified the CipherSaber protocol to produce a new parameterized family of protocols known as CS2: the original CipherSaber is a special case of CS2, and is often referred to as CipherSaber-1.

Algorithm

Pseudocode for CS2 is available from a variety of places. The pseudocode given here attempts to be clear and normative.

CS2 encryption and decryption both require an RC4 implementation that has been modified to iterate the key schedule a given number of times.

-- Produce an RC4 keystream of length n with
-- r rounds of key scheduling given key k
rc4(nrk):
    l ← length k
    -- Initialize the array.
    S ← zero-based array of 256 bytes
    for i in 0..255
        S[i] ← i
    -- Do key scheduling.
    j ← 0
    repeat r times
        for i in 0..255
            j ← (j + S[i] + k[i mod l]) mod 256
            S[i] ↔ S[j]
    -- Finally, produce the stream.
    keystream ← zero-based array of n bytes
    j ← 0
    for i in 0..n-1
        i' ← (i + 1) mod 256
        j ← (j + S[i']) mod 256
        S[i'] ↔ S[j]
        keystream[i] ← S[(S[i'] + S[j]) mod 256]
    return keystream

CS2 encryption requires a plaintext message (treated as a bytestream), a key, and an "initial value" (IV) of 10 bytes. The key should be no more than 53 bytes, to ensure good mixing during key scheduling.

The IV is a nonce that must be different for each message sent: it should be chosen randomly if possible, but may be chosen pseudo-randomly or even just counted if necessary. CS2 appends the IV to the CS2 key to produce an RC4 key. RC4 uses only the first 256 RC4 key bytes. Thus, the CS2 key must be no more than 246 bytes: a longer CS2 key would cause some or all of the IV to not be used by RC4.

-- Ciphersaber-2 encrypt message m with key k and
-- r rounds of key scheduling
encrypt(mrk):
     n ← length m
     iv ← appropriately-chosen 10-byte IV
     k' ← prepend k to iv
     keystream ← rc4(nr, k')
     ciphertext ← zero-based array of n + 10 bytes
     for i in 0..9
         ciphertext[i] ← iv[i]
     for i in 0..n
         ciphertext[i + 10] ← m[ixor keystream[i]
     return ciphertext

CS2 decryption requires ciphertext and the encryption key used to produce the ciphertext.

-- Ciphersaber-2 decrypt ciphertext m with key k and
-- r rounds of key scheduling
decrypt(mrk):
     n ← length m
     iv ← m[0..9]
     delete the first 10 characters of m
     k' ← prepend k to iv
     keystream ← rc4(n - 10, r, k')
     plaintext ← zero-based array of n - 10 bytes
     for i in 0..n-10
         plaintext[i] ← m[ixor keystream[i]
     return plaintext

Library

The CipherSaber2 library provides a relatively straightforward ByteString interface. See the haddock documentation for details.

Driver

The program cs2 uses the CipherSaber2 library to encrypt or decrypt stdin to stdout.

cs2 is written in Haskell, so you will need a Haskell installation to run it. It depends on the package [parseargs](http://hackage.haskell.org/package/parseargs) from Hackage, as well as the bytestring package that should probably have come with your distribution but may need to be installed. Say "cabal install parseargs" and "cabal install bytestring" to get things set up. (This in turn may require a cabal-install package from your Linux distribution or thereabouts.)

Say "runghc cs2.hs --help" for usage information.

Say "runghc cs2.hs -e whee <f.txt >g.cs2" to encrypt the file f.txt with key whee. An IV will be automatically chosen.

Say "runghc cs2.hs -d whee <g.cs2 >ff.txt" to decrypt the file g.cs2 with key whee.

Test Instances

The test directory include a bunch of plaintext/ciphertext pairs taken from the original CS2 materials. Please see README.md in that directory for more information.

License

This work is licensed under the "MIT License". Please see the file LICENSE in the source distribution of this software for license terms.

ciphersaber2's People

Contributors

bartmassey avatar cwalexand avatar

Stargazers

 avatar  avatar mva1985 avatar Micah Burnett avatar Daniel Kahlenberg avatar

Watchers

 avatar evandrix avatar James Cloos avatar mva1985 avatar Micah Burnett avatar Teal Dulcet avatar  avatar

ciphersaber2's Issues

Maximum or maximum key size?

Quoth the readme:

... a key with a recommended maximum size of 53 bytes and a required maximum size of 256 bytes ...

It seems like either the first one should say "minimum," or else "recommended" and "required" should be swapped, but I don't know which.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.