Bitcoin Forum
May 05, 2024, 06:29:03 PM *
News: Latest Bitcoin Core release: 27.0 [Torrent]
 
   Home   Help Search Login Register More  
Pages: [1]
  Print  
Author Topic: Sobre SHA-256  (Read 2903 times)
carlengues (OP)
Newbie
*
Offline Offline

Activity: 42
Merit: 0


View Profile
May 31, 2013, 02:01:47 PM
 #1

Hola a todos :

Sigo con mis dudas y os agradezco de antemano vuestra ayuda.

Por lo que he entendido hasta ahora :

El par de claves que bitcoin utiliza (la privada y la publica) se generan mediante SHA-256. Una vez creadas es imposible deducir la clave privada desde la clave publica. Y esto es precisamente lo que no entiendo : entiendo que sea imposible a no ser que alguien conozca cómo funciona SHA-256 (que deben ser muchisimas personas).
Aclaracion : entiendo que la clave "supersecreta" que utilizamos para acceder a nuestro monedero bitcoin NO es ninguna de las dos claves mencionadas.

Ejemplo :

Mi clave privada es = 3

Obtengo la clave publica mediante mi algoritmo super secreto SHA que es = 2x/7 donde x es la clave privada, o sea : (3*2)/7 = 0.857 (esto es el hash, no?)
Ya tengo mi clave publica : 0,857
Pero como sé cómo funciona mi algoritmo, puedo deducir la clave privada a partir de la publica. es decir 2X/7=0,857 (sin tener en cuanta los decimales)
O sea que X=3 (la clave privada es 3).

Disculpad mi humilde razonamiento, estoy convencido que todo tiene su explicación, sólo pretendo dar a entender mi duda.
Un saludo a todos !!
"Your bitcoin is secured in a way that is physically impossible for others to access, no matter for what reason, no matter how good the excuse, no matter a majority of miners, no matter what." -- Greg Maxwell
Advertised sites are not endorsed by the Bitcoin Forum. They may be unsafe, untrustworthy, or illegal in your jurisdiction.
Anillos
Sr. Member
****
Offline Offline

Activity: 462
Merit: 250


View Profile
May 31, 2013, 02:46:07 PM
 #2

Hola a todos :

Sigo con mis dudas y os agradezco de antemano vuestra ayuda.

Por lo que he entendido hasta ahora :

El par de claves que bitcoin utiliza (la privada y la publica) se generan mediante SHA-256. Una vez creadas es imposible deducir la clave privada desde la clave publica. Y esto es precisamente lo que no entiendo : entiendo que sea imposible a no ser que alguien conozca cómo funciona SHA-256 (que deben ser muchisimas personas).
Aclaracion : entiendo que la clave "supersecreta" que utilizamos para acceder a nuestro monedero bitcoin NO es ninguna de las dos claves mencionadas.

Ejemplo :

Mi clave privada es = 3

Obtengo la clave publica mediante mi algoritmo super secreto SHA que es = 2x/7 donde x es la clave privada, o sea : (3*2)/7 = 0.857 (esto es el hash, no?)
Ya tengo mi clave publica : 0,857
Pero como sé cómo funciona mi algoritmo, puedo deducir la clave privada a partir de la publica. es decir 2X/7=0,857 (sin tener en cuanta los decimales)
O sea que X=3 (la clave privada es 3).

Disculpad mi humilde razonamiento, estoy convencido que todo tiene su explicación, sólo pretendo dar a entender mi duda.
Un saludo a todos !!

La clave privada es un número más grande que la pública y este es redondeado, con lo que es imposible obtener la clave privada a partir de la pública.

Imagina que tu clave privada es un número del 1 al 1000 y que puedes obtener la clave pública a partir de la división entera entre 100 de la clave privada. Pues bien, si tu clave privada era 547, la pública sería 5, pero a partir del 5 no podrías saber que era 547.

La diferencia es que en Bitcoin el proceso es mucho más complejo y con números más grandes para evitar colisiones (que "suene la flauta" y te coincidan dos claves públicas a partir de claves privadas diferentes) o que se pueda deducir una clave privada cualquiera a partir de una clave pública. Esto último es evidente en el ejemplo que puse, cualquier clave privada que empiece por 5 podría realizar transacciones.

