String Cryptography

Home / Wiki / String Cryptography

String Cryptography

Revision for “String Cryptography” created on 31 de março de 2016 às 13:22:48

Título
String Cryptography
Conteúdo
<blockquote>Analyze the samples below, obtained by intercepting some Club communications, in order to understand the logic behind the codification/generation of the strings. Then, access the address below and decode the 10 words which will be provided. Learning how to decode this will be useful again later! Samples we obtained: “Flow” -&gt; Original string (plaintext) -&gt; Codified string [5, 0, 8, 3, 4, 9, 6, 2, 7, 1] -&gt; aDuLteRInE -&gt; iKbTcfTKqI [1, 3, 6, 4, 9, 2, 7, 0, 8, 5] -&gt; aboMINAblE -&gt; igvNRVEdqI [0, 9, 2, 8, 4, 7, 5, 1, 6, 3] -&gt; ACIdophiLS -&gt; JHQjvwkmPS [5, 6, 9, 1, 3, 8, 2, 4, 7, 0] -&gt; hypOCOtYLs -&gt; mhtPJOcCNy [9, 7, 6, 3, 4, 0, 5, 8, 1, 2] -&gt; fuRcATIOns -&gt; kcAiATLXou [6, 0, 1, 2, 8, 7, 9, 4, 5, 3] -&gt; ACeTaNiLid -&gt; BCmYfRiTpk [8, 0, 4, 5, 2, 7, 3, 6, 1, 9] -&gt; FURriErIes -&gt; JAYynIsKet [9, 1, 8, 3, 6, 7, 0, 2, 5, 4] -&gt; KidnAPPeRs -&gt; MrivJRWkUw [0, 5, 2, 9, 1, 6, 8, 4, 7, 3] -&gt; GarmeNTiNG -&gt; LjatlNBmRI We already discovered some properties of the codification by carrying a fast cryptanalysis which might be helpful: "0" is the string’s initial position Periodic boundary condition Case sensitive codification Format of the result expected by the server: word1,word2,word3,... nc pool.pwn2win.party 4040</blockquote> Primeiro tentamos identificar como a cifra é feita. Pelos exemplos aparenta ser uma cifra de permutação, onde o fluxo faz o papel da chave. Além disso, a dica "'0' is the string’s initial position" deu a entender que cada dígito do fluxo indica um caractere da string. Resta saber como identificar a chave da permutação para cada caractere. A primeira ideia que tivemos é que o dado um dígito no fluxo (ex: 0), o dígito seguinte indica a chave de permutação. Verificando pelo dígito 0, isso realmente acontece. Por exemplo, na primeira cifra fornecida ([5, 0, 8, 3, 4, 9, 6, 2, 7, 1] -&gt; aDuLteRInE -&gt; iKbTcfTKqI) o primeiro caractere é somado com 8, já que 8 sucede 0 no fluxo. Esse padrão, porém não se repete para todos os caracteres. Então notamos que para os dígitos ímpares a chave do fluxo é o dígito anterior a ele. Por exemplo, no fluxo [5, 0, 8, 3, 4, 9, 6, 2, 7, 1] a chave do caractere 1 é 7. Com isso escrevemos o código para decifrar uma mensagem a partir de um fluxo, mostrado abaixo. <pre class="lang:python decode:true ">alphabet_lower = "abcdefghijklmnopqrstuvwxyz" alphabet_upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" def decrypt(flow, cipher): message = "" for index, char in enumerate(cipher): flow_index = flow.index(index) if (index % 2 == 0): #key is the next in the flow key_index = (flow_index + 1) % len(flow) else: #key is the previous in the flow key_index = (flow_index - 1) % len(flow) key = flow[key_index] if (char.isupper()): alphabet_position = alphabet_upper.index(char) new_position = (alphabet_position - key) % len(alphabet_upper) new_char = alphabet_upper[new_position] else: alphabet_position = alphabet_lower.index(char) new_position = (alphabet_position - key) % len(alphabet_lower) new_char = alphabet_lower[new_position] message += new_char return message</pre> Agora, só precisamos conectar com o servidor para receber as cifras dele, decifrar e enviar a resposta. Para fazer isso usamos a biblioteca <a href="https://github.com/Gallopsled/pwntools">pwntools</a>. O código completo é mostrado abaixo: <pre class="lang:python decode:true ">from pwn import * alphabet_lower = "abcdefghijklmnopqrstuvwxyz" alphabet_upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" def decrypt(flow, cipher): message = "" for index, char in enumerate(cipher): flow_index = flow.index(index) if (index % 2 == 0): #key is the next in the flow key_index = (flow_index + 1) % len(flow) else: #key is the previous in the flow key_index = (flow_index - 1) % len(flow) key = flow[key_index] if (char.isupper()): alphabet_position = alphabet_upper.index(char) new_position = (alphabet_position - key) % len(alphabet_upper) new_char = alphabet_upper[new_position] else: alphabet_position = alphabet_lower.index(char) new_position = (alphabet_position - key) % len(alphabet_lower) new_char = alphabet_lower[new_position] message += new_char return message conn = remote('poolbr.pwn2win.party', 4040) answer = "" for _ in range(10): line = conn.recvline() print line # flow -&gt; adulterine splitted_line = line.split("-&gt;") flow = eval(splitted_line[0]) ciphertext = splitted_line[1][1:-1] message = decrypt(flow, ciphertext) print message answer += message + "," answer = answer[:-1] print conn.recv() print answer conn.send(answer + "\n") print conn.recv()</pre> Ao executar este código, obtivemos a flag do servidor: <blockquote>CTF-BR{This_encryption_is_crazy_bro!_Thinking_different...}</blockquote> <h2>Criado por</h2> Pão de Batãta
Resumo


OldNewDate CreatedAuthorActions
31 de março de 2016 às 13:22:48 Renan Netto
31 de março de 2016 às 13:18:36 Renan Netto
Recent Posts