Existe um Ponto Fixo MD5 onde md5 (x) == x?

114

Existe um ponto fixo na transformação MD5, ou seja, existe x tal que md5(x) == x?

BoltClock
fonte
8
Qual transformação md5? O matemático (de qualquer bitstring a 128 bits) ou o de qualquer bytestring a um hexstring de 32 caracteres (o prático)? Não é óbvio que as respostas para ambos são as mesmas ...
Rafał Dowgird
4
Bem, eles são a mesma resposta, certo? Sabemos que não existe um x diferente de 128 bits para o qual md5(x) == x, porque md5(x) tem 128 bits. Portanto, há um ponto fixo em md5 para entrada de tamanho arbitrário se e somente se houver um ponto fixo em md5 no domínio de 128 bits.
o paul
1
Eu não acho que eles sejam a mesma resposta, pois para o hexstring prático de 32 caracteres é uma escolha arbitrária se você representa os dígitos hexadecimais em maiúsculas [AF] ou em minúsculas [af]. Ambas as representações correspondem ao mesmo número de 128 bits, mas produzirão hashes diferentes quando fornecidas como entradas para MD5. Portanto, a probabilidade de que haja um ponto fixo em qualquer uma das representações é de fato1-(1/e)*(1/e) ≈ 86.47%
Dušan

Respostas:

138

Como uma soma MD5 tem 128 bits, qualquer ponto fixo teria necessariamente que ter 128 bits. Partindo do princípio de que a soma MD5 de qualquer cadeia é uniformemente distribuída ao longo de todos os montantes possíveis, então a probabilidade de que qualquer cadeia de 128 bits dada é um ponto fixo é 1 / 2 128 .

Assim, a probabilidade de que nenhuma sequência de 128 bits é um ponto fixo é (1 - 1 / 2 128 ) 2 128 , de modo que a probabilidade de que existe um ponto fixo é 1 - (1 - 1 / 2 128 ) 2 128 .

Uma vez que o limite conforme n vai ao infinito de (1 - 1 / n ) n é 1 / e , e 2 128 é certamente um número muito grande, essa probabilidade é quase exatamente 1 - 1 / e ≈ 63,21%.

Claro, não há aleatoriedade realmente envolvida - ou existe um ponto fixo ou não. Mas podemos ter 63,21% de certeza de que existe um ponto fixo. (Além disso, observe que esse número não depende do tamanho do keyspace - se as somas MD5 fossem de 32 bits ou 1024 bits, a resposta seria a mesma, contanto que fosse maior do que 4 ou 5 bits).

Adam Rosenfield
fonte
11
Você pode realmente supor que a soma MD5 de qualquer string está uniformemente distribuída em todas as somas possíveis?
Ori Pessach
13
Sim. Números grandes e modulosos formam uma distribuição aproximadamente aleatória. Se não o fizessem, você teria colisões constantes. A natureza do md5 força sua saída a ser distribuída aleatoriamente.
Stefan Kendall
2
Usei sua resposta como base para esta resposta: security.stackexchange.com/questions/3851/…
CesarB
1
Aqui, tenha um distintivo dourado.
Dennis
Exceto que md5 é determinístico, não aleatório.
PyRulez
13

Minha tentativa de força bruta encontrou uma correspondência de 12 prefixos e 12 sufixos.

prefixo 12: 54db1011d76dc70a0a9df3ff3e0b390f -> 54db1011d76d137956603122ad86d762

sufixo 12: df12c1434cec7850a7900ce027af4b78 -> b2f6053087022898fe920ce027af4b78

Postagem do blog: https://plus.google.com/103541237243849171137/posts/SRxXrTMdrFN

Thomas Egense
fonte
O link não está funcionando. Google plus foi encerrado em abril
Typewar 01 de
Desculpe ... Não salvei a postagem do blog e o backup do google + não está funcionando para mim. Mas aqui está o meu projeto github: github.com/thomasegense/MD5FixPointSearch
Thomas Egense
Você tem certeza sobre isso: prefixo 12: 54db1011d76dc70a0a9df3ff3e0b390f -> 54db1011d76d137956603122ad86d762 Usei o md5sumcomando linux, obtive resultado diferente
ThunderPhoenix
Não tenho certeza se você está usando o md5sum correto então. Você também pode confirmar online aqui: onlinemd5.com
Thomas Egense
11

