def transformPsi(bl): """ Transforms block bl according following rule: transformP(y16|y15|...|y1)=(y1+y2+y3+y4+y13+y16)|y16|y15|..|y3|y2 """ y = [] bl_cut = bl for i in range(16): y.append(cryptBlocks.getRight(bl_cut, 16, True)) bl_cut = cryptBlocks.cutRight(bl_cut, 16, True) resBl = 0 leftSide = y[0]^y[1]^y[2]^y[3]^y[12]^y[15] resBl = cryptBlocks.concat(leftSide, bl>>16, 240) return resBl
def transformP(bl): """ Transforms block bl according following rule: transformP(y32|y31|...|y1)=yfi(32)|yfi(31)|...|yfi(1) """ fi = getFi() y = [] for i in range(32): y.append(cryptBlocks.getRight(bl, 8, True)) bl = cryptBlocks.cutRight(bl, 8, True) resBl = 0 for i in range(1,33): resBl = cryptBlocks.concat(resBl, y[fi[33-i]-1], 8) return resBl
def cryptBlock(mess, key, direction="enc"): if makeReport: reporter.count += 1 reporter.openHandle() # adding zeros to the end of the last block numZerosToAdd = blockSize - cryptBlocks.getSizeOfBlock(mess) mess = cryptBlocks.addZeros(mess, numZerosToAdd) if makeReport: reporter.add("S-box(таблица замен):<br><table><tr><td> </td><td>0</td><td>1</td><td>2</td><td>3</td><td>4</td><td>5</td><td>6</td><td>7</td><td>8</td><td>9</td><td>a</td><td>b</td><td>c</td><td>d</td><td>e</td><td>f</td></tr>") i=1 for l in Sbox: l_str ="" for s in l: l_str += "<td>"+hex(s)+"</td>" reporter.add("<tr><td>K%d:</td> %s</tr>"%(i, l_str)) i += 1 reporter.add("</table>") reporter.addBold("Список значений переданых для (рас)шифрования блока") reporter.addList([hex(mess),hex(key), direction]) key = genKeys(key) if not (direction == "enc"): key.reverse() if makeReport: reporter.addBold("Сгенерированная последовательность ключей:") reporter.addList([hex(x) for x in key]) N1 = cryptBlocks.getRight(mess, 4) N2 = cryptBlocks.getLeft(mess, 4) if makeReport: reporter.addBold("N1=%s,<br>N2=%s"%(hex(N1), hex(N2))) i = 1 # 32 times for k in key: if makeReport: reporter.addBold("Сеть Фейстеля, итерация %d с N1=%s, N2=%s, key=%s"%(i, hex(N1), hex(N2), hex(k))) i+=1 tmp = N1 N1 = N2^functionF(N1, k) N2 = tmp if makeReport: reporter.addBold("Результат итерации: N1=%s, N2=%s<br>"%(hex(N1), hex(N2))) mess = cryptBlocks.concat(N1, N2, 32) if makeReport: reporter.addBold("Шифрованное сообщение "+hex(mess)) return mess
def stepFunction(Hin, m): """ Step function f(Hin, m) """ if makeReport: reporter.addHeader2("stepFunction(%s,%s)"%(hex(Hin), hex(m))) # step1. generating keys C2 = 0 C3 = 0xff00ffff000000ffff0000ff00ffff0000ff00ff00ff00ffff00ff00ff00ff00 C4 = 0 U = Hin V = m W = U ^ V K1 = transformP(W) U = transformA(U)^C2 V = transformA(transformA(V)) W = U ^ V K2 = transformP(W) U = transformA(U)^C3 V = transformA(transformA(V)) W = U ^ V K3 = transformP(W) U = transformA(U)^C4 V = transformA(transformA(V)) W = U ^ V K4 = transformP(W) if makeReport: reporter.addBold("Generated keys:") reporter.addList([hex(K1), hex(K2), hex(K3), hex(K4)]) # step2. crypting tranformation Hin_cut = Hin # we need Hin for the next step, but this step cuts Hin h1 = cryptBlocks.getRight(Hin_cut, 64, True) Hin_cut = cryptBlocks.cutRight(Hin_cut, 64, True) h2 = cryptBlocks.getRight(Hin_cut, 64, True) Hin_cut = cryptBlocks.cutRight(Hin_cut, 64, True) h3 = cryptBlocks.getRight(Hin_cut, 64, True) Hin_cut = cryptBlocks.cutRight(Hin_cut, 64, True) h4 = cryptBlocks.getRight(Hin_cut, 64, True) Hin_cut = cryptBlocks.cutRight(Hin_cut, 64, True) s1 = gost28147.cryptBlock(h1, K1) s2 = gost28147.cryptBlock(h2, K2) s3 = gost28147.cryptBlock(h3, K3) s4 = gost28147.cryptBlock(h4, K4) S = s4 S = cryptBlocks.concat(S, s3, 64) S = cryptBlocks.concat(S, s2, 64) S = cryptBlocks.concat(S, s1, 64) if makeReport: reporter.addBold("Crypting transformation:") reporter.addList([ "gost28147(%s,%s)=%s"%(hex(h1),hex(K1),hex(s1)), "gost28147(%s,%s)=%s"%(hex(h2),hex(K2),hex(s2)), "gost28147(%s,%s)=%s"%(hex(h3),hex(K3),hex(s3)), "gost28147(%s,%s)=%s"%(hex(h4),hex(K4),hex(s4)), ]) reporter.addBold("S="+hex(S)) # Step 3. Shuffle transforming. Hout = transformPsi(S) for i in range(12): Hout = transformPsi(Hout) Hout = transformPsi(Hout ^ m)^Hin for i in range(61): Hout = transformPsi(Hout) return Hout