|
| 1 | +# -*- coding: utf-8 -*- |
| 2 | +# @Time : 2017/5/12 17:40 |
| 3 | +# @Author : set3rnal |
| 4 | +# @Site : |
| 5 | +# @File : Hill Cipher.py |
| 6 | +# @Software: PyCharm |
| 7 | + |
| 8 | +from numpy import * |
| 9 | + |
| 10 | +Dic = {chr(i + 97): i for i in range(26)} |
| 11 | + |
| 12 | + |
| 13 | +def decode(pwd, org): |
| 14 | + temp = [] |
| 15 | + result = [] |
| 16 | + while True: |
| 17 | + if len(pwd) % 3 != 0: |
| 18 | + pwd.append(pwd[-1]) |
| 19 | + else: |
| 20 | + break |
| 21 | + for i in pwd: |
| 22 | + temp.append(Dic.get(i)) |
| 23 | + temp = array(temp) |
| 24 | + temp = temp.reshape(len(pwd) / 3, 3) |
| 25 | + print "temp:" |
| 26 | + print temp |
| 27 | + xx = matrix(temp) * org |
| 28 | + for j in range(len(pwd) / 3): |
| 29 | + for i in range(3): |
| 30 | + if (int(xx[j, i]) >= 26): |
| 31 | + result.append(chr(xx[j, i] % 26 + 97)) |
| 32 | + # print xx[j, i] % 26 |
| 33 | + else: |
| 34 | + # print xx[j, i] |
| 35 | + result.append(chr(xx[j, i] + 97)) |
| 36 | + return result |
| 37 | + |
| 38 | + |
| 39 | +def get_vmatrix(org): |
| 40 | + org_adjoin = org.I * linalg.det(org) # .I 返回矩阵的逆矩阵 linalg.det 返回矩阵的行列式 |
| 41 | + print "org_adjoin" |
| 42 | + print org_adjoin |
| 43 | + org_det = int(str(abs(linalg.det(org))).split('.')[0]) |
| 44 | + print "org_det" |
| 45 | + print org_det |
| 46 | + for i in range(1, 26): |
| 47 | + if i * org_det % 26 == 1: |
| 48 | + break |
| 49 | + org_mod = -org_adjoin * i % 26 |
| 50 | + org_mod = matrix(org_mod) |
| 51 | + print "org_mod" |
| 52 | + print org_mod |
| 53 | + temp = [] |
| 54 | + for i in range(org_mod.shape[0]): |
| 55 | + for j in range(org_mod.shape[1]): |
| 56 | + temp.append(int(str(org_mod[i, j]).split('.')[0])) |
| 57 | + org_final = matrix(temp).reshape(org_mod.shape[0], org_mod.shape[1]) |
| 58 | + print "temp" |
| 59 | + print temp |
| 60 | + print "org_final" |
| 61 | + print org_final |
| 62 | + return org_final |
| 63 | + |
| 64 | + |
| 65 | +if __name__ == '__main__': |
| 66 | + pwd = list("fin") |
| 67 | + org = matrix(array([[6, 24, 1], [13, 16, 10], [20, 17, 15]])) |
| 68 | + org_vm = get_vmatrix(org) |
| 69 | + result = decode(pwd, org_vm) |
| 70 | + print "".join(result) |
| 71 | + # deorg = matrix(array([[8, 5, 10], [21 , 8, 21], [21, 12, 8]])) |
| 72 | + # result = decode(result, deorg) |
| 73 | + # print "".join(result) |
| 74 | + |
| 75 | + # pwd = "wjamdbkdeibr" |
| 76 | + # pwd = list(pwd) |
| 77 | + # org = matrix(array([[1, 2, 3], [4, 5, 6], [7, 8, 10]])) |
| 78 | + # org_vm = get_vmatrix(org) |
| 79 | + # print org_vm |
| 80 | + # print "Your flag is :" + "".join(decode(pwd, org_vm)) |
0 commit comments