Xit/README.md

114 lines
3.8 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Xit - XOR It
Xit is a Python program that applies XOR to files. It's not designed to be used for cryptographic stuff, unless you know what you're doing or you want to hide from your little sister. Xit processes files in the memory and is not designed to treat huge data.
### Why?
All the current cryptosystem can be broken. It's just a question of (somewhat huge) time. Indeed, it actually exists an unbreakable cryptosystem. It's called the [One-time pad (OTP)](https://en.wikipedia.org/wiki/One-time_pad). But it needs:
* a shared key:
* which is as long as the clear text,
* which is to be used only once,
* which is truly random.
While the randomness is pretty good, it's hard to distribute a key as long as the clear text. Because a key is usable only once, one must generate a random key for each data. But the real issue is the key distribution. That's why modern cryptosystems are theorically weaker but useful.
So, why? In some cases, it's possible to use the OTP in special situations, such as the [red hotline](https://en.wikipedia.org/wiki/Moscow%E2%80%93Washington_hotline). Someone brings the keys from the Russian side to the USA side, and vice-versa... The program is also made to understand the underlying principles and play a bit with it.
### Use cases
#### Create random files
```Batchfile
xit ^ one two three --size 1M
```
The files one, two, and three are random files.
#### Single communication
Mister A wants to communicate a secret to Miss B, in file 'clear.txt'. Fortunately, two people can carry messages by two very different ways. So :
```Batchfile
xit clear.txt ^ a.xor b.xor
```
The file 'clear.txt' is split into two files 'a.xor' and 'b.xor'. A random key as long as the clear text is xored along with the clear text. Then you got the xored text and the key itself. Which is the key, which is then encrypted text? It's shuffled! So, the people carry the xor files to Miss B, who does:
```Batchfile
xit a.xor b.xor ^ clear.txt
```
The clear.txt file now contains the clear text. Getting the 'a.xor' and 'b.xor' alone won't help to decrypt the message. Of course, with both file it's easy to xor them back.
#### Multi channels communication
```Batchfile
xit clear.txt ^ a b c d e
```
splits a clear text into five chuncks.
```Batchfile
xit a b c d e ^ clear.txt
```
way back!
#### Multi steps communication
```Batchfile
xit clear.txt ^ a b c
xit a b c ^ x y # the keys a,b,c turned into keys x,y!
xit x y ^ clear.txt
```
Can be useful to reduce three keys to two.
#### Split to many files
```Batchfile
xit clear.txt ^ chunk-{10}.txt # Ten files with they own SHA1 fingerprint.
xit chunk* ^ clear.txt
```
#### Split to many files several times
```Batchfile
xit clear.txt ^ chunk-a-{10}.txt chunk-b-{15}.txt # Two groups, each of them giving 'clear.txt' back.
xit chunk-a-* ^ clear.txt
xit chunk-b-* ^ clear.txt
```
#### Split to many files several times and common keys
```Batchfile
xit clear.txt ^ _textkey_ chunk-a-{10}.txt chunk-b-{15}.txt # _textkey_ is a text key
xit chunk-a-* _textkey_ ^ clear.txt
xit chunk-b-* _textkey_ ^ clear.txt
```
Two sets of chunks but each of them needs the _textkey_ (without the underscores).
#### Three people, but only two of them to decrypt
```Batchfile
mkdir a b c
xit clear.txt ^ a/chunk-ab.txt b/chunk-ba.txt
xit clear.txt ^ a/chunk-ac.txt c/chunk-ca.txt
xit clear.txt ^ b/chunk-bc.txt c/chunk-cb.txt
# A, B, and C cannot do anything alone, but...
# A and B share their chunks:
xit a/chunk-ab.txt b/chunk-ba.txt ^ clear.txt
# B and C share their chunks:
xit b/chunk-bc.txt c/chunk-cb.txt ^ clear.txt
# A and C share their chunks:
xit a/chunk-ac.txt c/chunk-ca.txt ^ clear.txt
```
If you get all A, B, C's keys and xor them together, you can the clear back! It works because there are an odd number of holders. Guess what happens when the number is even?
```Batchfile
xit a/* b/* c/* ^ clear.txt
```