nullprogram.com/blog/2009/04/26/
I have previously talked about arcfour
and CipherSaber and provided
implementations in C. For fun, I made an implementation of arcfour in
Emacs lisp (elisp), and built upon that to make a CipherSaber
implementation in elisp. Check it out with Git,
git clone git://github.com/skeeto/arcfour.git
If you don't have Git (yet), you can follow that link to use the web
interface. The relevant files are arcfour.el
and
ciphersaber.el
. There are some test vectors in there that
I won't show here. Here is the arcfour implementation,
For the sake of simplicity it uses some global variables to store the
cipher state. It would be better if the state was returned as a list,
continuation, or closure. That way we could run a bunch of different
ciphers at the same time.
And this provides interactive functions so that they can be called by
a user right on the buffer being used, with M-x rc4-buffer
.
You may run into encoding issues with encrypted regions. The
CipherSaber implementation below gets around this problem by turning
off multi-byte encoding with set-buffer-multibyte
.
In ciphersaber.el
we apply these functions. The
CipherSaber functions can be called with M-x
cs-encrypt-buffer
and M-x cs-decrypt-buffer
. Note
that this is only CipherSaber-1, and I leave CipherSaber-2 as an
exercise for the reader :-P.
I didn't bother with save-excursion
because I didn't
think it would be important where the point is in the middle of an
encrypted file. Feel free to add it, though!
These functions could be used to make a minor mode to transparently
encrypt and decrypt CipherSaber files. It could also be modified to
take advantage of Emacs' batch mode to handle CipherSaber
processing right from the shell. But those are other projects!