├── README.md ├── d.py └── difchar128.py /README.md: -------------------------------------------------------------------------------- 1 | # MILP-basedModel 2 | MILP-based Differential Attack on Round-Reduced GIFT 3 | 4 | d.py is the source code used in Section 4, we use it to gain a 12-round differential characteristic with probability 2^{-59} and eight 4-round iterative differential characteristic. 5 | 6 | difchar128.py is the source code used in Section 5, we use it to gain some differential characteristic with high probability, and we found a 18-round differential characteristic with probability 2^{-109} 7 | -------------------------------------------------------------------------------- /d.py: -------------------------------------------------------------------------------- 1 | from gurobipy import * 2 | import string 3 | conv = ( 4 | 3, 1,-1,-1, 2, 3, 1,-1, 0, 5 | -3,-2,-1, 2, 1,-1,-2,-1, 7, 6 | -1,-1, 2,-1,-2, 2, 2,-1, 4, 7 | -1, 2, 0, 0, 2,-1, 2, 1, 0, 8 | 2, 3, 3, 2,-1,-1, 1,-1, 0, 9 | -1, 1, 0,-1,-1, 0,-1,-1, 4, 10 | -1,-1,-2,-2,-1,-2, 2,-1, 8, 11 | 2,-1,-1, 2, 0, 0, 2, 1, 0, 12 | 1,-1,-1,-1, 0,-1,-1, 0, 4, 13 | 1,-2, 0, 0, 2, 1, 2, 1, 0, 14 | -2,-1,-2,-1,-2, 2,-1, 2, 7, 15 | -1,-2, 0,-1, 2,-1,-1,-1, 5, 16 | 2, 1, 3, 2,-1,-1,-1, 1, 0, 17 | 3, 2, 0,-1, 3, 2,-1,-1, 0, 18 | 0, 3,-1,-1, 2, 3,-1, 3, 0, 19 | -1, 1,-3, 2,-1, 0,-3,-3, 8, 20 | 2,-1, 1, 1, 1,-1, 0, 2, 0, 21 | -2,-1, 2,-2,-1,-2,-1, 2, 7, 22 | 1,-1, 1, 0,-1, 1,-1, 0, 2, 23 | -1,-1, 1, 1, 0, 0, 0,-1, 2, 24 | -2, 2, 1, 2, 0, 0, 1, 1, 0, 25 | ) 26 | convpbl = ( 27 | 1, 1, 0, 2, 3, 1, 2, 2,-5,-3,-5, 0, 28 | -1, 1, 0, 2,-1, 0,-3,-3, 5, 8, 5, 0, 29 | 2,-2,-5,-1,-1,-5,-1,-1, 9,11,14, 0, 30 | -1, 0, 1, 1, 1,-1, 1,-1, 1, 2, 1, 0, 31 | -1,-1, 0,-1, 1,-1, 1, 1, 0, 4, 2, 0, 32 | 1,-3, 2, 0, 4,-4,-4, 1,10, 6, 8, 0, 33 | -1, 1, 2,-1,-2,-2,-2, 4,-1, 3, 6, 0, 34 | -2, 1,-2,-3,-1,-2, 1,-4, 4, 8,12, 0, 35 | 1, 3, 3,-2,-1,-1, 3,-1,-4,-1, 4, 0, 36 | -2,-2, 3,-2,-3, 3, 3,-1,-3, 3, 7, 0, 37 | -2,-1,-1, 2, 0, 0,-2,-1, 5, 5, 5, 0, 38 | 1,-1,-1, 3,-3, 0, 1, 0, 1, 1, 4, 0, 39 | 1,-1, 0,-2, 1, 0,-2,-2, 5, 6, 5, 0, 40 | 4, 1,-1,-1, 3, 4, 1,-2, 1,-1, 0, 0, 41 | 0, 2, 1, 2, 0, 0, 1, 1,-4,-2,-2, 0, 42 | 0, 4,-1,-5, 2, 4,-1, 3,-5,-2, 4, 0, 43 | -5,-1,-3,-1,-3, 3,-1, 2, 3, 7,12, 0, 44 | 4,-1, 4, 2,-1, 1,-1, 2,-1,-2, 0, 0, 45 | 0, 0, 0, 0, 0, 0, 0, 0,-1,-1,-1, 1, 46 | ) 47 | P64 = ( 48 | 0,17,34,51,48, 1,18,35,32,49, 2,19,16,33,50, 3, 49 | 4,21,38,55,52, 5,22,39,36,53, 6,23,20,37,54, 7, 50 | 8,25,42,59,56, 9,26,43,40,57,10,27,24,41,58,11, 51 | 12,29,46,63,60,13,30,47,44,61,14,31,28,45,62,15) 52 | 53 | ROUND = 12 54 | act = (1, 2, 3, 5, 7, 10, 13, 16, 18, 20, 22, 24, 26) 55 | BanListlen = 0 56 | def PrintOuter(BanList): 57 | opOuter = open("Outer.lp",'w+') 58 | opOuter.write("Minimize\n") 59 | buf = '' 60 | for i in range(0,ROUND): 61 | for j in range(0,16): 62 | buf = buf + "a" + str(i) + "_" + str(j) 63 | if i != ROUND-1 or j != 15: 64 | buf = buf + " + " 65 | opOuter.write(buf) 66 | opOuter.write('\n') 67 | opOuter.write("Subject to\n") 68 | buf = '' 69 | for i in range(0,ROUND): 70 | buf = '' 71 | for j in range(0,16): 72 | buf = '' 73 | for k in range(0,4): 74 | buf = buf + "x" + str(i) + "_" + str(4*j+k) 75 | if k != 3: 76 | buf = buf + " + " 77 | buf = buf + " - a" + str(i) + "_" + str(j) + " >= 0\n" 78 | for k in range(0,4): 79 | buf = buf + "x" + str(i) + "_" + str(4*j+k) + " - a" + str(i) + "_" + str(j) + " <= 0\n" 80 | # 81 | ''' 82 | for k in range(0,4): 83 | buf = buf + "4 x" + str(i) + "_" + str(4*j+k) 84 | if k != 3: 85 | buf = buf + " + " 86 | for k in range(0,4): 87 | buf = buf + " - x" + str(i+1) + "_" + str(P64[4*j+k]) 88 | buf = buf + " >= 0\n" 89 | for k in range(0,4): 90 | buf = buf + "4 x" + str(i+1) + "_" + str(P64[4*j+k]) 91 | if k != 3: 92 | buf = buf + " + " 93 | for k in range(0,4): 94 | buf = buf + " - x" + str(i) + "_" + str(4*j+k) 95 | buf = buf + " >= 0\n" 96 | ''' 97 | # 98 | for k in range(0,21): 99 | for l in range(0,9): 100 | if conv[9*k+l] > 0: 101 | if l <= 3: 102 | buf = buf + " + " + str(conv[9*k+l]) + " x" + str(i) + "_" + str(4*j+3-l) 103 | if 4 <= l and l <= 7: 104 | buf = buf + " + " + str(conv[9*k+l]) + " x" + str(i+1) + "_" + str(P64[4*j+7-l]) 105 | if l == 8: 106 | buf = buf + " >= -" + str(conv[9*k+l]) + "\n" 107 | if conv[9*k+l] < 0: 108 | if l <= 3: 109 | buf = buf + " - " + str(-conv[9*k+l]) + " x" + str(i) + "_" + str(4*j+3-l) 110 | if 4 <= l and l <= 7: 111 | buf = buf + " - " + str(-conv[9*k+l]) + " x" + str(i+1) + "_" + str(P64[4*j+7-l]) 112 | if l == 8: 113 | buf = buf + " >= " + str(-conv[9*k+l]) + "\n" 114 | if conv[9*k+l] == 0: 115 | if l == 8: 116 | buf = buf + " >= " + str(conv[9*k+l]) + "\n" 117 | 118 | opOuter.write(buf) 119 | 120 | buf = '' 121 | for i in range(0,64): 122 | buf = buf + "x0_" + str(i) 123 | if i != 63: 124 | buf = buf + " + " 125 | if i == 63: 126 | buf = buf + " >= 1\n" 127 | opOuter.write(buf) 128 | buf = '' 129 | for i in range(0,ROUND): 130 | buf = '' 131 | for j in range(0,16): 132 | buf = buf + "a" + str(i) + "_" + str(j) 133 | if j != 15: 134 | buf = buf + " + " 135 | if j == 15: 136 | buf = buf + " <= 4\n" 137 | opOuter.write(buf) 138 | buf = '' 139 | for i in BanList: 140 | for j in range(0,len(i)): 141 | buf = buf + "a" + str(i[j][0]) + "_" + str(i[j][1]) 142 | if j != len(i)-1: 143 | buf = buf + " + " 144 | else: 145 | buf = buf + " <= " + str(len(i)-1) + '\n' 146 | opOuter.write(buf) 147 | buf = '' 148 | for i in range(0,ROUND): 149 | for j in range(0,16): 150 | buf = buf + "a" + str(i) + "_" + str(j) 151 | if i != ROUND-1 or j != 15: 152 | buf = buf + " + " 153 | else: 154 | buf = buf + " >= " 155 | if act[ROUND-1] > BanListlen: 156 | buf = buf + str(act[ROUND-1]) + "\n" 157 | else: 158 | buf = buf + str(BanListlen) + "\n" 159 | opOuter.write(buf) 160 | 161 | opOuter.write("Binary\n") 162 | buf = '' 163 | for i in range(0,ROUND): 164 | buf = '' 165 | for j in range(0,16): 166 | buf = buf + "a" + str(i) + "_" + str(j) + "\n" 167 | opOuter.write(buf) 168 | for i in range(0,ROUND+1): 169 | buf = '' 170 | for j in range(0,64): 171 | buf = buf + "x" + str(i) + "_" + str(j) + "\n" 172 | opOuter.write(buf) 173 | opOuter.close() 174 | 175 | 176 | def PrintInner(SolveList): 177 | opInner = open("Inner.lp","w+") 178 | opInner.write("Minimize\n") 179 | buf = '' 180 | sl = [] 181 | for i in range(0,len(SolveList)): 182 | buf = buf + "1.415 z" + str(SolveList[i][0]) + "_" + str(SolveList[i][1]) + "_0 + 2 z" + str(SolveList[i][0]) + "_" + str(SolveList[i][1]) + "_1 + 3 z" + str(SolveList[i][0]) + "_" + str(SolveList[i][1]) + "_2" 183 | if i != len(SolveList)-1: 184 | buf = buf + " + " 185 | else: 186 | buf = buf + "\n" 187 | opInner.write(buf) 188 | opInner.write("Subject to\n") 189 | buf = '' 190 | for i in range(0,len(SolveList)): 191 | buf = '' 192 | 193 | 194 | for k in range(0,4): 195 | buf = buf + "4 x" + str(SolveList[i][0]) + "_" + str(4*SolveList[i][1]+k) 196 | if k != 3: 197 | buf = buf + " + " 198 | for k in range(0,4): 199 | buf = buf + " - y" + str(SolveList[i][0]) + "_" + str(4*SolveList[i][1]+k) 200 | buf = buf + " >= 0\n" 201 | 202 | for k in range(0,4): 203 | buf = buf + "4 y" + str(SolveList[i][0]) + "_" + str(4*SolveList[i][1]+k) 204 | if k != 3: 205 | buf = buf + " + " 206 | for k in range(0,4): 207 | buf = buf + " - x" + str(SolveList[i][0]) + "_" + str(4*SolveList[i][1]+k) 208 | buf = buf + " >= 0\n" 209 | opInner.write(buf) 210 | 211 | buf = '' 212 | for k in range(0,19): 213 | for l in range(0,12): 214 | if convpbl[12*k+l] > 0: 215 | if l <= 3: 216 | buf = buf + " + " + str(convpbl[12*k+l]) + " x" + str(SolveList[i][0]) + "_" + str(4*SolveList[i][1]+3-l) 217 | if 4 <= l and l <= 7: 218 | buf = buf + " + " + str(convpbl[12*k+l]) + " y" + str(SolveList[i][0]) + "_" + str(4*SolveList[i][1]+7-l) 219 | if 8 <=l and l <= 10: 220 | buf = buf + " + " + str(convpbl[12*k+l]) + " z" + str(SolveList[i][0]) + "_" + str(SolveList[i][1]) + "_" + str(l-8) 221 | if l == 11: 222 | buf = buf + " >= -" + str(convpbl[12*k+l]) + "\n" 223 | if convpbl[12*k+l] < 0: 224 | if l <= 3: 225 | buf = buf + " - " + str(-convpbl[12*k+l]) + " x" + str(SolveList[i][0]) + "_" + str(4*SolveList[i][1]+3-l) 226 | if 4 <= l and l <= 7: 227 | buf = buf + " - " + str(-convpbl[12*k+l]) + " y" + str(SolveList[i][0]) + "_" + str(4*SolveList[i][1]+7-l) 228 | if 8 <= l and l <= 10: 229 | buf = buf + " - " + str(-convpbl[12*k+l]) + " z" + str(SolveList[i][0]) + "_" + str(SolveList[i][1]) + "_" + str(l-8) 230 | if l == 11: 231 | buf = buf + " >= " + str(-convpbl[12*k+l]) + "\n" 232 | if convpbl[12*k+l] == 0: 233 | if l == 11: 234 | buf = buf + " >= " + str(convpbl[12*k+l]) + "\n" 235 | 236 | opInner.write(buf) 237 | 238 | buf = '' 239 | sl = [] 240 | for i in range(0,ROUND): 241 | buf = '' 242 | sl = [] 243 | sl.append(i) 244 | for j in range(0,16): 245 | sl.append(j) 246 | 247 | if sl not in SolveList: 248 | for k in range(0,4): 249 | buf = buf + "x" + str(i) + "_" + str(4*j+k) + " = 0\n" 250 | buf = buf + "y" + str(i) + "_" + str(4*j+k) + " = 0\n" 251 | sl.pop() 252 | 253 | if i != ROUND-1: 254 | for j in range(0,64): 255 | buf = buf + "x" + str(i+1) + "_" + str(P64[j]) + " - y" + str(i) + "_" + str(j) + " = 0\n" 256 | opInner.write(buf) 257 | 258 | buf = '' 259 | for i in SolveList: 260 | if i[0] == 0: 261 | buf = buf + "x0_" + str(4*i[1]) + " + x0_" + str(4*i[1]+1) + " + x0_" + str(4*i[1]+2) + " + x0_" + str(4*i[1]+3) 262 | buf = buf + " >= 1\n" 263 | opInner.write(buf) 264 | buf = '' 265 | ''' 266 | 267 | ''' 268 | opInner.write("Binary\n") 269 | buf = '' 270 | for i in range(0,ROUND): 271 | buf = '' 272 | for j in range(0,64): 273 | buf = buf + "x" + str(i) + "_" + str(j) + "\n" 274 | for j in range(0,64): 275 | buf = buf + "y" + str(i) + "_" + str(j) + "\n" 276 | opInner.write(buf) 277 | buf = '' 278 | for i in range(0,len(SolveList)): 279 | buf = buf + "z" + str(SolveList[i][0]) + "_" + str(SolveList[i][1]) + "_0\n" 280 | buf = buf + "z" + str(SolveList[i][0]) + "_" + str(SolveList[i][1]) + "_1\n" 281 | buf = buf + "z" + str(SolveList[i][0]) + "_" + str(SolveList[i][1]) + "_2\n" 282 | opInner.write(buf) 283 | buf = '' 284 | opInner.close() 285 | 286 | def strtoint(s): 287 | reg = 0 288 | s1 = '' 289 | s2 = '' 290 | res = 0 291 | result = [] 292 | for i in range(0,len(s)): 293 | if s[i] == '_': 294 | reg = 1 295 | if s[i] >= '0' and s[i]<= '9': 296 | if reg == 0: 297 | s1 = s1 + s[i] 298 | if reg == 1: 299 | s2 = s2 + s[i] 300 | 301 | result.append(string.atoi(s1)) 302 | result.append(string.atoi(s2)) 303 | return result 304 | 305 | def OuterChange(): 306 | outeri = open("Outer.lp") 307 | outero = open("Outer_change.lp","w+") 308 | while True: 309 | line = outeri.readline() 310 | if not line: 311 | break; 312 | for key,value in a_dict.items(): 313 | line = line.replace(key,value) 314 | outero.write(line) 315 | outeri.close() 316 | outero.close() 317 | 318 | ''' 319 | PrintInner([[0,1],[1,8],[2,2],[3,0],[3,4]]) 320 | m = read("Inner.lp") 321 | m.optimize() 322 | for v in m.getVars(): 323 | if v.x == 1: 324 | print v.x 325 | print v.VarName 326 | obj = m.getObjective() 327 | print obj.getValue() 328 | ''' 329 | ''' 330 | BanList = [] 331 | bl = [] 332 | blstring = [] 333 | PrintOuter(BanList) 334 | m = read("Outer.lp") 335 | m.optimize() 336 | #obj = m.getObjective() 337 | #print obj.getValue() 338 | #print m.getAttr('x') 339 | #print m.getAttr('VarName') 340 | for v in m.getVars(): 341 | if v.x == 1 and v.VarName[0] == 'a': 342 | blstring.append(v.VarName) 343 | for b in blstring: 344 | bl.append(strtoint(b)) 345 | BanList.append(bl) 346 | bl = [] 347 | blstring = [] 348 | PrintOuter(BanList) 349 | m = read("Outer.lp") 350 | m.optimize() 351 | for v in m.getVars(): 352 | if v.x == 1 and v.VarName[0] == 'a': 353 | blstring.append(v.VarName) 354 | for b in blstring: 355 | bl.append(strtoint(b)) 356 | BanList.append(bl) 357 | print BanList 358 | ''' 359 | 360 | BanList = [] 361 | bl = [] 362 | blstring = [] 363 | resreg = 64 364 | filename = "Result_" + str(ROUND) + "_1.txt" 365 | opResult = open(filename,'w+') 366 | while True: 367 | PrintOuter(BanList) 368 | 369 | o = read("Outer.lp") 370 | o.optimize() 371 | obj = o.getObjective() 372 | if obj.getValue() < act[ROUND-1]+5: 373 | bl = [] 374 | blstring = [] 375 | for v in o.getVars(): 376 | if v.x == 1 and v.VarName[0] == 'a': 377 | blstring.append(v.VarName) 378 | for b in blstring: 379 | bl.append(strtoint(b)) 380 | BanList.append(bl) 381 | BanListlen = len(bl) 382 | print bl 383 | PrintInner(bl) 384 | 385 | i = read("Inner.lp") 386 | i.optimize() 387 | buf = '' 388 | buf = buf + str(bl) + " " + str(i.getObjective().getValue()) + "\n" 389 | if i.getObjective().getValue() < resreg: 390 | resreg = i.getObjective().getValue() 391 | ot = open("mini.txt","w+") 392 | ot.write(str(resreg)) 393 | ot.close() 394 | for v in i.getVars(): 395 | if v.x == 1: 396 | buf = buf + v.VarName + " " 397 | buf = buf + "\n" 398 | opResult.write(buf) 399 | opResult.flush() 400 | else: 401 | break 402 | 403 | 404 | #print len(BanList) 405 | -------------------------------------------------------------------------------- /difchar128.py: -------------------------------------------------------------------------------- 1 | from gurobipy import * 2 | import string 3 | conv = ( 4 | 3, 1,-1,-1, 2, 3, 1,-1, 0, 5 | -3,-2,-1, 2, 1,-1,-2,-1, 7, 6 | -1,-1, 2,-1,-2, 2, 2,-1, 4, 7 | -1, 2, 0, 0, 2,-1, 2, 1, 0, 8 | 2, 3, 3, 2,-1,-1, 1,-1, 0, 9 | -1, 1, 0,-1,-1, 0,-1,-1, 4, 10 | -1,-1,-2,-2,-1,-2, 2,-1, 8, 11 | 2,-1,-1, 2, 0, 0, 2, 1, 0, 12 | 1,-1,-1,-1, 0,-1,-1, 0, 4, 13 | 1,-2, 0, 0, 2, 1, 2, 1, 0, 14 | -2,-1,-2,-1,-2, 2,-1, 2, 7, 15 | -1,-2, 0,-1, 2,-1,-1,-1, 5, 16 | 2, 1, 3, 2,-1,-1,-1, 1, 0, 17 | 3, 2, 0,-1, 3, 2,-1,-1, 0, 18 | 0, 3,-1,-1, 2, 3,-1, 3, 0, 19 | -1, 1,-3, 2,-1, 0,-3,-3, 8, 20 | 2,-1, 1, 1, 1,-1, 0, 2, 0, 21 | -2,-1, 2,-2,-1,-2,-1, 2, 7, 22 | 1,-1, 1, 0,-1, 1,-1, 0, 2, 23 | -1,-1, 1, 1, 0, 0, 0,-1, 2, 24 | -2, 2, 1, 2, 0, 0, 1, 1, 0, 25 | ) 26 | convpbl = ( 27 | 1, 1, 0, 2, 3, 1, 2, 2,-5,-3,-5, 0, 28 | -1, 1, 0, 2,-1, 0,-3,-3, 5, 8, 5, 0, 29 | 2,-2,-5,-1,-1,-5,-1,-1, 9,11,14, 0, 30 | -1, 0, 1, 1, 1,-1, 1,-1, 1, 2, 1, 0, 31 | -1,-1, 0,-1, 1,-1, 1, 1, 0, 4, 2, 0, 32 | 1,-3, 2, 0, 4,-4,-4, 1,10, 6, 8, 0, 33 | -1, 1, 2,-1,-2,-2,-2, 4,-1, 3, 6, 0, 34 | -2, 1,-2,-3,-1,-2, 1,-4, 4, 8,12, 0, 35 | 1, 3, 3,-2,-1,-1, 3,-1,-4,-1, 4, 0, 36 | -2,-2, 3,-2,-3, 3, 3,-1,-3, 3, 7, 0, 37 | -2,-1,-1, 2, 0, 0,-2,-1, 5, 5, 5, 0, 38 | 1,-1,-1, 3,-3, 0, 1, 0, 1, 1, 4, 0, 39 | 1,-1, 0,-2, 1, 0,-2,-2, 5, 6, 5, 0, 40 | 4, 1,-1,-1, 3, 4, 1,-2, 1,-1, 0, 0, 41 | 0, 2, 1, 2, 0, 0, 1, 1,-4,-2,-2, 0, 42 | 0, 4,-1,-5, 2, 4,-1, 3,-5,-2, 4, 0, 43 | -5,-1,-3,-1,-3, 3,-1, 2, 3, 7,12, 0, 44 | 4,-1, 4, 2,-1, 1,-1, 2,-1,-2, 0, 0, 45 | 0, 0, 0, 0, 0, 0, 0, 0,-1,-1,-1, 1, 46 | ) 47 | P64 = ( 48 | 0,17,34,51,48, 1,18,35,32,49, 2,19,16,33,50, 3, 49 | 4,21,38,55,52, 5,22,39,36,53, 6,23,20,37,54, 7, 50 | 8,25,42,59,56, 9,26,43,40,57,10,27,24,41,58,11, 51 | 12,29,46,63,60,13,30,47,44,61,14,31,28,45,62,15) 52 | P128 = ( 53 | 0, 33, 66, 99, 96, 1, 34, 67, 64, 97, 2, 35, 32, 65, 98, 3, 54 | 4, 37, 70,103,100, 5, 38, 71, 68,101, 6, 39, 36, 69,102, 7, 55 | 8, 41, 74,107,104, 9, 42, 75, 72,105, 10, 43, 40, 73,106, 11, 56 | 12, 45, 78,111,108, 13, 46, 79, 76,109, 14, 47, 44, 77,110, 15, 57 | 16, 49, 82,115,112, 17, 50, 83, 80,113, 18, 51, 48, 81,114, 19, 58 | 20, 53, 86,119,116, 21, 54, 87, 84,117, 22, 55, 52, 85,118, 23, 59 | 24, 57, 90,123,120, 25, 58, 91, 88,121, 26, 59, 56, 89,122, 27, 60 | 28, 61, 94,127,124, 29, 62, 95, 92,125, 30, 63, 60, 93,126, 31 61 | ) 62 | 63 | ROUND = 7 64 | act = (1, 2, 3, 5, 7, 10, 13, 17, 19) 65 | FindList = [] 66 | def PrintOuter(FindList,BanList): 67 | opOuter = open("Outer.lp",'w+') 68 | opOuter.write("Minimize\n") 69 | buf = '' 70 | for i in range(0,ROUND): 71 | for j in range(0,32): 72 | buf = buf + "a" + str(i) + "_" + str(j) 73 | if i != ROUND-1 or j != 31: 74 | buf = buf + " + " 75 | opOuter.write(buf) 76 | opOuter.write('\n') 77 | opOuter.write("Subject to\n") 78 | buf = '' 79 | for i in range(0,ROUND): 80 | buf = '' 81 | for j in range(0,32): 82 | buf = '' 83 | for k in range(0,4): 84 | buf = buf + "x" + str(i) + "_" + str(4*j+k) 85 | if k != 3: 86 | buf = buf + " + " 87 | buf = buf + " - a" + str(i) + "_" + str(j) + " >= 0\n" 88 | for k in range(0,4): 89 | buf = buf + "x" + str(i) + "_" + str(4*j+k) + " - a" + str(i) + "_" + str(j) + " <= 0\n" 90 | # 91 | ''' 92 | for k in range(0,4): 93 | buf = buf + "4 x" + str(i) + "_" + str(4*j+k) 94 | if k != 3: 95 | buf = buf + " + " 96 | for k in range(0,4): 97 | buf = buf + " - x" + str(i+1) + "_" + str(P64[4*j+k]) 98 | buf = buf + " >= 0\n" 99 | for k in range(0,4): 100 | buf = buf + "4 x" + str(i+1) + "_" + str(P64[4*j+k]) 101 | if k != 3: 102 | buf = buf + " + " 103 | for k in range(0,4): 104 | buf = buf + " - x" + str(i) + "_" + str(4*j+k) 105 | buf = buf + " >= 0\n" 106 | ''' 107 | # 108 | for k in range(0,21): 109 | for l in range(0,9): 110 | if conv[9*k+l] > 0: 111 | if l <= 3: 112 | buf = buf + " + " + str(conv[9*k+l]) + " x" + str(i) + "_" + str(4*j+3-l) 113 | if 4 <= l and l <= 7: 114 | buf = buf + " + " + str(conv[9*k+l]) + " x" + str(i+1) + "_" + str(P128[4*j+7-l]) 115 | if l == 8: 116 | buf = buf + " >= -" + str(conv[9*k+l]) + "\n" 117 | if conv[9*k+l] < 0: 118 | if l <= 3: 119 | buf = buf + " - " + str(-conv[9*k+l]) + " x" + str(i) + "_" + str(4*j+3-l) 120 | if 4 <= l and l <= 7: 121 | buf = buf + " - " + str(-conv[9*k+l]) + " x" + str(i+1) + "_" + str(P128[4*j+7-l]) 122 | if l == 8: 123 | buf = buf + " >= " + str(-conv[9*k+l]) + "\n" 124 | if conv[9*k+l] == 0: 125 | if l == 8: 126 | buf = buf + " >= " + str(conv[9*k+l]) + "\n" 127 | 128 | opOuter.write(buf) 129 | 130 | buf = '' 131 | if len(FindList) == 0: 132 | for i in range(0,128): 133 | buf = buf + "x0_" + str(i) 134 | if i != 127: 135 | buf = buf + " + " 136 | if i == 127: 137 | buf = buf + " >= 1\n" 138 | for i in BanList: 139 | for j in range(0,len(i)): 140 | buf = buf + "a" + str(i[j][0]) + "_" + str(i[j][1]) 141 | if j != len(i)-1: 142 | buf = buf + " + " 143 | else: 144 | buf = buf + " <= " + str(len(i)-1) + '\n' 145 | else: 146 | fl = [] 147 | for i in range(0,128): 148 | fl.append(i) 149 | if fl in FindList: 150 | print fl 151 | print "iii" 152 | buf = buf + "x0_" + str(i) + " = 1\n" 153 | else: 154 | buf = buf + "x0_" + str(i) + " = 0\n" 155 | fl.pop() 156 | opOuter.write(buf) 157 | ''' 158 | buf = '' 159 | for i in range(0,ROUND): 160 | buf = '' 161 | for j in range(0,32): 162 | buf = buf + "a" + str(i) + "_" + str(j) 163 | if j != 31: 164 | buf = buf + " + " 165 | if j == 31: 166 | buf = buf + " <= 4\n" 167 | opOuter.write(buf) 168 | ''' 169 | ''' 170 | buf = '' 171 | for i in BanList: 172 | for j in range(0,len(i)): 173 | buf = buf + "a" + str(i[j][0]) + "_" + str(i[j][1]) 174 | if j != len(i)-1: 175 | buf = buf + " + " 176 | else: 177 | buf = buf + " <= " + str(len(i)-1) + '\n' 178 | opOuter.write(buf) 179 | ''' 180 | buf = '' 181 | for i in range(0,ROUND): 182 | for j in range(0,32): 183 | buf = buf + "a" + str(i) + "_" + str(j) 184 | if i != ROUND-1 or j != 31: 185 | buf = buf + " + " 186 | else: 187 | buf = buf + " >= " 188 | 189 | buf = buf + str(act[ROUND-1]) + "\n" 190 | 191 | opOuter.write(buf) 192 | 193 | opOuter.write("Binary\n") 194 | buf = '' 195 | for i in range(0,ROUND): 196 | buf = '' 197 | for j in range(0,32): 198 | buf = buf + "a" + str(i) + "_" + str(j) + "\n" 199 | opOuter.write(buf) 200 | for i in range(0,ROUND+1): 201 | buf = '' 202 | for j in range(0,128): 203 | buf = buf + "x" + str(i) + "_" + str(j) + "\n" 204 | opOuter.write(buf) 205 | opOuter.close() 206 | 207 | 208 | def PrintInner(SolveList,ftl): 209 | opInner = open("Inner.lp","w+") 210 | opInner.write("Minimize\n") 211 | buf = '' 212 | 213 | for i in range(0,len(SolveList)): 214 | buf = buf + "1.415 z" + str(SolveList[i][0]) + "_" + str(SolveList[i][1]) + "_0 + 2 z" + str(SolveList[i][0]) + "_" + str(SolveList[i][1]) + "_1 + 3 z" + str(SolveList[i][0]) + "_" + str(SolveList[i][1]) + "_2" 215 | if i != len(SolveList)-1: 216 | buf = buf + " + " 217 | else: 218 | buf = buf + "\n" 219 | opInner.write(buf) 220 | opInner.write("Subject to\n") 221 | buf = '' 222 | for i in range(0,len(SolveList)): 223 | buf = '' 224 | 225 | 226 | for k in range(0,4): 227 | buf = buf + "4 x" + str(SolveList[i][0]) + "_" + str(4*SolveList[i][1]+k) 228 | if k != 3: 229 | buf = buf + " + " 230 | for k in range(0,4): 231 | buf = buf + " - y" + str(SolveList[i][0]) + "_" + str(4*SolveList[i][1]+k) 232 | buf = buf + " >= 0\n" 233 | 234 | for k in range(0,4): 235 | buf = buf + "4 y" + str(SolveList[i][0]) + "_" + str(4*SolveList[i][1]+k) 236 | if k != 3: 237 | buf = buf + " + " 238 | for k in range(0,4): 239 | buf = buf + " - x" + str(SolveList[i][0]) + "_" + str(4*SolveList[i][1]+k) 240 | buf = buf + " >= 0\n" 241 | opInner.write(buf) 242 | 243 | buf = '' 244 | for k in range(0,19): 245 | for l in range(0,12): 246 | if convpbl[12*k+l] > 0: 247 | if l <= 3: 248 | buf = buf + " + " + str(convpbl[12*k+l]) + " x" + str(SolveList[i][0]) + "_" + str(4*SolveList[i][1]+3-l) 249 | if 4 <= l and l <= 7: 250 | buf = buf + " + " + str(convpbl[12*k+l]) + " y" + str(SolveList[i][0]) + "_" + str(4*SolveList[i][1]+7-l) 251 | if 8 <=l and l <= 10: 252 | buf = buf + " + " + str(convpbl[12*k+l]) + " z" + str(SolveList[i][0]) + "_" + str(SolveList[i][1]) + "_" + str(l-8) 253 | if l == 11: 254 | buf = buf + " >= -" + str(convpbl[12*k+l]) + "\n" 255 | if convpbl[12*k+l] < 0: 256 | if l <= 3: 257 | buf = buf + " - " + str(-convpbl[12*k+l]) + " x" + str(SolveList[i][0]) + "_" + str(4*SolveList[i][1]+3-l) 258 | if 4 <= l and l <= 7: 259 | buf = buf + " - " + str(-convpbl[12*k+l]) + " y" + str(SolveList[i][0]) + "_" + str(4*SolveList[i][1]+7-l) 260 | if 8 <= l and l <= 10: 261 | buf = buf + " - " + str(-convpbl[12*k+l]) + " z" + str(SolveList[i][0]) + "_" + str(SolveList[i][1]) + "_" + str(l-8) 262 | if l == 11: 263 | buf = buf + " >= " + str(-convpbl[12*k+l]) + "\n" 264 | if convpbl[12*k+l] == 0: 265 | if l == 11: 266 | buf = buf + " >= " + str(convpbl[12*k+l]) + "\n" 267 | 268 | opInner.write(buf) 269 | 270 | buf = '' 271 | sl = [] 272 | for i in range(0,ROUND): 273 | buf = '' 274 | sl = [] 275 | sl.append(i) 276 | for j in range(0,32): 277 | sl.append(j) 278 | 279 | if sl not in SolveList: 280 | for k in range(0,4): 281 | buf = buf + "x" + str(i) + "_" + str(4*j+k) + " = 0\n" 282 | buf = buf + "y" + str(i) + "_" + str(4*j+k) + " = 0\n" 283 | sl.pop() 284 | 285 | if i != ROUND: 286 | for j in range(0,128): 287 | buf = buf + "x" + str(i+1) + "_" + str(P128[j]) + " - y" + str(i) + "_" + str(j) + " = 0\n" 288 | opInner.write(buf) 289 | 290 | buf = '' 291 | 292 | buf = '' 293 | 294 | if len(ftl) == 0: 295 | for i in SolveList: 296 | if i[0] == 0: 297 | buf = buf + "x0_" + str(4*i[1]) + " + x0_" + str(4*i[1]+1) + " + x0_" + str(4*i[1]+2) + " + x0_" + str(4*i[1]+3) 298 | buf = buf + " >= 1\n" 299 | opInner.write(buf) 300 | else: 301 | fl = [] 302 | 303 | for i in range(0,128): 304 | fl.append(i) 305 | if fl in ftl: 306 | print fl 307 | print "iii" 308 | buf = buf + "x0_" + str(i) + " = 1\n" 309 | else: 310 | buf = buf + "x0_" + str(i) + " = 0\n" 311 | fl.pop() 312 | opInner.write(buf) 313 | 314 | ''' 315 | 316 | ''' 317 | opInner.write("Binary\n") 318 | buf = '' 319 | for i in range(0,ROUND): 320 | buf = '' 321 | for j in range(0,128): 322 | buf = buf + "x" + str(i) + "_" + str(j) + "\n" 323 | for j in range(0,128): 324 | buf = buf + "y" + str(i) + "_" + str(j) + "\n" 325 | opInner.write(buf) 326 | buf = '' 327 | for j in range(0,128): 328 | buf = buf + "x" + str(ROUND) + "_" + str(j) + "\n" 329 | opInner.write(buf) 330 | buf = '' 331 | for i in range(0,len(SolveList)): 332 | buf = buf + "z" + str(SolveList[i][0]) + "_" + str(SolveList[i][1]) + "_0\n" 333 | buf = buf + "z" + str(SolveList[i][0]) + "_" + str(SolveList[i][1]) + "_1\n" 334 | buf = buf + "z" + str(SolveList[i][0]) + "_" + str(SolveList[i][1]) + "_2\n" 335 | opInner.write(buf) 336 | buf = '' 337 | opInner.close() 338 | 339 | def strtoint(s): 340 | reg = 0 341 | s1 = '' 342 | s2 = '' 343 | res = 0 344 | result = [] 345 | for i in range(0,len(s)): 346 | if s[i] == '_': 347 | reg = 1 348 | if s[i] >= '0' and s[i]<= '9': 349 | if reg == 0: 350 | s1 = s1 + s[i] 351 | if reg == 1: 352 | s2 = s2 + s[i] 353 | 354 | result.append(string.atoi(s1)) 355 | result.append(string.atoi(s2)) 356 | return result 357 | def strtoint2(s): 358 | reg = 0 359 | s1 = '' 360 | s2 = '' 361 | res = 0 362 | result = [] 363 | for i in range(0,len(s)): 364 | if s[i] == '_': 365 | reg = 1 366 | if s[i] >= '0' and s[i]<= '9': 367 | if reg == 0: 368 | s1 = s1 + s[i] 369 | if reg == 1: 370 | s2 = s2 + s[i] 371 | 372 | #result.append(string.atoi(s1)) 373 | result.append(string.atoi(s2)) 374 | return result 375 | 376 | ''' 377 | PrintInner([[0,1],[1,8],[2,2],[3,0],[3,4]]) 378 | m = read("Inner.lp") 379 | m.optimize() 380 | for v in m.getVars(): 381 | if v.x == 1: 382 | print v.x 383 | print v.VarName 384 | obj = m.getObjective() 385 | print obj.getValue() 386 | ''' 387 | ''' 388 | BanList = [] 389 | bl = [] 390 | blstring = [] 391 | PrintOuter(BanList) 392 | m = read("Outer.lp") 393 | m.optimize() 394 | #obj = m.getObjective() 395 | #print obj.getValue() 396 | #print m.getAttr('x') 397 | #print m.getAttr('VarName') 398 | for v in m.getVars(): 399 | if v.x == 1 and v.VarName[0] == 'a': 400 | blstring.append(v.VarName) 401 | for b in blstring: 402 | bl.append(strtoint(b)) 403 | BanList.append(bl) 404 | bl = [] 405 | blstring = [] 406 | PrintOuter(BanList) 407 | m = read("Outer.lp") 408 | m.optimize() 409 | for v in m.getVars(): 410 | if v.x == 1 and v.VarName[0] == 'a': 411 | blstring.append(v.VarName) 412 | for b in blstring: 413 | bl.append(strtoint(b)) 414 | BanList.append(bl) 415 | print BanList 416 | ''' 417 | count = 0 418 | count1 = 0 419 | FindSBoxList = [] 420 | fsl = [] 421 | fslstring = [] 422 | resreg = 128 423 | FindTailList = [] 424 | ftl = [] 425 | ftlstring = [] 426 | BanList = [] 427 | bl = [] 428 | blstring = [] 429 | filename = "Result_" + str(ROUND) + ".txt" 430 | opResult = open(filename,'w+') 431 | while True: 432 | count = 0 433 | 434 | fsl = [] 435 | fslstring = [] 436 | ftl = [] 437 | ftlstring = [] 438 | bl = [] 439 | opResult.write("*\n*\n*\n") 440 | while True: 441 | PrintOuter(ftl,BanList) 442 | count = count + 1 443 | 444 | if count == 15: 445 | break 446 | o = read("Outer.lp") 447 | o.optimize() 448 | obj = o.getObjective() 449 | 450 | if obj.getValue() < act[ROUND-1]+10: 451 | fsl = [] 452 | fslstring = [] 453 | for v in o.getVars(): 454 | if v.x == 1 and v.VarName[0] == 'a': 455 | fslstring.append(v.VarName) 456 | for f in fslstring: 457 | fsl.append(strtoint(f)) 458 | if count == 1: 459 | for f in fslstring: 460 | bl.append(strtoint(f)) 461 | BanList.append(bl) 462 | print "*\n*\n*\n*\n" 463 | print BanList 464 | print "*\n*\n*\n*\n" 465 | 466 | print fsl 467 | PrintInner(fsl,ftl) 468 | ftl = [] 469 | i = read("Inner.lp") 470 | i.optimize() 471 | if i.getObjective().getValue() > 78: 472 | break 473 | buf = '' 474 | buf = buf + str(fsl) + " " + str(i.getObjective().getValue()) + "\n" 475 | ''' 476 | if i.getObjective().getValue() < 30: 477 | resreg = i.getObjective().getValue() 478 | ot = open("mini.txt","w+") 479 | ot.write(str(resreg)) 480 | ot.close() 481 | ''' 482 | ftlstring = [] 483 | for v in i.getVars(): 484 | if v.x == 1: 485 | buf = buf + v.VarName + " " 486 | if v.x == 1 and v.VarName[0] == 'x' and v.VarName[1] == str(ROUND-2): 487 | ftlstring.append(v.VarName) 488 | for f in ftlstring: 489 | ftl.append(strtoint2(f)) 490 | 491 | print ftl 492 | print "well" 493 | buf = buf + "\n" 494 | opResult.write(buf) 495 | opResult.flush() 496 | 497 | else: 498 | break 499 | #count = count + 1 500 | #ftl = [] 501 | 502 | opResult.close() 503 | #print len(BanList) 504 | --------------------------------------------------------------------------------