Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/python
- import sys
- def matmult(a,b):
- zip_b = zip(*b)
- return [[sum(ele_a*ele_b for ele_a, ele_b in zip(row_a, col_b))# % 256
- for col_b in zip_b] for row_a in a]
- ROWLEN = 3
- KEYLEN = ROWLEN * ROWLEN
- KEY_MATRIX = [[-0.0863521, -0.386043, -0.876948], [-0.32937, 0.158125, -0.12726], [0.583477, 0.423473, 0.941312]]
- def transposeMatrix(m):
- return map(list,zip(*m))
- def getMatrixMinor(m,i,j):
- return [row[:j] + row[j+1:] for row in (m[:i]+m[i+1:])]
- def getMatrixDeternminant(m):
- #base case for 2x2 matrix
- if len(m) == 2:
- return m[0][0]*m[1][1]-m[0][1]*m[1][0]
- determinant = 0
- for c in range(len(m)):
- determinant += ((-1)**c)*m[0][c]*getMatrixDeternminant(getMatrixMinor(m,0,c))
- return determinant
- def mtx_inv(m):
- determinant = getMatrixDeternminant(m)
- #special case for 2x2 matrix:
- if len(m) == 2:
- return [[m[1][1]/determinant, -1*m[0][1]/determinant],
- [-1*m[1][0]/determinant, m[0][0]/determinant]]
- #find matrix of cofactors
- cofactors = []
- for r in range(len(m)):
- cofactorRow = []
- for c in range(len(m)):
- minor = getMatrixMinor(m,r,c)
- cofactorRow.append(((-1)**(r+c)) * getMatrixDeternminant(minor))
- cofactors.append(cofactorRow)
- cofactors = transposeMatrix(cofactors)
- for r in range(len(cofactors)):
- for c in range(len(cofactors)):
- cofactors[r][c] = cofactors[r][c]/determinant
- return cofactors
- def encrypt(f, f2, v):
- print "Plaintext: ", "".join(chr(x) for r in [[0x25, 0x50, 0x44], [0x46, 0x2d, 0x31], [0x2e, v]] for x in r)
- f = f.read()
- if len(f) % KEYLEN:
- f = f + '\x00' * (KEYLEN - len(f) % KEYLEN)
- f_len = len(f)
- plaintext = [[0x25 + 0., 0x50, 0x44], [0x46, 0x2d, 0x31], [0x2e, v, 0x0a]]
- cyphertext = [[0x70, 0xe1, 0xcf], [0x8e, 0x65, 0xc6], [0xc9, 0xd0, 0xe2]]
- X = matmult(mtx_inv(plaintext), cyphertext)
- KEY_MATRIX = mtx_inv(X)
- for i in range(f_len / KEYLEN):
- block = f[i*KEYLEN:(i+1)*KEYLEN]
- matrix = [[0 for j in range(ROWLEN)] for jj in range(ROWLEN)]
- for j in range(ROWLEN):
- for jj in range(ROWLEN):
- matrix[j][jj] = ord(block[j*ROWLEN+jj])
- y = matmult(matrix, KEY_MATRIX)
- if i == 0:
- print(y)
- print(''.join([chr(int(round(item)) % 256) for sublist in y for item in sublist]))
- sys.stdout.flush()
- f2.write(''.join([chr(int(round(item))) for sublist in y for item in sublist]))
- if __name__ == "__main__":
- for ver in "1234567":
- f = open(sys.argv[1], "rb")
- f2 = open("try" + ver + ".pdf", "wb")
- encrypt(f, f2, ord(ver))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement