Skip to content

Instantly share code, notes, and snippets.

@jogonba2
Created September 2, 2015 16:59
Show Gist options
  • Save jogonba2/68a6afe313a0cc0ee7fb to your computer and use it in GitHub Desktop.
Save jogonba2/68a6afe313a0cc0ee7fb to your computer and use it in GitHub Desktop.
DES encryption
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# DES.py
#
# Author: Overxfl0w13
import binascii
def header():
print """
____ _____ ____ ____ ______ ______ _____
| _ \| ____/ ___| / ___| _ \ \ / / _ \_ _|
| | | | _| \___ \ | | | |_) \ V /| |_) || |
| |_| | |___ ___) | | |___| _ < | | | __/ | |
|____/|_____|____/ \____|_| \_\|_| |_| |_|
"""
### UTILS ###
def leftRotate(b,n):
for shift in xrange(n): b = b[1:len(b)] + b[0]
return b
def getBitString(s): return bin(int(binascii.hexlify(s),16))[2:]
def halved(b): return (b[0:len(b)/2],b[(len(b)/2):])
def addPadding(s):
while len(s)%64!=0: s += "0"
return s
def split64blocks(s):
blocks,i = [],0
while (i*64)<len(s):
blocks.append(s[64*i:64*(i+1)])
i += 1
return blocks
def makePermutation(b,pc): return "".join([b[x-1] for x in pc])
def computeSBox(block6,sBox):
row,col = int(block6[0]+block6[len(block6)-1],2),int(block6[1:len(block6)-1],2)
r = bin(sBox[row][col])[2:]
while len(r)!=4: r = "0"+r
return r
def make16keys(c0,d0,shiftsSchedule,pc2):
cc0,cd0,keys = c0,d0,[(c0+d0)]
for i in xrange(16):
cc0,cd0 = leftRotate(cc0,shiftsSchedule[i]),leftRotate(cd0,shiftsSchedule[i])
keys.append(makePermutation(cc0+cd0,pc2))
return keys
def computeF(r,k,expansionTable):
eR = makePermutation(r,expansionTable)
eRxK = xor(k,eR)
print "ER:",eR
print "Key:",k
print "Result:",xor(k,eR)
blocks6 = blocks6Bits(eRxK)
sBoxed,i = [],0
for SBOX in SBOXES: sBoxed.append(computeSBox(blocks6[i],SBOX)) ; i+=1
sBoxed = "".join(sBoxed)
print "SBoxed: ",sBoxed
sBoxed = makePermutation(sBoxed,P)
print "Permuted: ",sBoxed
return sBoxed
def xor(x,y): return "".join(['1' if x[i]!=y[i] else '0' for i in xrange(len(x))])
def blocks6Bits(s):
blocks,i = [],6
while i<=len(s): blocks.append(s[i-6:i]); i+=6
return blocks
### DES ###
PC1 = [ 57,49, 41,33, 25, 17, 9,
1,58, 50,42, 34, 26,18,
10, 2, 59,51, 43, 35,27,
19,11, 3,60, 52, 44,36,
63,55, 47,39, 31, 23,15,
7,62, 54,46, 38, 30,22,
14, 6, 61,53, 45, 37,29,
21,13, 5,28, 20, 12, 4 ]
PC2 = [ 14, 17,11, 24, 1, 5,
3, 28,15, 6, 21,10,
23, 19,12, 4, 26, 8,
16, 7,27, 20, 13, 2,
41, 52,31, 37, 47,55,
30, 40,51, 45, 33,48,
44, 49,39, 56, 34,53,
46, 42,50, 36, 29,32 ]
IPR = [ 58, 50,42, 34, 26,18, 10, 2,
60, 52,44, 36, 28,20, 12, 4,
62, 54,46, 38, 30,22, 14, 6,
64, 56,48, 40, 32,24, 16, 8,
57, 49,41, 33, 25,17, 9, 1,
59, 51,43, 35, 27,19, 11, 3,
61, 53,45, 37, 29,21, 13, 5,
63, 55,47, 39, 31,23, 15, 7 ]
S1 = [[14,4,13,1, 2,15,11,8, 3,10, 6, 12, 5,9, 0,7],
[0, 15, 7,4,14,2,13,1,10,6,12,11, 9,5, 3,8],
[4,1,14,8,13,6, 2,11,15,12, 9,7, 3,10, 5,0],
[15, 12, 8,2, 4,9, 1,7, 5, 11, 3, 14,10,0, 6,13]]
S2 = [[15,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10],
[3,13,4,7,15,2,8,14,12,0,1,10,6,9,11,5],
[0,14,7,11,10,4,13,1,5,8,12,6,9,3,2,15],
[13,8,10,1,3,15,4,2,11,6,7,12,0,5,14,9]]
S3 = [[10,0,9,14,6,3,15,5,1,13,12,7,11,4,2,8],
[13,7,0,9,3,4,6,10,2,8,5,14,12,11,15,1],
[13,6,4,9,8,15,3,0,11,1,2,12,5,10,14,7],
[1,10,13,0,6,9,8,7,4,15,14,3,11,5,2,12] ]
S4 = [[7,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15],
[13,8,11,5,6,15,0,3,4,7,2,12,1,10,14,9],
[10,6,9,0,12,11,7,13,15,1,3,14,5,2,8,4],
[3,15,0,6,10,1,13,8,9,4,5,11,12,7,2,14]]
S5 = [[2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9],
[14,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6],
[4,2,1,11,10,13,7,8,15,9,12,5,6,3,0,14],
[11,8,12,7,1,14,2,13,6,15,0,9,10,4,5,3]]
S6 = [[12,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11],
[10,15,4,2,7,12,9,5,6,1,13,14,0,11,3,8],
[9,14,15,5,2,8,12,3,7,0,4,10,1,13,11,6],
[4,3,2,12,9,5,15,10,11,14,1,7,6,0,8,13]]
S7 = [[4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1],
[13,0,11,7,4,9,1,10,14,3,5,12,2,15,8,6],
[1,4,11,13,12,3,7,14,10,15,6,8,0,5,9,2],
[6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12]]
S8 = [[13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7],
[1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2],
[7,11,4,1,9,12,14,2,0,6,10,13,15,3,5,8],
[2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11]]
SBOXES = [S1,S2,S3,S4,S5,S6,S7,S8]
expansionTable = [ 32, 1, 2, 3, 4, 5,
4, 5, 6, 7, 8, 9,
8, 9,10, 11, 12,13,
12, 13,14, 15, 16,17,
16, 17,18, 19, 20,21,
20, 21,22, 23, 24,25,
24, 25,26, 27, 28,29,
28, 29,30, 31, 32, 1 ]
shiftsSchedule = [1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1]
P = [16,7,20,21,
29,12,28,17,
1,15,23,26,
5,18,31,10,
2,8,24,14,
32,27,3,9,
19,13,30,6,
22,11,4,25]
INVIP = [ 40,8,48,16,56,24,64,32
,39,7,47,15,55,23,63,31
,38,6,46,14,54,22,62,30
,37,5,45,13,53,21,61,29
,36,4,44,12,52,20,60,28
,35,3,43,11,51,19,59,27
,34,2,42,10,50,18,58,26
,33,1,41,9,49,17,57,25 ]
if __name__ == '__main__':
header()
pt = getBitString(raw_input("Msg> "))
print "\n\n ***** MSG ANALYSIS ***** \n\n"
print "Plain text:",pt,"\n"
pt = addPadding(pt)
print "Plain text padded:",pt,"\n"
blocks64 = split64blocks(pt)
print "64 bit blocks:",blocks64,"\n"
key = getBitString(raw_input("Key> ")) # 64 bits key, else key will be padded ******* #
print "\n\n ***** KEY ANALYSIS ***** \n\n"
print "Key:",key,"\n"
key = addPadding(key)
print "Key padded:",key,"\n"
key = makePermutation(key,PC1)
print "Permuted key with PC1:",key
hKey = halved(key)
print "Halved key:",hKey,"\n\n\n"
keys = make16keys(hKey[0],hKey[1],shiftsSchedule,PC2)
print "Generated keys:",keys,"\n\n"
print "\n\n ****** Initialize encryption *****\n\n"
ciphered,auxCiph = "",""
for i in xrange(len(blocks64)):
print "\n ***** BLOCK,",i,"*****\n"
IP = makePermutation(blocks64[i],IPR)
print "Initial permutation (IP):",IP,"\n"
hIP = halved(IP)
L0,R0 = hIP[0],hIP[1]
actL,actR,antL,antR = L0,R0,L0,R0
print "Halved IP:",hIP[0],"-",hIP[1],"\n"
## 16 stages ##
for i in xrange(1,17):
print "\n\n ***** STAGE",i,"***** \n\n"
antL,antR = actL,actR
actL,actR = antR,xor(antL,computeF(antR,keys[i],expansionTable))
print "AntL="+antL,"\nAntR="+antR,"\n"
print "ActL="+actL,"\nActR="+actR,"\n"
auxCiph = makePermutation(actR+actL,INVIP)
ciphered += hex(int(auxCiph,2))[2:-1]
print "Ciphered:",ciphered.upper()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment