View difference between Paste ID: B9UbjSG5 and nwTf6zts
SHOW: | | - or go back to the newest paste.
1
import sys
2
import numpy as np
3
import random
4
import os.path
5
from simplecrypt import encrypt,decrypt
6
from Crypto.Hash import SHA
7
from Crypto.Util import number
8
9
prime_value_q = number.getPrime(160)
10
maxFeatures=0
11
stDev=2
12
mean=10
13
history_file_name=""
14
newUser = True
15
h = 5
16
ti =10
17
18
class Poly:
19
  coeff = []
20
  def __init__(self, coeff):
21
    self.coeff = coeff
22
23
  def val(self, x):
24
    sum_val = 0
25
    for i, value in enumerate(self.coeff):
26
      sum_val = sum_val + value*pow(x, i)
27
    return sum_val
28
29
def poly_gen(m_minustwo,hpwd):
30
    coefficient = [hpwd] + random.sample(xrange(100), m_minustwo)
31
    return Poly(coefficient)
32
33
def alphaTrue(pswd, i, coeffList):
34
    i=i+1
35
    #Get SHA
36
    sha = SHA.new(str(2*i) + pswd).hexdigest()
37
    #Format SHA from str to long
38
    fmtSHA = long(''.join([str(ord(h)) for h in sha]))
39
    #calc Alpha Value
40
    A=coeffList.val(2*i) + (fmtSHA % prime_value_q)
41
    #print "ALPHA  ", coeffList.val(2*i)
42
    #print "ALPHA  %s %s %s %s" % (i, (2 * i), pswd, fmtSHA)
43
    return A
44
45
def alphaFalse(pswd, i):
46
    pswd=pswd + str(random.randrange(0, 1000))
47
    i=i + 1
48
    coeffList = poly_gen(maxFeatures - 5, random.randrange(0, prime_value_q - 1))
49
    # Get SHA
50
    sha = SHA.new(str(2 * i) + pswd).hexdigest()
51
    # Format SHA from str to long
52
    fmtSHA = long(''.join([str(ord(h)) for h in sha]))
53
    # calc Alpha Value
54
    A = coeffList.val(2 * i) + (fmtSHA % prime_value_q)
55
    return A
56
57
def betaTrue(pswd, i, coeffList):
58
    i=i+1
59
    #Get SHA
60
    sha = SHA.new(str(2*i+1) + pswd).hexdigest()
61
    #print "SHA:",sha
62
    #Format SHA from str to long
63
    fmtSHA = long(''.join([str(ord(h)) for h in sha]))
64
    #calc Beta Value
65
    B=coeffList.val(2*i+1) + (fmtSHA % prime_value_q)
66
    #print "BETA  ", coeffList.val(2*i+1)
67
    #print "BETA  %s %s %s %s" % (i, (2 * i + 1), pswd, fmtSHA)
68
    return B
69
70
def betaFalse(pswd, i):
71
    pswd=pswd + str(random.randrange(0, 1000))
72
    i=i + 1
73
    coeffList = poly_gen(maxFeatures - 5, random.randrange(0, prime_value_q - 1))
74
    # Get SHA
75
    sha = SHA.new(str(2 * i+1) + pswd).hexdigest()
76
    # Format SHA from str to long
77
    fmtSHA = long(''.join([str(ord(h)) for h in sha]))
78
    # calc Beta Value
79
    B = coeffList.val(2 * i+1) + (fmtSHA % prime_value_q)
80
    return B
81
82
def instrTblGenerator(pswd, featuresList):
83
    instrTbl=[]
84
    avgFeatureSpeed = np.mean(featuresList, axis=0)
85
    sigma = np.std(featuresList, axis=0)
86
    hpwd = random.randrange(0, prime_value_q - 1)
87
    #print "encrypt    " , hpwd
88
    coeffList = poly_gen(maxFeatures - 1, hpwd)
89
90
91
92
    for i in range(maxFeatures):
93
94
95
        if ((i < len(avgFeatureSpeed)) and ((abs(avgFeatureSpeed[i] - mean) - 0.0001) > (stDev * sigma[i]))):
96
            #print "mean:%s avg spd:%s"%(mean,avgFeatureSpeed[i])
97
            if (avgFeatureSpeed[i] < mean):
98
                # Fast: beta=Random  alpha=TRUE
99
                #print "ALPHA FAST"
100
101
                A=alphaTrue(pswd, i, coeffList)
102
                B = betaFalse(pswd, i)
103
                instrTbl.append([A, B])
104
               # print "Alpha:%s   Beta: %s"%(A,B)
105
106
            else:# SLOW: beta=TRUE  alpha=Random
107
108
                #print "BETA FAST"
109
110
                A = alphaFalse(pswd, i)
111
                B = betaTrue(pswd, i, coeffList)
112
                instrTbl.append([A, B])
113
             #   print "Alpha:%s   Beta: %s" % (A, B)
114
115
116
        else:# Neither: beta=TRUE  alpha=TRUE
117
118
            #print "mean:%s avg spd:%s" % (mean, avgFeatureSpeed[i-1])
119
            #print "SAME"
120
            A = alphaTrue(pswd, i, coeffList)
121
            B = betaTrue(pswd, i, coeffList)
122
            instrTbl.append([A, B])
123
            #print "Alpha:%s   Beta: %s\n" % (A, B)
124
125
126
    return [hpwd, instrTbl]
127
128
#CHANGE UP
129
def DecryptFromFile(key):
130
  with open(history_file_name+'.hf', 'rb') as f:
131
    cipher_text = f.read()
132
  pad, plain_text = decrypt(key, cipher_text).split("````")
133
  return plain_text
134
135
def hist_gen(hpwd,featuresList):
136
    features2str = ''
137
138
    for i in xrange(1, len(featuresList)):
139
        features2str += ','.join([str(j) for j in featuresList[i]]) + '\n'
140
        paddedfeatures2str = "````" + features2str
141
    strhpwd=SHA.new(str(hpwd)).hexdigest()
142
    ciphertext = encrypt(strhpwd, paddedfeatures2str.rjust(800, '^'))
143
    file = open((history_file_name+".hf"), "w")
144
    file.write(ciphertext)
145
    file.close()
146
147
148
'''def file_parser(inFile):
149
    global maxFeatures
150
    i=0
151
    featuresList =[]
152
    while i < len(inFile):
153
        pswd=inFile[i]
154
        i = i + 1
155
        #convert features from string to int
156
        features = map(int,inFile[i].split(','))
157
158
        if (len(pswd) - 2 != len(features)):
159
160
            print 'Feature and password do not match!'
161
            sys.exit()
162
        maxFeatures = len(pswd) - 1
163
        featuresList.append(features)
164
        i = i + 1
165
    return pswd,featuresList'''
166
#CHANGE UP
167
def lamb(x_array,i):
168
    mult = 1
169
    for j in range(len(x_array)):
170
        if j!=i:
171
            mult = mult*(x_array[j]/(x_array[j]-x_array[i]))
172
    return mult
173
174
#CHANGE UP
175
#this is our Lagrange function, which takes x,y pairs and q to recreate hpwd
176
def Lagrange(x_array, y_array):
177
    sum = 0
178
    for i in range(len(y_array)):
179
        #this calls the lambda function which creates uses the x values to create the coefficient to multiply y with
180
        lam = lamb(x_array,i)
181
        #this is where we sum the array
182
        sum = sum + (lam * y_array[i])
183
    return sum
184
185
# lagrange interpolation to get h_pwd from xy values
186
def h_pwdLagrange(x,y, feature_num):
187
  h_pwd = 0
188
  nums = []
189
  dens = []
190
  dens_sum = 1
191
  for i in xrange(0, feature_num):
192
    lambda_num = 1
193
    lambda_den = 1
194
    for j in xrange(0, feature_num):
195
      if (i != j):
196
        lambda_num *= x[j]
197
        lambda_den *= x[j] - x[i]
198
    nums.append(lambda_num * y[i])
199
    dens.append(lambda_den)
200
  for i in xrange(0, len(nums)):
201
    h_pwd += get_Num(i, nums, dens)
202
    dens_sum *= dens[i]
203
  return h_pwd/dens_sum # floor division to avoide float conversion
204
205
#used to minimize the divisions
206
def get_Num(index, nums, dens):
207
  num = 1
208
  for i in xrange(0, len(nums)):
209
    if i == index:
210
      num *= nums[i]
211
    else:
212
      num *= dens[i]
213
  return num
214
215
216
def login(features,instrTbl,password):
217
    ys=[]
218
    alphas = []
219
    betas = []
220
    xs = []
221
    # parse the instruction table to list of alpha and list of beta
222
    i = 1
223
    j = 0
