This was much harder than it should have been. While this is the certainly the most trivial post on crypto-math on the webs, I wanted to share my MATLAB xor code in the hope that I save someone else’s time. It is a basic property of cryptography that a one time pad must be used only once. A example like this makes it very concrete:
Suppose you are told that the one time pad encryption of the message “attack at dawn” is 09e1c5f70a65ac519458e7e53f36 (the plaintext letters are encoded as 8-bit ASCII and the givenciphertext is written in hex). What would be the one time pad encryption of the message “attack at dusk” under the same OTP key?
Let $m_0$ be the message “attack at dawn”, then $m_1$ is the message “attack at dusk”, and $c_1$, $c_2$ the corresponding ciphertexts. If $p$ is the one-time pad (OTP) that encrypts the message, we then have:
$$ c_0 = m_0 \oplus p$$
So we can obtain the one-time pad by performing an XOR of the ciphertext with the plaintext:
$$ p = c_0 \oplus m_0 \text{.}$$
This enables us to encrypt the new message without using the OTP explicitly:
$$c_1 = m_1 \oplus p = m_1 \oplus \left(c_0 \oplus m_0 \right) = c_0 \oplus (m_0 \oplus m_1) \text{.}$$
You could truncate down to the only characters that are different, but since I’m writing a script for this, I didn’t bother.
In python this would be super short:
def strxor(s1,s2):
return ''.join(chr(ord(a) ^ ord(b)) for a,b in zip(s1,s2))
strxor(strxor("6c73d5240a948c86981bc294814d".decode('hex'), "attack at dawn"), "attack at dusk").encode('hex')
>>>'6c73d5240a948c86981bc2808548'
But, the government won’t allow me to have python on my laptop and I need to use matlab.
Some Helpful Links
- My course slides: http://spark-university.s3.amazonaws.com/stanford-crypto/slides/02-stream-v2-annotated.pdf
- Another Solution: http://crypto.stackexchange.com/questions/10534/how-to-decode-an-otp-message
- Some good general info: http://www.binaryvision.nl/3075/statistical-test/
Leave a Reply