Guest User

Untitled

a guest
Oct 20th, 2017
27
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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])
Add Comment
Please, Sign In to add comment