224
    # password = alpha if features < ti , password = beta if features>=ti
225
226
227
    for f in features:
228
        if f < ti:
229
            sha = SHA.new(str(2 * i) + password).hexdigest()
230
            sha = long(''.join([str(ord(h)) for h in sha]))
231
            p = instrTbl[j][0] - sha % prime_value_q
232
            #print "Decrypt alph   ", p
233
            #print "Decrypt alph  %s %s %s %s" %( i, (2 * i), password, sha)
234
            ys.append(p)
235
            xs.append(2*i)
236
237
        else:
238
            sha = SHA.new(str(2 * i + 1) + password).hexdigest()
239
            sha = long(''.join([str(ord(h)) for h in sha]))
240
            p = instrTbl[j][1] - sha % prime_value_q
241
            #print "Decrypt beta   ", p
242
            #print "Decrypt beta  %s %s %s %s" % (i, (2 * i+1), password, sha)
243
            ys.append(p)
244
            xs.append(2*i+1)
245
        i = i + 1
246
        j = j + 1
247
    hpwd = h_pwdLagrange(xs, ys,maxFeatures)
248
    #print "decreypt       " , hpwd
249
    featuresList = []
250
    try:
251
        inst = DecryptFromFile(SHA.new(str(hpwd)).hexdigest()).strip()
252
253
        instList = inst.split("\n")
254
        #print "hist    ", instList
255
        if len(instList) == 6:
256
            instList = instList[1:]
257
        #print instList
258
        for i in instList:
259
            features = i.split(',')
260
            features = map(int, features)
261
            featuresList.append(features)
262
        #print featuresList
263
        return featuresList
264
        #features = content[i].split(',')
265
        # print features
266
        #features = map(int, features)
267
268
    except:
269
        return featuresList
270
271
272
273
274
275
276
277
'''def main(inFileName,hisfilename):
278
    global history_file_name, newUser
279
    history_file_name=hisfilename
280
281
    if os.path.exists((hisfilename+".hf")):
282
        newUser=False
283
    else:
284
        with open(inFileName, 'r') as inFile:
285
286
            pswd, featuresList = file_parser(inFile.readlines())
287
            print pswd, featuresList
288
            if not newUser:
289
290
                login(pswd)
291
            else:
292
                hpwd, instrTbl = instrTblGenerator(pswd, featuresList)
293
                hist_gen(hpwd, featuresList)'''
294
295
296
def main(filename):
297
    global maxFeatures, history_file_name
298
    featuresList=[]
299
    instrTbl=[]
300
    try:
301
        with open(filename, 'r') as f:
302
            content = f.read()
303
            #this is to handle the header!!! delete this if its not neccessary
304
            #content = content.split("\outl0\strokewidth0 \strokec2 ")[1][:-1]
305
            #########
306
            content = content.split()
307
    except:
308
        print("filename: " + filename + " is incorrect!")
309
        return
310
    i = 0
311
    j = 1
312
    while i < len(content):
313
        password = content[i]
314
        maxFeatures = len(password) - 1
315
        i = i + 1
316
        features = content[i].split(',')
317
        #print features
318
        features = map(int, features)
319
320
        #print "ooooo   ", j
321
        #print "features   ", features
322
        #print "Feature new    ", featuresList
323
        if j <= h:
324
            #print "features lest   ", len(featuresList)
325
            featuresList.append(features)
326
327
            print "1"
328
        if j == h:
329
            #print "i equals to h  "
330
            #create_inst
331
            hpwd, instrTbl = instrTblGenerator(password, featuresList)
332
            #creat_hist
333
            history_file_name = filename.split(".")[0]
334
            hist_gen(hpwd, featuresList)
335
        if j > h:
336
            #print "feature list size   ", len(featuresList)
337
            #print "i is fuck " ,i
338
            # if length of login return m_features is not 0
339
            #and then we are going to pass m_features to make a new hist and inst
340
            newFeaturesList = login(features,instrTbl,password)
341
342
            if len(newFeaturesList) != 0:
343
                print("1")
344
                featuresList = newFeaturesList
345
                featuresList.append(features)
346
                hpwd, instrTbl = instrTblGenerator(password, featuresList)
347
                hist_gen(hpwd, featuresList)
348
            else:
349
                print("0")
350
351
        i = i + 1
352
        j = j + 1
353
354
if __name__ == '__main__':
355
    main(sys.argv[1:][0])