1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
| from sage.all import *
global p, alphabet p = 71 alphabet = '=0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$!?_{}<>'
Gp = GF(p)
C = [ [33 ,64 ,38 ,11 ,37 ,23 ,35 ,1 ,4 ,1 ,16] [44 ,12 ,59 ,14 ,25 ,20 ,41 ,65 ,43 ,50 ,34] [28 ,42 ,35 ,2 ,5 ,23 ,24 ,39 ,26 ,44 ,15] [45 ,8 ,44 ,31 ,5 ,40 ,55 ,42 ,63 ,41 ,30] [44 ,44 ,50 ,2 ,1 ,32 ,57 ,29 ,23 ,33 ,34] [31 ,53 ,45 ,46 ,23 ,22 ,56 ,25 ,19 ,22 ,31] [48 ,0 ,70 ,55 ,10 ,34 ,39 ,4 ,39 ,40 ,20] [70 ,44 ,46 ,16 ,4 ,6 ,67 ,62 ,23 ,51 ,69] [32 ,55 ,50 ,58 ,34 ,51 ,13 ,17 ,21 ,60 ,57] [56 ,19 ,60 ,51 ,24 ,14 ,39 ,1 ,49 ,2 ,24] [39 ,43 ,0 ,15 ,11 ,67 ,18 ,24 ,51 ,20 ,47] ] M1 = [ [1 ,5 ,30 ,53 ,27 ,7 ,55 ,25 ,7 ,47 ,40] [17 ,21 ,68 ,53 ,31 ,27 ,22 ,48 ,62 ,58 ,64] [39 ,18 ,21 ,50 ,9 ,60 ,27 ,43 ,19 ,34 ,30] [5 ,4 ,69 ,56 ,4 ,63 ,38 ,64 ,67 ,61 ,37] [12 ,28 ,35 ,41 ,8 ,61 ,2 ,69 ,65 ,51 ,55] [29 ,8 ,18 ,49 ,25 ,36 ,70 ,20 ,12 ,0 ,66] [0 ,34 ,38 ,37 ,62 ,42 ,37 ,47 ,61 ,8 ,26] [11 ,57 ,35 ,35 ,41 ,43 ,39 ,13 ,25 ,48 ,6] [22 ,51 ,38 ,0 ,35 ,42 ,58 ,57 ,11 ,69 ,48] [21 ,9 ,58 ,53 ,61 ,65 ,11 ,35 ,32 ,61 ,50] [35 ,58 ,2 ,55 ,66 ,46 ,30 ,49 ,20 ,70 ,30] ] M2 = [ [64 ,14 ,43 ,40 ,39 ,23 ,17 ,65 ,7 ,21 ,41] [64 ,55 ,54 ,48 ,50 ,59 ,65 ,16 ,16 ,56 ,52] [51 ,67 ,54 ,28 ,56 ,24 ,69 ,37 ,65 ,57 ,28] [26 ,33 ,23 ,33 ,20 ,5 ,36 ,2 ,12 ,37 ,69] [10 ,15 ,64 ,57 ,6 ,34 ,27 ,19 ,45 ,33 ,64] [60 ,10 ,52 ,48 ,33 ,0 ,38 ,57 ,66 ,16 ,48] [60 ,67 ,49 ,26 ,10 ,15 ,60 ,2 ,15 ,11 ,47] [69 ,12 ,67 ,16 ,39 ,33 ,18 ,25 ,42 ,23 ,8] [69 ,4 ,30 ,5 ,68 ,13 ,38 ,57 ,6 ,43 ,24] [56 ,62 ,60 ,4 ,64 ,50 ,49 ,35 ,19 ,18 ,13] [24 ,56 ,46 ,58 ,27 ,64 ,51 ,62 ,34 ,48 ,51] ] M3 = [ [61 ,26 ,61 ,24 ,15 ,46 ,34 ,57 ,8 ,68 ,41] [54 ,41 ,24 ,58 ,29 ,18 ,3 ,50 ,61 ,52 ,64] [62 ,24 ,20 ,39 ,6 ,24 ,64 ,13 ,1 ,23 ,13] [10 ,66 ,33 ,39 ,14 ,46 ,2 ,52 ,31 ,36 ,39] [66 ,63 ,49 ,45 ,0 ,40 ,29 ,55 ,22 ,43 ,43] [22 ,70 ,20 ,66 ,30 ,44 ,4 ,43 ,43 ,2 ,2] [34 ,29 ,16 ,21 ,43 ,17 ,21 ,1 ,21 ,41 ,45] [15 ,4 ,4 ,57 ,63 ,58 ,52 ,62 ,21 ,18 ,36] [23 ,54 ,68 ,1 ,48 ,49 ,59 ,9 ,12 ,48 ,42] [21 ,29 ,35 ,3 ,57 ,25 ,20 ,45 ,65 ,38 ,66] [49 ,17 ,40 ,62 ,20 ,0 ,48 ,35 ,38 ,45 ,68] ]
C = Matrix(Gp, C) M1 = Matrix(Gp, M1) M2 = Matrix(Gp, M2) M3 = Matrix(Gp, M3)
U = M2 * M1**(-1)
S2 = U**(-1) * M2 * U
R1 = S2**4 * M3**(-1)
A = U**(-1) * C - R1
print(A)
def unprepare(A): msg = '' for k in range(24): i, j = 5*k msg += alphabet[int(A[i, j])] return msg
print(unprepare(A))
|