Como o hash é irreversível, isso seria muito difícil de descobrir. A única maneira de resolver isso seria calcular o hash em todas as saídas possíveis do hash e ver se você encontrou uma correspondência.

Para elaborar, há 16 bytes em um hash MD5. Isso significa que há 2 ^ (16 * 8) = 3,4 * 10 ^ 38 combinações. Se demorasse 1 milissegundo para calcular um hash em um valor de 16 bytes, demoraria 10790283070806014188970529154,99 anos para calcular todos esses hashes.

Kibee
fonte
2
Verdade, se você tivesse que tentar todos . Mas você só teria que tentar todas as entradas possíveis para verificar se não havia um ponto fixo. Se houver um ponto fixo (e a resposta de Adam Rosenfield sugere que pode haver), então basta um palpite de sorte.
Naaff
A função é irreversível no sentido de que não possui inverso matemático, no entanto, isso significa apenas que para uma determinada saída pode haver mais de uma entrada. Em geral, o espaço de entradas para uma determinada saída seria infinito, mas se você souber que começou como um valor de 128 bits, poderá restringir as possibilidades. Há uma chance de "trabalhar para trás" se você não tratar a função como uma caixa preta, mas sim ler as especificações e aplicar algum raciocínio matemático.
rndmcnlly
2
@ Naaff: "só preciso tentar todas as entradas possíveis" - e isso é mais fácil do que tentar todos os hash, como? Muito pelo contrário, uma vez que várias entradas possíveis podem gerar hash na mesma saída.
Piskvor saiu do prédio em
1
@Piskvor: Você entendeu mal o que Naaff quis dizer (também me levou um minuto). Uma maneira mais clara de dizer isso seria "Somente se não houver um ponto fixo, você tentará todas as entradas possíveis (do espaço 2 ^ 128)". Em outras palavras, você só precisa tentar todas as possibilidades, se nenhuma delas funcionar. Então, 1.08e28 anos, ou um palpite de sorte!
P Daddy
"Se demorasse 1 milissegundo para calcular um hash". GPUs modernas podem calcular bilhões de hashes por segundo, muito mais rápido do que isso. Mesmo assim, levaria muito tempo.
markasoftware
0

Embora eu não tenha uma resposta sim / não, meu palpite é "sim" e, além disso, existem talvez 2 ^ 32 pontos fixos (para a interpretação da sequência de bits, não a interpretação da sequência de caracteres). Estou trabalhando ativamente nisso porque parece um quebra-cabeça incrível e conciso que exigirá muita criatividade (se você não se contentar com a pesquisa de força bruta imediatamente).

Minha abordagem é a seguinte: trate isso como um problema de matemática. Temos 128 variáveis ​​booleanas e 128 equações que descrevem as saídas em termos das entradas (que devem corresponder). Ao conectar todas as constantes das tabelas no algoritmo e os bits de preenchimento, minha esperança é que as equações possam ser bastante simplificadas para produzir um algoritmo otimizado para o caso de entrada de 128 bits. Essas equações simplificadas podem então ser programadas em alguma linguagem agradável para busca eficiente, ou tratadas abstratamente novamente, atribuindo bits individuais por vez, observando as contradições. Você só precisa ver alguns bits da saída para saber que ela não está combinando com a entrada!

rndmcnlly
fonte
Isso é realmente interessante, por favor, compartilhe seu progresso conforme você segue por esse caminho.
user230910
-1

Provavelmente, mas descobrir isso levaria mais tempo do que temos ou envolveria o comprometimento do MD5.

Andru Luvisi
fonte
6
Não foi quebrado. Tudo o que eles puderam fazer é, em um período de tempo razoável, produzir 2 strings que equivalem ao mesmo hash. Ainda é muito difícil produzir uma string que será igual a um hash específico.
Kibbee
9
não tenho certeza de como encontrar um comprometeria o md5, mais do que comprometeria o algoritmo se eu lhe dissesse MD5 ("A raposa marrom rápida salta sobre o cachorro preguiçoso") = 9e107d9d372bb6826bd81d3542a419d6
Kip
5
Um ponto fixo provavelmente daria alguma vantagem na matemática que poderia levar a uma violação mais abrangente do MD5. Não estou convencido de que Glomek possa realmente justificar 'provavelmente'; Eu aceitaria 'possivelmente' sem equívocos.
Jonathan Leffler
-9

Existem duas interpretações e, se uma puder escolher qualquer uma, a probabilidade de encontrar um ponto fixo aumenta para 81,5%.

  • Interpretação 1: o MD5 de uma saída MD5 em binário corresponde à sua entrada?
  • Interpretação 2: o MD5 de uma saída MD5 em hexadecimal corresponde à sua entrada?
Joshua
fonte
13
Não há nada sobre o algoritmo MD5 que implique hex - ele opera em bytes e produz bytes - então eu acho que a última interpretação é inválida.
Nick Johnson
Quer haja ou não um ponto fixo na interpretação 1, ainda pode haver (ou não) um na interpretação 2. No entanto, se você estiver interessado em explorar o problema, a interpretação 1 parece um lugar muito melhor para começar porque você ganhou não precisa tomar todos os tipos de decisões arbitrárias sobre capitalização e codificação de caracteres. Além disso, a caixa binária tem menos bits!
rndmcnlly
4
Você está interpretando mal o que o hex realmente é. Você pode representar binário em hexadecimal, da mesma forma que pode representá-lo em decimal, octal ou base 3. É um número e tem diferentes representações. Portanto, a interpretação 1 e 2 são a mesma coisa. O que você está pensando é a representação da string de caracteres, que não é o mesmo hex, mas é um valor binário totalmente diferente. Na verdade, você poderia ter muitas strings hexadecimais diferentes em conjuntos de caracteres diferentes. O valor de hash de 128 bits pode ser representado como uma string "hex", mas não é igual à string. A string não é o mesmo dado binário.
define
Dustin, a interpretação 2 realmente significa o MD5 da string de exibição.
Joshua de
4
Porém, há um grande problema com essa ideia, pois ela depende diretamente da codificação de seu personagem. Esquemas de codificação diferentes resultarão em conjuntos de resultados totalmente diferentes. Há até um projeto inteiro e um artigo desmascarando-o com base neste mal-entendido de como o MD5 opera acodingfool.typepad.com/blog/2009/05/the-kembler-identity.html
define
-23

A rigor, como a entrada do MD5 tem 512 bits e a saída 128 bits, eu diria que isso é impossível por definição.

Ori Pessach
fonte
4
Não, existe o MD5 de strings de 1 byte.
Joshua
7
A entrada pode ser de qualquer tamanho. Se a entrada tiver menos de 512 bytes, ela será preenchida, mas pequenas entradas ainda são aceitáveis. Da Wikipedia: "MD5 processa uma mensagem de comprimento variável em uma saída de comprimento fixo de 128 bits. A mensagem de entrada é dividida em blocos de 512 bits (dezesseis pequenos inteiros endian de 32 bits); a mensagem é preenchida de modo que seu comprimento é divisível por 512. "
Naaff
Então você está assumindo que, digamos, 0000000001 = 1? Eu argumentaria então que a questão está mal especificada, na melhor das hipóteses.
Ori Pessach
11
A entrada para MD5 pode ser de 128 bits. Se o MD5 deseja preencher essa entrada, então, francamente, esse é o negócio do MD5. A entrada ainda está bem definida. Da mesma forma, a saída é de 128 bits bem definidos. Se a entrada (bem definida) e a saída (bem definida) forem as mesmas, MD5 (x) = x.
Naaff
2
@Joshua o MD5 de uma string vazia (ou seja, 0 bytes) ainda existe
Kip