Crypto

from Crypto.Cipher import AES
from Crypto.Cipher import XOR
from Crypto.Hash import SHA256
from Crypto.Hash import MD5

import base64
import os

# SHA - returns a string 64 chars
print "SHA: " + SHA256.new('mep').hexdigest()
# ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad

# FILE MD5
def get_file_checksum(filename):
    h = MD5.new()
    chunk_size = 8192
    with open(filename, 'rb') as f:
        while True:
            chunk = f.read(chunk_size)
            if len(chunk) == 0:
                break
            h.update(chunk)
    return h.hexdigest()

print 'MD5: ' + get_file_checksum("char1.txt")

## AES
msg_text = '26cb20dfb5cb1c68413389bbbe7fead5'.rjust(32)
secret_key = '6d616a610c0c0c0c0c0c0c0c0c0c0c0c' 

cipher = AES.new(secret_key,AES.MODE_ECB)
encoded = base64.b64encode(cipher.encrypt(msg_text))
decoded = cipher.decrypt(base64.b64decode(encoded))

print "AES - decoded: " + decoded.strip()
print "AES - ENCRYPT: " +cipher.encrypt(msg_text)


## XOR of ciphers

c1 = '6f7bcef0dd3299ce4d26de3333e389e4'
c2 = '10800d42f36793d76dbc9541ce5b75f6'
cX = '7ffbc3b22e550a19209a4b72fdb8fc12'

def xor_strings(xs, ys):
    xs = xs.decode("hex")   # Decode both strings to hex
    ys = ys.decode("hex")
    return "".join(chr(ord(x) ^ ord(y)) for x, y in zip(xs, ys))

xored = xor_strings(c1, c2).encode("hex")
print "XOR: " + xored  # 7ffbc3b22e550a19209a4b72fdb8fc12

p1 = '6e616d650c0c0c0c0c0c0c0c0c0c0c0c'
p2 = '6a6f6b650c0c0c0c0c0c0c0c0c0c0c0c'
pX = '40e0600000000000000000000000000'

# XORs two string
def strxor(a, b):     # xor two strings (trims the longer input)
    return "".join([chr(ord(x) ^ ord(y)) for (x, y) in zip(a, b)])

'''
XOR EXPLANATION
=================================================================
Plain Text1: 0001011    Plain Text2: 0110011
Key        : 1010110    Key        : 1010110
Ciphertext : 1011101    Ciphertext : 1100101

XOR of ciphertexts  XOR of plaintexts (which of course match)
1011101         0001011
1100101         0110011
0111000         0111000
'''