Aquí puedes conseguir pequeños ahorros sin mucho esfuerzo: http://www.bitvisitor.com/?ref=1PWNAGEZ3fSM8QevUavdd2iZ9F5jkp1QHZ
Consigue algo más viendo vídeos o haciendo pequeñas tareas en Bitcoinget.com: https://bitcointalk.org/index.php?topic=178692.msg2509190#msg2509190
¿necesitas un dibujo vectorial, un esquema, un diagrama...? https://bitcointalk.org/index.php?topic=183268.0
Shawshank
Legendary
*
Offline Offline

Activity: 1623
Merit: 1608



View Profile
May 31, 2013, 02:49:15 PM
 #3

Hola carlengues,

Efectivamente, haces bien al decir que obtienes primero la clave privada. A partir de la clave privada, se obtiene automáticamente la clave pública. El proceso inverso, es decir, de clave pública a clave privada es prácticamente imposible con el tiempo y la capacidad de procesamiento actual (haría falta millones de años de procesamiento continuo por fuerza bruta).

Simplificando mucho, la criptografía de clave pública (o asimétrica) se basa en el hecho de que es muy fácil multiplicar dos números primos muy grandes, pero es muy difícil factorizar un número muy grande en sus dos divisores primos.

Por ejemplo: 7919 y 2749 son dos números primos. Su producto es: 7919 * 2749 = 21769331

La clave privada serían los dos números: 7919 y 2749
La clave pública sería: 21769331

Multiplicar (7919 * 2749) y obtener la clave pública es sencillo. Obtener los dos divisores primos de 21769331 es más difícil. Para números inmensos es impracticable.

Como te digo, esto es simplificando mucho. Espero que te sirva...

Lightning Address: shawshank@getalby.com
salbet
Newbie
*
Offline Offline

Activity: 11
Merit: 0


View Profile
May 31, 2013, 02:57:37 PM
 #4

Creo que para entender el concepto de criptografía de clave pública este video puede resultar interesante:

http://www.youtube.com/watch?v=3QnD2c4Xovk

Saludos,

Pablo
Shawshank
Legendary
*
Offline Offline

Activity: 1623
Merit: 1608



View Profile
May 31, 2013, 03:00:24 PM
 #5

Además, Bitcoin utiliza criptografía de curva elíptica para el cálculo de clave privada-clave pública y para firmar las transacciones. SHA sirve para obtener hashes. Son dos cosas diferentes

Lightning Address: shawshank@getalby.com
carlengues (OP)
Newbie
*
Offline Offline

Activity: 42
Merit: 0


View Profile
May 31, 2013, 03:06:18 PM
 #6

Gracias !!

Estos ejemplos que me dais son los que necesito para entender mi duda.
Algo habia leido sobre SHA-256, pero a la segunda pagina, ....... en fin se me hace indigerible. Por cierto SHA-256 utliza los numeros primos?

Respecto al "hash" : ¿es el resultado que da la clave privada al pasar por el algoritmo?. si es así, el hash es la clave publica?.

Es correcto pensar que :

Por un lado tenemos la contraseña para acceder a nuestro wallet.
Por otro lado tenemos una direccion bitcoin que identifica nuestra clave publica
Por otro lado tenemos la clave publica
Y por otro lado tenemos la clave privada

O sea, como minimo se utilizan 4 contraseñas???
Shawshank
Legendary
*
Offline Offline

Activity: 1623
Merit: 1608



View Profile
May 31, 2013, 03:18:37 PM
 #7

SHA-256 utiliza números primos, pero no tiene que ver con los pares clave privada/clave pública.

Un hash SHA-256 es una función de un único sentido. Es, en cierta forma, parecido a la función MD5 que se utiliza para comprobar la integridad de un fichero.

Puedes tener un fichero de muchos GBytes, pasar todos esos GBytes por una función SHA-256 y obtener una salida de solo 32 bytes (256 bits) que es única para ese fichero. No serás capaz de encontrar otro fichero distinto que devuelva los mismos 32 bytes tras pasarlo por la función SHA-256.

Lightning Address: shawshank@getalby.com
carlengues (OP)
Newbie
*
Offline Offline

Activity: 42
Merit: 0


View Profile
May 31, 2013, 03:22:25 PM
 #8

Además, Bitcoin utiliza criptografía de curva elíptica para el cálculo de clave privada-clave pública y para firmar las transacciones. SHA sirve para obtener hashes. Son dos cosas diferentes


Adivina, he ido a la wikipedia a ver lo de la criptografia de curva eliptica!!!. Tengo las mates muy oxidadas, pero intuyo de que va el asunto.

Además el video de Salbet es clarificador a base de irlo viendo. Es genial la comparacion de las claves publico-privadas con la mezcla de colores.
Esta claro que puedes saber qué colores forman una mezcla, pero adivinar esos colores de la mezcla es más jodido.
Shevek
Sr. Member
****
Offline Offline

Activity: 252
Merit: 250



View Profile
May 31, 2013, 05:43:18 PM
 #9

El par de claves que bitcoin utiliza (la privada y la publica) se generan mediante SHA-256.

¡¡¡¡¡NOOOOO!!!!!

A ver, que quede claro:
* La clave privada "p" se obtiene mediante un RNG o PRNG (generador de números [pseudo]aleatorios); si se trata de un RNG, punto y final. Si se trata de un PRNG, el algoritmo SHA256 puede (y sólo "puede") estar implicado en su diseño.
* La clave pública "P" se obtiene del producto de curva elíptica "P = p * G", donde "G" es un punto fijo de la curva conocido por todos. El quid de la cuestión es que, aún sabiendo "P" y "G", es imposible deducir "p".

Aclaracion : entiendo que la clave "supersecreta" que utilizamos para acceder a nuestro monedero bitcoin NO es ninguna de las dos claves mencionadas.

No, no lo es.

Tu monedero se cifra mediante criptografía simétrica. Para eso suministras una contraseña, de la cual se obtiene una clave (proceso en el cual puede, y sólo "puede", intervenir SHA256) que es la que se enchufa al cifrador (AES256).

SHA256 es un algoritmo de "hash", o de digestión. Obtiene un número muy grande (256 cifras binarias ~ 80 cifras decimales) a partir de un conjunto de bits de cualquier tamaño. La gracia está en que es imposible deducir, a partir del valor gigante ese, qué conjunto de bits lo generó. Y también es imposible encontrar un conjunto alternativo de bits que produzcan un hash dado. Y también es imposible encontrar cualesquiera dos conjuntos de bits que produzcan el mismo hash, cualquiera que sea éste.

Y otra propiedad fundamental es que la función hash se comporte como un "oráculo aleatorio". Es decir, con cualquier conjunto de inputs razonablemente ordenados (por ejemplo, las cadenas "00001", "00002", etc) la función retorna unos valores que son indistinguibles de los que retornaría un RNG (por eso pueden formar parte de PRNGs).

El SHA256 (o, mejor dicho, SHA256d) lo utiliza bitcoin para generar resúmenes de longitud fija de las transacciones, de las claves públicas (para obtener las famosas "direcciones bitcoin", para lo cual se apoya en otra función hash llamada RIPEMD160), de las cabeceras de bloque (que es lo que hacen los mineros incansablemente).

Proposals for improving bitcoin are like asses: everybody has one
1SheveKuPHpzpLqSvPSavik9wnC51voBa
dserrano5
Legendary
*
Offline Offline

Activity: 1974
Merit: 1029



View Profile
May 31, 2013, 05:50:06 PM
Last edit: June 02, 2013, 06:02:30 PM by dserrano5
 #10

El par de claves que bitcoin utiliza (la privada y la publica) se generan mediante SHA-256.

No, se generan mediante criptografía de curva elíptica. La clave privada es un número entero, como el 42, generado aleatoriamente. La clave pública es un punto en el plano, perteneciente a la curva, con sus coordenadas X e Y. La pública se obtiene "multiplicando" otro punto predefinido, llamado G, que también pertenece a la curva, por la clave privada. Las comillas son porque la multiplicación como tal no existe, sino que hay que sumar muchas veces. Para obtener la privada conociendo la pública, habría que "dividirla" por G, excepto que la división tampoco existe, y me parece que la resta tampoco. Por tanto sólo te queda la fuerza bruta: multiplicar G por 2 y ver si coincide con la pública, a continuación multiplicar por 3, luego por 4… hasta que te suene la flauta, y ya sabemos que el campo es demasiado grande para atacarlo de este modo.

Sé lo justito de EC así que si la he cagado en algo y alguien quiere hacer la buena acción del día, que me dé una colleja Wink.


Quote from: Anillos
La clave privada es un número más grande que la pública y este es redondeado, con lo que es imposible obtener la clave privada a partir de la pública.

Imagina que tu clave privada es un número del 1 al 1000 y que puedes obtener la clave pública a partir de la división entera entre 100 de la clave privada. Pues bien, si tu clave privada era 547, la pública sería 5, pero a partir del 5 no podrías saber que era 547.

No hay redondedos en este proceso. ¿Dónde has leído eso?


Quote from: Shawshank
Simplificando mucho, la criptografía de clave pública (o asimétrica) se basa en el hecho de que es muy fácil multiplicar dos números primos muy grandes, pero es muy difícil factorizar un número muy grande en sus dos divisores primos.

RSA funciona así pero EC es diferente.


Quote from: carlengues
Por cierto SHA-256 utliza los numeros primos?

SHA256 sólo usa algunos números primos predefinidos en el momento de inicialización del algoritmo, no durante el cómputo del hash.


Quote from: carlengues
Respecto al "hash" : ¿es el resultado que da la clave privada al pasar por el algoritmo?. si es así, el hash es la clave publica?.

Un algoritmo de hash es una batidora, a la que le metes comida por un extremo y te echa una papilla por el otro extremo. Esta batidora tiene dos particularidades interesantes: una es que si le metes la misma comida, te devuelve siempre la misma papilla, y la otra es que si en lugar de meterle 5000 fresas le metes 4999, la papilla resultante es completamente diferente e impredecible. Hay varios algoritmos de hash, en bitcoin se usan RIPEMD160 y SHA256. Pero esto no tiene nada que ver con EC.

Bueno, en bitcoin tiene un poquito que ver: el funcionamiento de los brain wallets se basa en que tú coges un algo, por ejemplo el tercer párrafo de la página 87 de tu libro favorito, y lo pasas por SHA256. Esto te da un número de 256 bits que es válido como una clave privada. Y como el número es impredecible a priori, podemos decir que sirve como "aleatorio". A partir de esta clave privada puedes generar una dirección de bitcoin, y la gracia es que puedes acceder a la clave privada (para gastar los fondos) a partir del párrafo del libro, sin necesidad de tenerla almacenada en ningún sitio físico, y mucho menos en un wallet expuesto a internet.

Por ejemplo, el SHA256 del párrafo anterior es 3989e4dd213851c0a18413f0ee42957d1bf2a4a71bfc1525d4bab41786da0582 (edito: he modificado el párrafo anterior después de calcular este hash, por lo que no coincide). Eso es un número entero, igual que el 42, simplemente está expresado en hexadecimal. Pero como buen número, te sirve como clave privada. Y sabiendo eso, puedes ir a bitaddress.org y ver cual es la dirección asociada, que en este caso es 12foV1wvYcbSVhysdNx1e1kiAAtoV5rx6h.

Si tienes más preguntas, dispara…
carlengues (OP)
Newbie
*
Offline Offline

Activity: 42
Merit: 0


View Profile
June 02, 2013, 04:23:12 PM
Last edit: June 02, 2013, 07:46:51 PM by carlengues
 #11

Gracias a todos vosotros por vuestros comentarios y explicaciones, se que es complicado hacer entender a profanos inquietos como yo temas tan complicados y por ello os doy mi total agradecimiento.

Ahora mismo tengo toda una serie de conceptos dispersados y que por separado puedo llegar a intuir qué son, pero....., cuando los intento asociar a BTC, sigo liado :

Primero, : Comentais en algun momento EC, .... ¿que es EC?.

Segundo : No acabo de entender de donde aparece la direccion BTC. Creia que era la clave publica. De hecho yo doy publicamente mi clave (direccion) para que me puedan "enviar " BTC´s

Tercero : Me queda claro de donde aparecen el par de claves de BTC. La privada se obtiene de un generador PRNG y la publica del producto de curva eliptica, ... muy bien ya tengo mis dos claves, ok. ¿Entiendo bien si digo que la clave de mi wallet me la invento yo y queda encriptada por criptografia simetrica y punto?.

Cuarto : dserrano5 : He intentado obtener los resultados que comentas y no he obtenido lo mismo. Es decir, si cojo el parrafo que comentas, el que empieza en "Bueno, " y acaba en "expuesto a internet." y lo meto en http://www.xorbin.com/tools/sha256-hash-calculator, me da un valor de hash acabado en 097ba, diferente al tuyo. A pesar de eso he cogido tu hash acabado en da0582 y lo he metido en bitadress para calcular un brain wallet y me da un valor diferente al tuyo, en concreto una direccion acabada en "LyeY". Todo esto me ha liado.

Por otro lado y gracias a haber conocido por vosotros "bitadress" he visto que desde una clave privada se puede obtener no solo la publica sino tambien la direccion bitcoin.

Gracias por vuestra paciencia!!!.
dserrano5
Legendary
*
Offline Offline

Activity: 1974
Merit: 1029



View Profile
June 02, 2013, 05:58:01 PM
 #12

Primero, : Comentais en algun momento EC, .... ¿que es EC?.

Lo siento, EC es elliptic curve, o sea curva elíptica.


Segundo : No acabo de entender de donde aparece la direccion BTC. Creia que era la clave publica. De hecho yo doy publicamente mi clave (direccion) para que me puedan "enviar " BTC´s

Pongamos clave privada 42, que en hexadecimal es 2a (o lo que es lo mismo, 000000000000000000000000000000000000000000000000000000000000002a). La clave pública correspondiente, según bitaddress, es 04fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af07b158f244cd0 de2134ac7c1d371cffbfae4db40801a2572e531c573cda9b5b4. Si le pasamos un SHA256 a esto (ojo, no a esta cadena de texto, que es la representación hexadecimal, sino a los bytes correspondientes, que no se pueden representar aquí en el foro), el resultado es 77dddaf2a0a308a11a2534b652bca9536c060094ba4112e6c3769b19251d5397. Si a esto le pasamos un RIPEMD160 (lo mismo, se lo pasamos a los bytes), el resultado es b27ddb036eb7674236bdb4d0ba9862287d34924e. Esto, representado en base58check (un sucedáneo de base58 que se han inventado estos de bitcoin), es 1HGn3jxoSh8twi4mR3iaNmZr6pbHgjFJEg, o sea, la dirección bitcoin que aparece en bitaddress.

Es decir, la dire es la representación en base58check del RIPEMD160 del SHA256 de la clave pública.

No tengo ni idea de cómo puedes jugar con estas cosas en un güindons, pero instálate linux en una máquina virtual y ya verás Tongue. Cuando acabes de jugar lo borras (o no Tongue) y listo.


Tercero

Que te lo diga otro, nunca he mirado cómo va el cifrado del wallet.


Cuarto : dserrano5 : He intentado obtener los resultados que comentas y no he obtenido lo mismo. Es decir, si cojo el parrafo que comentas, el que empieza en "Bueno, " y acaba en "expuesto a internet." y lo meto en http://www.xorbin.com/tools/sha256-hash-calculator, me da un valor de hash acabado en 097ba, diferente al tuyo.

Probablemente es porque yo lo he cogido incluyendo el formato del foro:

Code:
Bueno, en bitcoin tiene un poquito que ver: el funcionamiento de los brain wallets se basa en que tú coges un algo, por ejemplo el tercer párrafo de la página 87 de tu libro favorito, y lo pasas por SHA256. Esto te da un número de 256 bits [i]que es válido como una clave privada[/i]. Y como el número es impredecible a priori, podemos decir que sirve como "aleatorio". A partir de esta clave privada puedes generar una dirección de bitcoin, y la gracia es que puedes acceder a la clave privada (para gastar los fondos) a partir del párrafo del libro, sin necesidad de tenerla almacenada en ningún sitio físico.

Como ahí en medio hay unos tags para poner texto en cursiva, de ahí viene la diferencia. Mi texto está en UTF8 y además incluye un salto de línea al final (al estilo unix, o sea, un sólo byte LF). Ah, y además estoy viendo que edité el párrafo después pero no actualicé el hash, sorry!


A pesar de eso he cogido tu hash acabado en da0582 y lo he metido en bitadress para calcular un brain wallet y me da un valor diferente al tuyo, en concreto una direccion acabada en "LyeY". Todo esto me ha liado.

Yo lo hago en "Wallet details". Supongo que "brain wallet" coge el texto tal cual y "wallet details" interpreta los bytes, ya que cambiando cualquier letra del hash por una h, "brain wallet" se lo traga pero "wallet details" dice que no es una clave privada válida (porque "h" no es un carácter hexadecimal).
Shevek
Sr. Member
****
Offline Offline

Activity: 252
Merit: 250



View Profile
June 03, 2013, 02:54:07 PM
 #13

Voy a redondear un poco la explicación de dserrano5

Segundo : No acabo de entender de donde aparece la direccion BTC. Creia que era la clave publica. De hecho yo doy publicamente mi clave (direccion) para que me puedan "enviar " BTC´s

Hay dos conceptos públicos: la "dirección" y la "clave pública". La "dirección" es un resumen de la "clave pública"; el resumen consta de 192 bits (160 + 32 bits de comprobación de errores), que se transcriben en un alfabeto de 58 caracteres (letras minúsculas + letras mayúsculas + números - algunas letras/números que pueden ser confundidos con otros).

La "dirección" siempre es pública, mientras que la "clave pública" no tanto. Todo lo que necesita alguien para enviarte monedas es la "dirección". No hace falta la "clave pública".

Ahora bien, cuando intentas gastar el dinero que tienes en esa dirección, el programa recurre a un algoritmo de firma (técnicamente ECDSA) que usa tu clave privada. En ese momento, tu "clave pública" se hace pública de forma efectiva, para que todo el mundo pueda comprobar la firma (con otro algoritmo que se llama verificación ECDSA... ¡qué sorpresa!).

Tercero : Me queda claro de donde aparecen el par de claves de BTC. La privada se obtiene de un generador PRNG y la publica del producto de curva eliptica, ... muy bien ya tengo mis dos claves, ok. ¿Entiendo bien si digo que la clave de mi wallet me la invento yo y queda encriptada por criptografia simetrica y punto?.

Creo que estás aludiendo a lo que en la jerga se denomina "brain wallet". Puedes proveer una contraseña (aparte, nueva) y con ella se obtiene, mediante SHA256, una clave privada válida. Es la estrategia que usa bitaddress.org

https://dserrano5.es/btc/bitaddress.org.html

Puedes recuperar tu clave privada siempre que te acuerdes de tu contraseña y le pases el SHA256.

O también puede que te refieras a si hay una forma de saltarse el PRNG, de forma que uno mismo provea los suficientes números aleatorios para generar la clave, sin fiarse de los mecanismos internos del programa que genera claves. Digamos, tirando dados.

Ahora mismo no lo hay, pero al creador de bitaddress.com le he sugerido que implemente la opción de introducir tiradas de dados reales. Con 99 tiradas de dados se puede conseguir un número de 256 bits, que puede actuar perfectamente de clave privada. 6^99 ~ 2^256; si queréis comprobarlo con una calculadora: 99 log(6) ~ 256 log(2).

También podrías usar 256 tiradas de una moneda e ir apuntando caras (=0 por ejemplo) y cruces (=1) en su orden. Pasas ese número a hexadecimal y le añades "04" y ya puedes importarlo como clave privada.

Proposals for improving bitcoin are like asses: everybody has one
1SheveKuPHpzpLqSvPSavik9wnC51voBa
carlengues (OP)
Newbie
*
Offline Offline

Activity: 42
Merit: 0


View Profile
June 03, 2013, 03:04:05 PM
 #14

Me referia a encriptar la cartera, por ejemplo en el clienteBTC.

Pero me has inundado con nueva informacion, ..... socorrroooo   Tongue
BitAddict
Legendary
*
Offline Offline

Activity: 1190
Merit: 1001



View Profile
June 03, 2013, 04:16:57 PM
 #15

Gracias por la información y las explicaciones, la verdad que siempre se aprende algo nuevo con vosotros. Precisamente en las profundidades de estos temas sin vuestra ayuda me pierdo  Tongue
Pages: [1]
  Print  
 
Jump to:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.19 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!