Pages:
Author

Topic: Exercício pessoal: Private Keys e Addresses Bitcoin em Python (Read 578 times)

hero member
Activity: 1176
Merit: 647
I rather die on my feet than to live on my knees
Bom, acho que para já, a chave pública e a privada estão correctas, a versão compressed e a versão uncompressed.

O resultado é este:
Code:
$ bin/./btctest
PrivKey = 0x832e693326d86f401e7a007c0b7b4309956ba7663bc2b31f86cb1e98b55ab72a
PubKey Q[x, y] = privKey * [G.x, G.y]
PubKey ==> Q.x = 0xe336cc45635afd8b2b3c1ae6b4a0f578f3d3b88c5cef2869b7a39c8a07efd961
PubKey ==> Q.y = 0xafa74f4d4d08842460c02671533033c4ac33a6c456b0be444924dfa3bcc5d3b5
Compressed Public Key: 0x03e336cc45635afd8b2b3c1ae6b4a0f578f3d3b88c5cef2869b7a39c8a07efd961
Uncompressed Public Key: 0x04e336cc45635afd8b2b3c1ae6b4a0f578f3d3b88c5cef2869b7a39c8a07efd961afa74f4d4d08842460c02671533033c4ac33a6c456b0be444924dfa3bcc5d3b5

O código continua no mesmo local para quem tiver curiosidade:
https://gitlab.com/PsySc0rpi0n/bitcoinexp
hero member
Activity: 1176
Merit: 647
I rather die on my feet than to live on my knees
Edited;
Aina falta uma pequena parte que quero cumprir que é formatar a Public Key da forma correcta como é feito em Bitcoin. Por isso, pelo menos mais esse passo quero concretizar. Depois posso continuar a adicionar "cenas" ou ar por concluída esta pequena aventura!

Só deves dar por concluída, quando gerares um endereço Bitcoin de forma viável. Se depois será segura ou não, será outra conversa.  Cheesy

Parabéns pelo projeto e progresso.

Estou a tratar disso mesmo agora. Só que ao juntar o código, deparo-me agora com erros na compilação que não consigo perceber! Estou a pedir ajuda noutros locais para ver se me conseguem ajudar!
legendary
Activity: 1638
Merit: 4508
**In BTC since 2013**
Edited;
Aina falta uma pequena parte que quero cumprir que é formatar a Public Key da forma correcta como é feito em Bitcoin. Por isso, pelo menos mais esse passo quero concretizar. Depois posso continuar a adicionar "cenas" ou ar por concluída esta pequena aventura!

Só deves dar por concluída, quando gerares um endereço Bitcoin de forma viável. Se depois será segura ou não, será outra conversa.  Cheesy

Parabéns pelo projeto e progresso.
hero member
Activity: 1176
Merit: 647
I rather die on my feet than to live on my knees
Quero deixar aqui mais um update.

Finalmente conseguir juntar tudo e gerar a Private Key e a Public Key mas ainda numa forma que não é utilizável em Bitcoin. Isto porque a Pub Key não é mais que a Private Key multiplicada, normalmente, por um starting point chamado o ponto G (não transpôr isto para o campo sexual, seus malvados heheh).

Ou seja, sendoeste starting point, um ponto de coordenadas X e Y, denominado por G.x e G.y, a Public Key é um ponto Q de coordenadas X' e Y' tal que Q = G*privKey. Ou um pouco mais extenso: Q[x, y] = G[x, y] * privKey. Foi a este ponto que cheguei, embora ainda não tenha comparado os resultados para ter a certeza absoluta que obtenho os mesmos resultados, mas ter chegado aqui já foi bom.

Fica aqui o repositório onde tenho estado a guardar os meus avanços (e recuos):

https://gitlab.com/PsySc0rpi0n/bitcoinexp

Não tenho lá instrucções de como usar, mas basicamente é instalar a biblioteca libgmp10-dev no linux, claro, clonar o repositório e correr o típico make. Depois o binário estará na pasta bin.

Atenção que a private key gerada não tem a complexidade nem em termos de captação de dados aleatórios nem de entropia suficientes para competir com a que é gerada pela wallet do Bitcoin core. Portanto, não usem nada disto, até porque eu nunca testei se mesmo que as coisas fossem feitas de forma segura, se funcionariam no contexto de Bitcoin. Isso ainda estará para ser testado.

Edited;
Aina falta uma pequena parte que quero cumprir que é formatar a Public Key da forma correcta como é feito em Bitcoin. Por isso, pelo menos mais esse passo quero concretizar. Depois posso continuar a adicionar "cenas" ou ar por concluída esta pequena aventura!
hero member
Activity: 1176
Merit: 647
I rather die on my feet than to live on my knees
Bom, já consegui uma parte!
Os meus printfs é que estavam a estragar a coisa. Após ter pedido ajuda a alguém mais experiente, consegui resolver o problema e até já consigo ter o número aleatório no formato da biblioteca GMP. Agora preciso de fazer com que este número aleatório cumpra um requisito ou dois e já o poderei usar no resto do programa!

Para já está assim:
Code:
#include 
#include
#include
#include
#include
#include

int main(void) {
    uint8_t bytes = ceil(log2(pow(2, 256) - 1) + 1) / 8;
    // uint8_t bytes = 2;
    FILE* fpointer = NULL;
    unsigned char* data = NULL;
    mpz_t imp_val;

    mpz_init(imp_val);

    if( (data = (unsigned char*) malloc(bytes)) == NULL) {
        printf("Memory error!\n");
        exit(-1);
    }

    printf("bytes: %d\n", bytes);

    if( (fpointer = fopen("/dev/urandom", "rb")) == NULL )
        return -1;

    fread(data, bytes, 1, fpointer);

    printf("0x");
    for(uint8_t i = 0; i < bytes; i++){
        printf("%02hhx", data[i]);
    }
    printf("\n");
    mpz_import(imp_val, 1, 1, 32, 1, 0, data);
    gmp_printf("0x%Zx\n", imp_val);
    mpz_clear(imp_val);
    free(data);
    fclose(fpointer);
    return 0;
}

hero member
Activity: 1176
Merit: 647
I rather die on my feet than to live on my knees
Bom, depois de pesquisar mais um pouco, gerar números aleatórios também parece ter muito que se lhe diga. E acho que vou continuar com um número aleatório básico sem grandes mecanismos para o tornar num número aleatório extremamente bom, nem que não seja só para conseguir continuar este pequeno projecto que não vai servir para nada!

Se calhar estas a diminuir esse teu projeto e a ter uma visão muito limitadora do que podes fazer com ele.
É verdade que começas-te o projeto, para gerar endereços Bitcoin, mas podes vir a usar para outras coisas.

Eu não sei se gostas de geradores automáticos de passwords. Mas, podes evoluir esse teu projeto, para teres uma ferramenta própria e construída por ti, para gerar as tuas passwords.


EDIT:
Se alguém souber ajudar, era fixe, para eu conseguir continuar! É que quando imprimo cada byte, no loop for, de vez em quando aparecem-me os quantos "fffff" que não percebo de onde vêm!

Já pensas-te que isso podem ser números em formato hexidecimal?
https://www.numberplanet.com/number/fffffffe/index.html
https://www.numberplanet.com/number/ffffffd6/index.html
etc...

Sim, claro, posso usar para outras coisas, mas só depois de ter a certeza que está a funcionar como é suposto.
Aqueles fffff não são supostos ali estarem de certeza. Sei que há aqui malta que de certeza percebe porque é que aquilo está a acontecer, mas se calhar não lhes apetece estarem a meter-se nisto. lol

Tenho pedido também ajuda noutros locais, mas está complicado!

O resultado devia ser 32 conjuntos de 2 caractéres alfanuméricos, tipo:
legendary
Activity: 1638
Merit: 4508
**In BTC since 2013**
Bom, depois de pesquisar mais um pouco, gerar números aleatórios também parece ter muito que se lhe diga. E acho que vou continuar com um número aleatório básico sem grandes mecanismos para o tornar num número aleatório extremamente bom, nem que não seja só para conseguir continuar este pequeno projecto que não vai servir para nada!

Se calhar estas a diminuir esse teu projeto e a ter uma visão muito limitadora do que podes fazer com ele.
É verdade que começas-te o projeto, para gerar endereços Bitcoin, mas podes vir a usar para outras coisas.

Eu não sei se gostas de geradores automáticos de passwords. Mas, podes evoluir esse teu projeto, para teres uma ferramenta própria e construída por ti, para gerar as tuas passwords.


EDIT:
Se alguém souber ajudar, era fixe, para eu conseguir continuar! É que quando imprimo cada byte, no loop for, de vez em quando aparecem-me os quantos "fffff" que não percebo de onde vêm!

Já pensas-te que isso podem ser números em formato hexidecimal?
https://www.numberplanet.com/number/fffffffe/index.html
https://www.numberplanet.com/number/ffffffd6/index.html
etc...
hero member
Activity: 1176
Merit: 647
I rather die on my feet than to live on my knees
Bom, depois de pesquisar mais um pouco, gerar números aleatórios também parece ter muito que se lhe diga. E acho que vou continuar com um número aleatório básico sem grandes mecanismos para o tornar num número aleatório extremamente bom, nem que não seja só para conseguir continuar este pequeno projecto que não vai servir para nada!

Para gerar um número aleatório para Bitcoin, sabemos que ele tem que ter 32 bytes. E com 32 bytes, conseguimos gerar 2^256 - 1 número aleatórios, certo?

O que fiz em código foi usar o device "/dev/urandom" como fonte para o meu número aleatório e depois usar uma função da GMP library para transformar este array de 32 bytes de dados num número no seu formato binário, mas acho que não está a funcionar!

O código que tenho é este:
Code:
#include 
#include
#include
#include
#include
#include

int main(void) {
    uint8_t bytes = ceil(log2(pow(2, 256) - 1) + 1) / 8;
    FILE* fpointer = NULL;
    char* data = NULL;
    mpz_t imp_val;

    mpz_init(imp_val);

    if( (data = (char*) malloc(bytes)) == NULL) {
        printf("Memory error!\n");
        exit(-1);
    }

    printf("bytes: %d\n", bytes);

    if( (fpointer = fopen("/dev/urandom", "rb")) == NULL )
        return -1;
    // rewind(fpointer);

    for(uint8_t i = 0; i < bytes; i++){
        fread(&data[i], 1, 1, fpointer);
        printf("%x", data[i]);
    }
    printf("\n");
    printf("Len: %ld\n", strlen(data));
    printf("Sizeof: %lu\n", sizeof(data[0]));
    mpz_import(imp_val, 32, 1, sizeof(data[0]), 0, 0, data);
    gmp_printf("Data: %Zb\n", imp_val);
    mpz_clear(imp_val);
    free(data);
    fclose(fpointer);
    return 0;
}

Se alguém souber ajudar, era fixe, para eu conseguir continuar! É que quando imprimo cada byte, no loop for, de vez em quando aparecem-me os quantos "fffff" que não percebo de onde vêm!
Code:
$ ./randoma
bytes: 32
07 4b fffffffe ffffffd6 60 03 ffffffa0 ffffff85 ffffffdb ffffffed 24 fffffff3 58 10 48 03 60 ffffff81 33 6d fffffff1 66 59 ffffff80 ffffffb0 ffffffdc fffffff6 ffffffee 5d 3f 07 ffffffad
Len: 32
Sizeof: 1
Data: 11111111111110011101000100000111001010101110000
hero member
Activity: 1176
Merit: 647
I rather die on my feet than to live on my knees
Voltando ao subject do tópico, já nem sei porque coloquei "python" quando estou a usar C e a GMP library!
Por falar nisto, ontem consegui "descobrir" um bug que tinha no código e agora acho que consigo avançar mais um pouco. No entanto, é algo que deve ter explicação e não um bug propriamente dito. Eu é que não sei explicar! Mas logo vou fazer mais uns testes a ver se chego a alguma conclusão!

Isso normalmente acontece, quando seguimos um caminho que depois descobrimos que não era preciso seguir. As vezes isso deixa portas abertas para outras situações.
Mas, depois partilha a conclusão. A investigação também faz parte da aprendizagem.


Estou desvastado! Duplamente! lol... Hoje, foram precisos olhos alheios para descobrir o que estava de errado no meu código até agora.
Resumindo, eu tinha 4 funções para implementar: mod_inv() (que eu pensava que já estava implementada na GMP library por defeito, só que não!!!), add(), double() e multiply() (que é uma junção da add() e da double()).

Primeiro tive um problema com a mod_inv() e percebi que a que vem por defeito na GMP library, não fazia exactamente o que era necessário, portanto, pedi ajuda a um amigo para construírmos uma. Depois disso, para alguns casos, continuei a ter resultados errados com a função multiply(). Andei vários dias sem conseguir perceber porquê.
Ontem ao fazer alguns testes, reparei que estava a cometer um erro ao assumir que tinha convertido correctamente o seguinte valor em decimal para hexadecimal:
Code:
2 ** 256 - 2 ** 32 - 2 ** 9 - 2 ** 8 - 2 ** 7 - 2 ** 6 - 2 ** 4 - 1
=
115792089237316195423570985008687907853269984665640564039457584007908834671663
=
0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f

Não sei como, copiei aquele número em hexadecimal mal para o código:
Code:
0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc2f

e por isso estava a obter valores errados. Depois de descobrir isto e de resolver, agora venho a perceber que esta library não tem condições suficientemente "boas" para gerar números aleatórios suficientemente bons para private keys de Bitcoin.

Nem sei o que faça... Se continue mesmo só por gozo mas sem perspectivas de alguma vez poder usar o código para gerar uma PK e respectiva address com ele, ou se simplesmente abandone este pequeno projecto e pense noutra coisita para fazer!
legendary
Activity: 1638
Merit: 4508
**In BTC since 2013**
Voltando ao subject do tópico, já nem sei porque coloquei "python" quando estou a usar C e a GMP library!
Por falar nisto, ontem consegui "descobrir" um bug que tinha no código e agora acho que consigo avançar mais um pouco. No entanto, é algo que deve ter explicação e não um bug propriamente dito. Eu é que não sei explicar! Mas logo vou fazer mais uns testes a ver se chego a alguma conclusão!

Isso normalmente acontece, quando seguimos um caminho que depois descobrimos que não era preciso seguir. As vezes isso deixa portas abertas para outras situações.
Mas, depois partilha a conclusão. A investigação também faz parte da aprendizagem.





Mais um pouco de offtopic:  Roll Eyes
Isso dá para jogar em conjunto? Isso é que era fixe. Juntarmos aqui meia dúzia de gatos pingados e criarmos uma jogatana em conjunto. Mas duvido que dê, principalmente entre plataformas diferentes! Mas gostava de aprender rápido esse jogo, em vez de aprender jogando, durante meses. Não tenho pachorra para andar meses a ver vídeos e ler artigos e a testar e a experimentar!

A partida, o próprio jogo dá para jogar online, independentemente da plataforma.
Quando ao aprender, bem eu não sou de ver videos e coisas assim, faço isso muito raramente e para coisas muito especificas. Então o que eu recomendo sempre, é fazer um jogo em modo sandbox, onde a pessoa pode explorar todas as funcionalidades sem grandes preocupações. Depois, neste caso, acho que quanto mais vezes jogar mais se sabe.


Eu adoro civilization. Eu jogo desde criança, quando joguei o Civilization 1. Sempre adorei esse jogo, e acredito que joguei quase todos.

Também gosto do jogo, apenas não sou adepto de jogos por turnos. Mas, a qualidade deste jogo, justifica perder algum tempo a joga-lo. Por isso não sou nenhum pro, já tu serás um adversário bem difícil.  Wink
hero member
Activity: 1176
Merit: 647
I rather die on my feet than to live on my knees
Edited;
Estás a falar do Sid Meyers: Civilization, certo?
https://civilization.com/

Correto. Mas, não foi só um jogo, foi toda a serie de jogo e mais uns jogos do Sid Meyers. Ao todo deve ter sido uns 10 ou 15 jogos, nem sei.  Tongue

É um estilo de jogo muito especifico, e com uma jogabilidade muito própria. No inicio não é fácil, mas depois de perceber como tudo funciona fica mais fácil. Mesmo assim, não é dos jogos de estratégia mais fácil, antes pelo contrario.

Eu adoro civilization. Eu jogo desde criança, quando joguei o Civilization 1. Sempre adorei esse jogo, e acredito que joguei quase todos.

Uns meses atrás eu consegui gratuitamente na Epic Games o ultimo civilization e joguei até zerar. Bem bacana, foi bom lembrar os velhos tempos.



Sobre aprender python, eu recomendo que voce utilize os sites gratuitos:

https://kaggle.com
https://www.codecademy.com/
https://hackerrank.com

Quando voce aprender o básico, dai voce vai atrás de um pago. Minha sugestão.

Isso dá para jogar em conjunto? Isso é que era fixe. Juntarmos aqui meia dúzia de gatos pingados e criarmos uma jogatana em conjunto. Mas duvido que dê, principalmente entre plataformas diferentes! Mas gostava de aprender rápido esse jogo, em vez de aprender jogando, durante meses. Não tenho pachorra para andar meses a ver vídeos e ler artigos e a testar e a experimentar!

Voltando ao subject do tópico, já nem sei porque coloquei "python" quando estou a usar C e a GMP library!
Por falar nisto, ontem consegui "descobrir" um bug que tinha no código e agora acho que consigo avançar mais um pouco. No entanto, é algo que deve ter explicação e não um bug propriamente dito. Eu é que não sei explicar! Mas logo vou fazer mais uns testes a ver se chego a alguma conclusão!
legendary
Activity: 2212
Merit: 5622
Non-custodial BTC Wallet
Edited;
Estás a falar do Sid Meyers: Civilization, certo?
https://civilization.com/

Correto. Mas, não foi só um jogo, foi toda a serie de jogo e mais uns jogos do Sid Meyers. Ao todo deve ter sido uns 10 ou 15 jogos, nem sei.  Tongue

É um estilo de jogo muito especifico, e com uma jogabilidade muito própria. No inicio não é fácil, mas depois de perceber como tudo funciona fica mais fácil. Mesmo assim, não é dos jogos de estratégia mais fácil, antes pelo contrario.

Eu adoro civilization. Eu jogo desde criança, quando joguei o Civilization 1. Sempre adorei esse jogo, e acredito que joguei quase todos.

Uns meses atrás eu consegui gratuitamente na Epic Games o ultimo civilization e joguei até zerar. Bem bacana, foi bom lembrar os velhos tempos.



Sobre aprender python, eu recomendo que voce utilize os sites gratuitos:

https://kaggle.com
https://www.codecademy.com/
https://hackerrank.com

Quando voce aprender o básico, dai voce vai atrás de um pago. Minha sugestão.
legendary
Activity: 1638
Merit: 4508
**In BTC since 2013**
Edited;
Estás a falar do Sid Meyers: Civilization, certo?
https://civilization.com/

Correto. Mas, não foi só um jogo, foi toda a serie de jogo e mais uns jogos do Sid Meyers. Ao todo deve ter sido uns 10 ou 15 jogos, nem sei.  Tongue

É um estilo de jogo muito especifico, e com uma jogabilidade muito própria. No inicio não é fácil, mas depois de perceber como tudo funciona fica mais fácil. Mesmo assim, não é dos jogos de estratégia mais fácil, antes pelo contrario.
hero member
Activity: 1176
Merit: 647
I rather die on my feet than to live on my knees
Ahh, o site é uma espécia de hub de promoções de formações online, é isso? Ok, apesar de nem precisar de guardar já que já aqui fica no forum para consulta futura! Ainda assim, se ficar nos meus bookmarks, também não perco nada! Obrigado pelos links! Vou ficar atento!

Sim, tem sempre promos de jogos, ebooks, cursos e software.
As vezes apanha-se mesmo coisas porreiras. Já comprei coisas lá por preços bem em conta.

Por exemplo, há uns tempos atras comprei toda a serie do jogo Civilization por menos de 20€.  Cool

Quando comprei a minha Nintendo Switch, comprei esse jogo em promoção por 6€ senão me engano. Mas como nunca tinha jogado o jogo, aquilo não é muito fácil começar a jogar logo bem e então acabei por jogar apenas uma semana ou duas. Nunca mais joguei o jogo!

Edited;
Estás a falar do Sid Meyers: Civilization, certo?
https://civilization.com/
legendary
Activity: 1638
Merit: 4508
**In BTC since 2013**
Ahh, o site é uma espécia de hub de promoções de formações online, é isso? Ok, apesar de nem precisar de guardar já que já aqui fica no forum para consulta futura! Ainda assim, se ficar nos meus bookmarks, também não perco nada! Obrigado pelos links! Vou ficar atento!

Sim, tem sempre promos de jogos, ebooks, cursos e software.
As vezes apanha-se mesmo coisas porreiras. Já comprei coisas lá por preços bem em conta.

Por exemplo, há uns tempos atras comprei toda a serie do jogo Civilization por menos de 20€.  Cool
hero member
Activity: 1176
Merit: 647
I rather die on my feet than to live on my knees
Era fixe era poder ver o conteúdo sem ter que estar a criar mais uma conta. Por acaso tenho interesse em alguns temas mas pelo menos na Udemy não há nada sobre o tema que me agrade! Mas não poder ver nesse site sem criar conta, é um revés!

Por acaso também reparei nisso. Achei um pouco chato.
Apesar da pagina inicial do curso, fazer uma explicação bem cuidada do que cada curso fala, não é bem a mesma coisa.

O preço é bom, e só por isso pode valer a pena, para quem esta a explorar essa linguagem.


Qualquer das formas, eu recomendei guardar os site da promoção e não da escola. Porque o site da promo, apresenta sempre boas promoções com regularidade: https://www.humblebundle.com/bundles

Ahh, o site é uma espécia de hub de promoções de formações online, é isso? Ok, apesar de nem precisar de guardar já que já aqui fica no forum para consulta futura! Ainda assim, se ficar nos meus bookmarks, também não perco nada! Obrigado pelos links! Vou ficar atento!
legendary
Activity: 1638
Merit: 4508
**In BTC since 2013**
Era fixe era poder ver o conteúdo sem ter que estar a criar mais uma conta. Por acaso tenho interesse em alguns temas mas pelo menos na Udemy não há nada sobre o tema que me agrade! Mas não poder ver nesse site sem criar conta, é um revés!

Por acaso também reparei nisso. Achei um pouco chato.
Apesar da pagina inicial do curso, fazer uma explicação bem cuidada do que cada curso fala, não é bem a mesma coisa.

O preço é bom, e só por isso pode valer a pena, para quem esta a explorar essa linguagem.


Qualquer das formas, eu recomendei guardar os site da promoção e não da escola. Porque o site da promo, apresenta sempre boas promoções com regularidade: https://www.humblebundle.com/bundles
hero member
Activity: 1176
Merit: 647
I rather die on my feet than to live on my knees
Ok, neste momento não. Não estou a fazer nada específico com Python. É só mais C em casa e Arduino no trabalho. De resto, quando preciso de outras linguagens, são coisas pontuais e simples que é fácil encontrar pela net através de exemplos e depois adaptar para o que preciso!

OK. Mas, fica atento ao site que indiquei, eles tem regularmente promoções de software e cursos, muito interessantes. Wink

Era fixe era poder ver o conteúdo sem ter que estar a criar mais uma conta. Por acaso tenho interesse em alguns temas mas pelo menos na Udemy não há nada sobre o tema que me agrade! Mas não poder ver nesse site sem criar conta, é um revés!
legendary
Activity: 1638
Merit: 4508
**In BTC since 2013**
Ok, neste momento não. Não estou a fazer nada específico com Python. É só mais C em casa e Arduino no trabalho. De resto, quando preciso de outras linguagens, são coisas pontuais e simples que é fácil encontrar pela net através de exemplos e depois adaptar para o que preciso!

OK. Mas, fica atento ao site que indiquei, eles tem regularmente promoções de software e cursos, muito interessantes. Wink
hero member
Activity: 1176
Merit: 647
I rather die on my feet than to live on my knees
Isso são cursos? Ou é apenas software?

São cursos: https://academy.zenva.com/

Acredito que vais gostar, pelo o preço pode ser útil, se estas a explorar o Python.

Ok, neste momento não. Não estou a fazer nada específico com Python. É só mais C em casa e Arduino no trabalho. De resto, quando preciso de outras linguagens, são coisas pontuais e simples que é fácil encontrar pela net através de exemplos e depois adaptar para o que preciso!
Pages:
Jump to: