O que há sob o capô da Jaxx. Entropia fora da caixa de 128 bits

Um pouco amassado, anotado para não esquecer. Os comentários da comunidade habracrypto devem ser interessantes.

Decidi verificar como o Brainwallet criptográfico é o sistema de backup da carteira multimoeda da Jaxx e o que as palavras secretas significam no nível do código.

Para começar, fiz uma cópia da carteira de extensão do Google recém-instalada na minha pasta de trabalho. Corrigidos os arquivos para edição.

O Notepad ++ possui ótimos recursos para pesquisar arquivos e plugins para formatar o código; portanto, encontrar e adicionar linhas como console.warn (“bits =” + bits) o ajudaram a descobrir rapidamente o que acontece ao gerar e restaurar uma carteira. Uma funcionalidade oculta do usuário também foi descoberta, o que provavelmente permite aumentar o nível de resistência criptográfica ao paranóico.

Então, ao criar uma carteira:

1. 128 bits pseudo-aleatórios são gerados usando rng:

function generateMnemonic(strength, rng, wordlist) { strength = strength || 128 rng = rng || randomBytes var hex = rng(strength / 8).toString('hex') console.warn('hex=' + hex) return entropyToMnemonic(hex, wordlist) } 

2. A soma de verificação de 4 bits é calculada

3. O bitmap total é dividido em partes de 12 bits e convertido em Inteiro. Obtemos 12 índices para a tabela de códigos.

4. Uma sequência de palavras para um backup de carteira é coletada de uma tabela de códigos com um tamanho de 2225 palavras.

5. Com base na seleção, diferentes carteiras são criadas aplicando vários algoritmos de hash à semente de 128 bits.

 var jaxx; (function (jaxx) { var Seed = /** @class */ (function () { function Seed() { } Seed.generateMnemonic = function () { return thirdparty.bip39.generateMnemonic(); }; Seed.validateSeed = function (seed) { return (thirdparty.bip39.validateMnemonic(seed)) ? true : false; }; 

Os internos de terceiros contêm implementações de muitos algoritmos diferentes; você pode redesenhar o jaxx para atender às suas necessidades.

  hash160: hash160, hash256: hash256, ripemd160: ripemd160, sha1: sha1, sha256: sha256 

E muito código interessante no qual continuo cavando.

Ao restaurar uma carteira, os índices encontrados na tabela de códigos são complementados com 0 a 12 bits não significativos, a soma de verificação é verificada, as chaves são geradas imediatamente a partir da semente recebida e a sincronização com o blockchain é iniciada.

words=boil,matter,crawl,clean,choice,gasp,clay,defy,crew,amount,cushion,pretty
chunks=00011001000,10001001010,00110010101,00101010010,00101000001,01100000001,00101010001,00111001101,00110011010,00001000000,00110110011,10101010001
bits=000110010001000100101000110010101001010100100010100000101100000001001010100010011100110100110011010000010000000011011001110101010001
checksum=0001


Para mim, toda essa experiência acabou sendo um material curioso para aprofundar meu conhecimento com criptografia.

PS E sim, por que estou:

O que você acha que, se a análise neurocriptográfica for aplicada a esse algoritmo, será possível acelerar um hacker de carteira cuja chave privada seja codificada de forma determinística a partir da matriz de bits e usada como semente para várias carteiras.

Eu ficaria feliz e agradecido pelos exemplos de código python, é interessante medir a velocidade da seleção de chaves em diferentes hardwares.

Source: https://habr.com/ru/post/pt423707/


All Articles