Advertisement
Guest User

Untitled

a guest
Jun 16th, 2016
162
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.32 KB | None | 0 0
  1. #!/usr/bin/env python2
  2. import sys
  3. import argparse
  4. import des
  5. import km
  6. import operator
  7. import time
  8. import threading
  9.  
  10.  
  11.  
  12.  
  13. def avg (n):
  14.     l = float(len(n))
  15.     return sum(n)/l
  16.  
  17.  
  18. def m_th(sbox, slow, fast,n,sbo, mask):
  19.    
  20.  
  21.     for key in range(64):
  22.         for k in range(n):
  23.             H = hamming_weight(sbo[key][k]&mask)
  24.             if H==0 or H==1:
  25.                 fast[sbox][key].append(t[k])                    
  26.             if H==4 or H==3:
  27.                 slow[sbox][key].append(t[k])
  28.  
  29.  
  30. class myThread (threading.Thread):
  31.     def __init__(self, sbox, slow,fast,n,sbo, mask):
  32.         threading.Thread.__init__(self)
  33.         self.sbox = sbox
  34.         self.slow = slow
  35.         self.fast = fast
  36.         self.n    = n
  37.         self.sbo  = sbo
  38.         self.mask = mask
  39.  
  40.  
  41.  
  42.  
  43.     def run(self):
  44.         m_th(self.sbox, self.slow, self.fast, self.n, self.sbo, self.mask)
  45. def main():
  46.    
  47.     if not des.check ():
  48.         sys.exit ("DES functional test failed")
  49.  
  50.     # *************************************
  51.     # * Check arguments and read datafile *
  52.     # *************************************
  53.     argparser = argparse.ArgumentParser(description="")
  54.     argparser.add_argument("datafile", metavar='file',
  55.                         help='')
  56.     argparser.add_argument("n", metavar='n', type=int,
  57.                         help='number of experiments to use')
  58.     args = argparser.parse_args()
  59.  
  60.     if args.n < 1:                                      # If invalid number of experiments.
  61.         sys.exit ("Invalid number of experiments: %d (shall be greater than 1)" % args.n)
  62.  
  63.     # Read encryption times and ciphertexts. n is the number of experiments to use.
  64.     read_datafile (args.datafile, args.n)
  65.     differance = {0:{},1:{},2:{},3:{},4:{},5:{},6:{},7:{}}
  66.     global slow
  67.     global fast
  68.     slow = []
  69.     fast = []
  70.     sbo  = []
  71.     for i in range(0,8):
  72.         slow.append([]);
  73.         fast.append([])
  74.         for j in range(0,64):
  75.             fast[i].append([])
  76.             slow[i].append([])
  77.             sbo.append([])
  78.     mask = 0xf0000000
  79.     subkey = 0x0
  80.     for key in range(64):
  81.         for k in range(0,args.n):
  82.             sbo[key].append( des.sboxes(des.e(des.right_half(des.ip(ct[k])))^subkey))
  83.         subkey  += 0x041041041041
  84.     mask = 0xf0000000
  85.     t1 = myThread(0, slow,fast,args.n,sbo, mask)
  86.     t2 = myThread(1, slow,fast,args.n,sbo, mask >>4)
  87.     t3 = myThread(2, slow,fast,args.n,sbo, mask >>8)
  88.     t4 = myThread(3, slow,fast,args.n,sbo, mask >>12)
  89.     t5 = myThread(4, slow,fast,args.n,sbo, mask >>16)
  90.     t6 = myThread(5, slow,fast,args.n,sbo, mask >>20)
  91.     t7 = myThread(6, slow,fast,args.n,sbo, mask >>24)
  92.     t8 = myThread(7, slow,fast,args.n,sbo, mask >>28)
  93.  
  94.  
  95.  
  96.     t1.start()
  97.     t2.start()
  98.     t3.start()
  99.     t4.start()
  100.     t5.start()
  101.     t6.start()
  102.     t7.start()
  103.     t8.start()
  104.  
  105.     threads = []
  106.  
  107.     threads.append(t1)
  108.     threads.append(t2)
  109.     threads.append(t3)
  110.     threads.append(t4)
  111.     threads.append(t5)
  112.     threads.append(t6)
  113.     threads.append(t7)
  114.     threads.append(t8)
  115.     for t in threads:
  116.         t.join()
  117.     res = ''
  118.     losning = []
  119.     for sbox in range(8):
  120.         for key in range(64):
  121.             differance[sbox][key] = (avg(slow[sbox][key]) - avg(fast[sbox][key]))
  122.         md = max(differance[sbox].values())
  123.         for subk in differance[sbox].keys():
  124.             if differance[sbox][subk] == md:
  125.                 losning.append(subk)
  126.     for i in range(len(losning)):
  127.         res = res + bin(losning[i])[2:].zfill(6)
  128.     print hex(int(res,2))
  129.  
  130. def read_datafile (name, n):
  131.     global ct, t
  132.  
  133.     if not isinstance (n, int) or n < 0:
  134.         raise ValueError('Invalid maximum number of traces: ' + str(n))
  135.  
  136.     try:
  137.         f = open (str(name), 'rb')
  138.     except IOError:
  139.         raise ValueError("cannot open file " + name)
  140.     else:
  141.         try:
  142.             ct = []
  143.             t = []
  144.             for _ in xrange (n):
  145.                 a, b = f.readline ().split ()
  146.                 ct.append (int(a, 16))
  147.                 t.append (float(b))
  148.                
  149.         except (EnvironmentError, ValueError):
  150.             raise ValueError("cannot read cipher text and/or timing measurement")
  151.         finally:
  152.             f.close ()
  153.  
  154. def hamming_weight (v):
  155.     v = v - ((v>>1) & 0x5555555555555555)
  156.     v = (v & 0x3333333333333333) + ((v>>2) & 0x3333333333333333)
  157.     return (((v + (v>>4) & 0xF0F0F0F0F0F0F0F) * 0x101010101010101) >> 56) & 0xFF
  158.  
  159. if __name__ == "__main__":
  160.     main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement