Skip to content

Instantly share code, notes, and snippets.

@macostag
Created January 20, 2018 22:29
Show Gist options
  • Save macostag/7b87ace2526869f50c942986070a4c7b to your computer and use it in GitHub Desktop.
Save macostag/7b87ace2526869f50c942986070a4c7b to your computer and use it in GitHub Desktop.
Generate test keys of 128 bits, and split into components. KCVs are automatically provided for each component and the whole key.
import binascii
import random
import hashlib
import base64
from pyDes import *
#XOR 3 components
def xorKeys(a,b,c):
result=int(c1) ^ int(c2) ^ int(c3)
key = hex(result)[2:-1]
if len(key) < 32:
padd = '0' * (32-len(key))
return padd + key
else:
return key
#Force parity
#Generate random key (No force Odd)
def generateRandomKey(length):
lkey = []
for e in range(length/4):
lkey.append(random.SystemRandom().choice("0123456789ABCDEF"))
return ''.join(lkey)
#3DES algorithm
def encrypt3DES(skey,sdata):
key = binascii.unhexlify(skey)
data = binascii.unhexlify(sdata)
key3DES = triple_des(key, ECB, "\0\0\0\0\0\0\0\0", pad=None, padmode=PAD_NORMAL)
encryptedData = key3DES.encrypt(data)
return encryptedData
#KCV is calculated by assuming the key/components are 3DES keys, and encrypting a string of binary zeroes.
def getKCV(skey):
zeroComp = '00000000000000000000000000000000'
encryptedKey = encrypt3DES(skey,zeroComp)
kcv = str(binascii.hexlify(encryptedKey)[0:6])
return kcv
#Generate component 1 (128 bits)
comp1 = generateRandomKey(128)
print "Component 1 (HEX Value): "
print comp1
print "KCV : " + getKCV(comp1).upper()
print ""
c1 = int(comp1,16)
#Generate component 2 (128 bits)
comp2 = generateRandomKey(128)
print "Component 2 (HEX Value): "
print comp2.upper()
print "KCV : " + getKCV(comp2).upper()
print ""
c2 = int(comp2,16)
#Generate component 3 (128 bits)
comp3 = generateRandomKey(128)
print "Component 3 (HEX Value): "
print comp3.upper()
print "KCV : " + getKCV(comp3).upper()
print ""
c3 = int(comp3,16)
#Combined key (128 bits)
resultKey = xorKeys(c1,c2,c3)
print "Combined Key : (HEX Value)"
print resultKey.upper()
print "KCV : " + getKCV(resultKey).upper()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment