I recently needed a quick & easy encryption scheme. I wanted it to be super portable, and I wanted to spend as little time as possible putting it together. So I threw together a little utility called XCRYPT, in python, that just does an XOR against a source string and Base-64 encodes the result. Or visa-versa to decrypt it.
I was going to replicate it in Java, but ran out of time and interest.
It just does a fast XOR against a random string to encrypt and decrypt the bytes. I don’t think I put in logic to roll around the end of the random string, so you’re limited to short strings — but that’s all I needed it for. The security is only as good as you are able to secure the random string, but the little encrypted snippets should be almost (emphasis on “almost”) as secure as one-time-pad encryption, provided you don’t let the random key string get out.
I don’t think it’s particularly useful, with all the standard encryption libraries around, but it was fun to write.
from random import getrandbits, randint from base64 import standard_b64encode, standard_b64decode from itertools import izip import struct import array import sys def _generate_keys() : ''' generate a new keys string ''' bits = (getrandbits(8) for x in xrange(0,57 * 101)) a = array.array('B',bits) encoded = standard_b64encode(a).strip() return encoded def generate_keys_file(): ''' embed the generated keys string into a python statement ''' keys = _generate_keys() print 'KEYS_B64="%s"' %keys def _xor(string,keys,key): ''' xor the string against the KEY string, using key as the offset ''' z = (chr(ord(x) ^ ord(y)) for (x,y) in izip(string,keys[key:])) return ''.join(z) def xcrypt(string, key): ''' run an xor on the string using the key. If the key is None, create one and base64 encode the result. If the key is provided, base64 decode the string and use the key. ''' # you have to create a key string and put it in xcrypt_keys.py first import xcrypt_keys keys = standard_b64decode(xcrypt_keys.KEYS_B64) if key is None : key = randint(0,len(keys) - len(string) - 1) xored=standard_b64encode(_xor(string,keys,key)).strip() else: string = standard_b64decode(string).strip() xored=_xor(string,keys,key) return xored,key if __name__ == '__main__' : ''' main function ''' if len(sys.argv) > 1 and 'generate' == sys.argv : generate_keys_file() else: if len(sys.argv) > 1 : input = sys.argv else : input = sys.stdin.read() a,k = xcrypt(input,None) b,k = xcrypt(a,k) print k,a,b