Advertisement
Guest User

Untitled

a guest
Feb 23rd, 2019
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.74 KB | None | 0 0
  1. #!/usr/bin/python
  2. import sys
  3.  
  4. def matmult(a,b):
  5.     zip_b = zip(*b)
  6.     return [[sum(ele_a*ele_b for ele_a, ele_b in zip(row_a, col_b))# % 256
  7.              for col_b in zip_b] for row_a in a]
  8.  
  9. ROWLEN = 3
  10. KEYLEN = ROWLEN * ROWLEN
  11.  
  12. KEY_MATRIX = [[-0.0863521, -0.386043, -0.876948], [-0.32937, 0.158125, -0.12726], [0.583477, 0.423473, 0.941312]]
  13.  
  14. def transposeMatrix(m):
  15.     return map(list,zip(*m))
  16.  
  17. def getMatrixMinor(m,i,j):
  18.     return [row[:j] + row[j+1:] for row in (m[:i]+m[i+1:])]
  19.  
  20. def getMatrixDeternminant(m):
  21.     #base case for 2x2 matrix
  22.     if len(m) == 2:
  23.         return m[0][0]*m[1][1]-m[0][1]*m[1][0]
  24.  
  25.     determinant = 0
  26.     for c in range(len(m)):
  27.         determinant += ((-1)**c)*m[0][c]*getMatrixDeternminant(getMatrixMinor(m,0,c))
  28.     return determinant
  29.  
  30. def mtx_inv(m):
  31.     determinant = getMatrixDeternminant(m)
  32.     #special case for 2x2 matrix:
  33.     if len(m) == 2:
  34.         return [[m[1][1]/determinant, -1*m[0][1]/determinant],
  35.                 [-1*m[1][0]/determinant, m[0][0]/determinant]]
  36.  
  37.     #find matrix of cofactors
  38.     cofactors = []
  39.     for r in range(len(m)):
  40.         cofactorRow = []
  41.         for c in range(len(m)):
  42.             minor = getMatrixMinor(m,r,c)
  43.             cofactorRow.append(((-1)**(r+c)) * getMatrixDeternminant(minor))
  44.         cofactors.append(cofactorRow)
  45.     cofactors = transposeMatrix(cofactors)
  46.     for r in range(len(cofactors)):
  47.         for c in range(len(cofactors)):
  48.             cofactors[r][c] = cofactors[r][c]/determinant
  49.     return cofactors
  50.  
  51.  
  52. def encrypt(f, f2, v):
  53.     print "Plaintext: ", "".join(chr(x) for r in [[0x25, 0x50, 0x44], [0x46, 0x2d, 0x31], [0x2e, v]] for x in r)
  54.    
  55.     f = f.read()
  56.     if len(f) % KEYLEN:
  57.         f = f + '\x00' * (KEYLEN - len(f) % KEYLEN)
  58.  
  59.     f_len = len(f)
  60.     plaintext = [[0x25 + 0., 0x50, 0x44], [0x46, 0x2d, 0x31], [0x2e, v, 0x0a]]
  61.     cyphertext = [[0x70, 0xe1, 0xcf], [0x8e, 0x65, 0xc6], [0xc9, 0xd0, 0xe2]]
  62.     X = matmult(mtx_inv(plaintext), cyphertext)
  63.     KEY_MATRIX = mtx_inv(X)
  64.     for i in range(f_len / KEYLEN):
  65.         block = f[i*KEYLEN:(i+1)*KEYLEN]
  66.  
  67.         matrix = [[0 for j in range(ROWLEN)] for jj in range(ROWLEN)]
  68.         for j in range(ROWLEN):
  69.             for jj in range(ROWLEN):
  70.                 matrix[j][jj] = ord(block[j*ROWLEN+jj])
  71.         y = matmult(matrix, KEY_MATRIX)
  72.         if i == 0:
  73.             print(y)
  74.             print(''.join([chr(int(round(item)) % 256) for sublist in y for item in sublist]))
  75.             sys.stdout.flush()
  76.         f2.write(''.join([chr(int(round(item))) for sublist in y for item in sublist]))
  77.  
  78. if __name__ == "__main__":
  79.     for ver in "1234567":
  80.         f = open(sys.argv[1], "rb")
  81.         f2 = open("try" + ver + ".pdf", "wb")
  82.         encrypt(f, f2, ord(ver))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement