{"id":95846,"date":"2020-10-04T01:42:23","date_gmt":"2020-10-03T23:42:23","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/mozhno-li-generirovat-sluchajnye-chisla-esli-my-ne-doveryaem-drug-drugu-chast-2"},"modified":"2020-10-04T01:42:23","modified_gmt":"2020-10-03T23:42:23","slug":"mozhno-li-generirovat-sluchajnye-chisla-esli-my-ne-doveryaem-drug-drugu-chast-2","status":"publish","type":"post","link":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/mozhno-li-generirovat-sluchajnye-chisla-esli-my-ne-doveryaem-drug-drugu-chast-2","title":{"rendered":"\u00bfEs posible generar n\u00fameros aleatorios si no confiamos unos en otros? Parte 2","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"\u00bfEs posible generar n\u00fameros aleatorios si no confiamos unos en otros? Parte 2\" src=\"\/wp-content\/uploads\/2020\/10\/fc42fe5e99ce4412a0ce99eb63629a42.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>\u00a1Hola, Habr!<\/p>\n<p>En <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/near\/blog\/521090\/\">parte anterior<\/a><\/noindex> en los art\u00edculos discutimos por qu\u00e9 podr\u00eda ser necesario generar n\u00fameros aleatorios para los participantes que no conf\u00edan entre s\u00ed, qu\u00e9 requisitos se plantean para dichos generadores de n\u00fameros aleatorios, y examinamos dos enfoques para su implementaci\u00f3n.<\/p>\n<p>En esta parte del art\u00edculo, examinaremos en detalle otro enfoque que utiliza firmas umbral.<\/p>\n<h3>Un poco de criptograf\u00eda<\/h3>\n<p>Para entender c\u00f3mo funcionan las firmas umbral, es necesario conocer un poco de criptograf\u00eda b\u00e1sica. Usaremos dos conceptos: escalares, o simplemente n\u00fameros, que denotaremos con letras min\u00fasculas (<em>x, y<\/em>) y puntos en una curva el\u00edptica, que denotaremos con letras may\u00fasculas.<\/p>\n<p>Para comprender los fundamentos de las firmas umbral, no es necesario entender c\u00f3mo funcionan las curvas el\u00edpticas, m\u00e1s all\u00e1 de algunas cosas b\u00e1sicas:<\/p>\n<ol>\n<li>\n<p>Los puntos en una curva el\u00edptica se pueden sumar y multiplicar por un escalar (la multiplicaci\u00f3n por un escalar la denotaremos como <em>xG<\/em>, aunque la notaci\u00f3n <em>Gx<\/em> tambi\u00e9n se utiliza a menudo en la literatura). El resultado de la suma y la multiplicaci\u00f3n por un escalar \u2014 es un punto en la curva el\u00edptica.<\/p>\n<\/li>\n<li>\n<p>Conociendo solo el punto <em>G<\/em> y su producto con el escalar <em>xG<\/em> no se puede calcular <em>x<\/em>.<\/p>\n<\/li>\n<\/ol>\n<p>Tambi\u00e9n utilizaremos el concepto de polinomio <em>p(x)<\/em> de grado <em>k<\/em>-1. En particular, utilizaremos la siguiente propiedad de los polinomios: si conocemos el valor <em>p(x) <\/em>para cualquier <em>k <\/em>diferentes <em>x <\/em>y no tenemos m\u00e1s informaci\u00f3n sobre <em>p(x)<\/em>, podemos calcular <em>p(x) <\/em>para cualquier otro <em>x<\/em>.<\/p>\n<p>Es interesante que para cualquier polinomio <em>p(x)<\/em> y un cierto punto en la curva <em>G<\/em>, conociendo el valor <em>p(x)G<\/em> para cualquier <em>k<\/em> de valores diversos <em>x<\/em>, tambi\u00e9n se puede calcular <em>p(x)G<\/em> para cualquier <em>x<\/em>.<\/p>\n<p>Esta informaci\u00f3n es suficiente para profundizar en los detalles de c\u00f3mo funcionan las firmas umbral y c\u00f3mo usarlas para generar n\u00fameros aleatorios.<\/p>\n<h3>Generador de n\u00fameros aleatorios basado en firmas umbral<\/h3>\n<p>Supongamos que <em>n<\/em> los participantes quieren generar un n\u00famero aleatorio, y queremos que la participaci\u00f3n de cualquier <em>k<\/em> de ellos sea suficiente para generar el n\u00famero, pero que los atacantes que controlan <em>k<\/em>-1 o menos participantes no puedan predecir o influir en el n\u00famero generado.<\/p>\n<p><img decoding=\"async\" alt=\"\u00bfEs posible generar n\u00fameros aleatorios si no confiamos unos en otros? Parte 2\" src=\"\/wp-content\/uploads\/2020\/10\/00d54b3b0ca237a1551cdbdc35688099.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Supongamos que existe tal polinomio <em>p(x)<\/em> de grado <em>k<\/em>-1, que el primer participante conoce <em>p(1)<\/em>, el segundo sabe <em>p(2), <\/em>y as\u00ed sucesivamente (<em>n<\/em>-ando sabe <em>p(n)<\/em>). Tambi\u00e9n supongamos que para un cierto punto previamente definido <em>G<\/em> todos conocen <em>p(x)G <\/em>para todos los valores <em>x<\/em>. Lo llamaremos <em>p(i)<\/em> \u201ccomponente privada\u201d <em>i<\/em>-\u00e9simo participante (porque solo <em>i<\/em>-el participante la conoce), y <em>p(i)G<\/em> \u201ccomponente p\u00fablica\u201d <em>i<\/em>-\u00e9simo participante (porque todos los participantes la conocen). Como recordar\u00e1n, saber <em>p(i)G <\/em>no es suficiente para reconstruir <em>p(i).<\/em><\/p>\n<p>Crear tal polinomio de modo que solo <em>el i-<\/em>-\u00e9simo participante y nadie m\u00e1s conozca su componente privada es la parte m\u00e1s dif\u00edcil e interesante del protocolo, y la analizaremos a continuaci\u00f3n. Por ahora, supongamos que tenemos tal polinomio y que todos los participantes conocen sus componentes privadas.<\/p>\n<p>\u00bfC\u00f3mo podemos usar un polinomio as\u00ed para generar un n\u00famero aleatorio? Para empezar, necesitamos alguna cadena que no se haya utilizado previamente como entrada para el generador. En el caso de la blockchain, el hash del \u00faltimo bloque <em>h<\/em> \u2014 es un buen candidato para tal cadena. Supongamos que los participantes quieren crear un n\u00famero aleatorio usando <em>h <\/em>como semilla. Primero, los participantes convierten <em>h<\/em> en un punto en la curva usando cualquier funci\u00f3n previamente definida:<\/p>\n<p><em>H = scalarToPoint(h)<\/em><\/p>\n<p>Luego, cada participante <em>i<\/em> calcula y publica <em>Hi = p(i)H, <\/em>lo que pueden hacer porque conocen<em> p(i) y H. <\/em>La divulgaci\u00f3n<em> H<\/em>de i no permite a otros participantes reconstruir la componente privada <em>i<\/em>-\u00e9simo participante, y por lo tanto, un conjunto de componentes privadas se puede usar de bloque a bloque. As\u00ed, el costoso algoritmo para crear el polinomio, descrito a continuaci\u00f3n, solo necesita ser ejecutado una vez.<\/p>\n<p>Cuando <em>k<\/em> los participantes revelan <em>Hi = p(i)H, <\/em>todos pueden calcular<em> H<\/em>x = <em>p(x)H<\/em> para todos <em>x<\/em> gracias a la propiedad de los polinomios que discutimos en la secci\u00f3n anterior. En este momento, todos los participantes calculan <em>H0 = p(0)H, <\/em>y este es el n\u00famero aleatorio resultante. Tenga en cuenta que nadie conoce<em> p(0), <\/em>y por lo tanto la \u00fanica forma de calcular<em> p(0)H es <\/em>la interpolaci\u00f3n<em> p(x)H, <\/em>lo que es posible solo cuando<em> k <\/em>los valores<em> p(i)H <\/em>son conocidos. Revelar cualquier menor cantidad<em> p(i)H <\/em>no proporciona ninguna informaci\u00f3n sobre<em> p(0)H.<\/em><\/p>\n<p><img decoding=\"async\" alt=\"\u00bfEs posible generar n\u00fameros aleatorios si no confiamos unos en otros? Parte 2\" src=\"\/wp-content\/uploads\/2020\/10\/a91219381018f90f73b0a92976c92c79.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>El generador anterior tiene todas las propiedades que queremos: los atacantes que controlan solo <em>k-<\/em>-1 participantes, o menos, no tienen ninguna informaci\u00f3n ni influencia sobre la salida, mientras que cualquier <em>k<\/em> participante puede calcular el n\u00famero resultante, y cualquier subconjunto de <em>k<\/em> participantes siempre llegar\u00e1 al mismo resultado para la misma semilla.<\/p>\n<p>Hay un problema que hemos evitado cuidadosamente m\u00e1s arriba. Para que la interpolaci\u00f3n funcione, es importante que el valor<em> H<\/em>i publicado por cada participante <em>i<\/em> sea realmente igual a <em>p(i)H.<\/em> Dado que nadie m\u00e1s que el <em>i<\/em>-\u00e9simo participante sabe <em>p(i), <\/em>nadie m\u00e1s que el <em>el i-<\/em>-\u00e9simo participante puede verificar que <em>Hola <\/em>se ha calculado correctamente, y sin alguna prueba criptogr\u00e1fica de correcci\u00f3n<em> H<\/em>i un atacante puede publicar cualquier valor como <em>Hola, <\/em>y afectar de forma arbitraria la salida del generador de n\u00fameros aleatorios<em>:<\/em><\/p>\n<p><img decoding=\"async\" alt=\"\u00bfEs posible generar n\u00fameros aleatorios si no confiamos unos en otros? Parte 2\" src=\"\/wp-content\/uploads\/2020\/10\/694a86666806c49edb6e44dd9ec26b0f.png\" style=\"display:block;margin: 0 auto;\" \/>Diferentes valores H_1 enviados por el primer participante conducen a diferentes H_0 resultantes<\/p>\n<p>Hay al menos dos formas de probar la correcci\u00f3n<em> H<\/em>i, las abordaremos despu\u00e9s de revisar la generaci\u00f3n del polinomio.<\/p>\n<h3>Generaci\u00f3n del polinomio<\/h3>\n<p>En la secci\u00f3n anterior asumimos que tenemos un polinomio <em>p(x)<\/em> de grado <em>k<\/em>-1 que el participante <em>i<\/em> conoce <em>p(i)<\/em>, y nadie m\u00e1s tiene informaci\u00f3n sobre ese valor. En la siguiente secci\u00f3n, tambi\u00e9n necesitaremos que para alg\u00fan punto predefinido <em>G<\/em> todos sepan <em>p(x)G <\/em>para todos<em> x<\/em>.<\/p>\n<p>En esta secci\u00f3n asumiremos que cada participante tiene localmente alguna clave privada <em>xi, <\/em>de modo que la clave p\u00fablica correspondiente<em> X<\/em>i sea conocida.<\/p>\n<p>Un posible protocolo de generaci\u00f3n de polinomios es el siguiente:<\/p>\n<p><img decoding=\"async\" alt=\"\u00bfEs posible generar n\u00fameros aleatorios si no confiamos unos en otros? Parte 2\" src=\"\/wp-content\/uploads\/2020\/10\/ccd8afbc3c88a7f5a03714aeb6593361.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<ol>\n<li>\n<p>Cada participante <em>i<\/em> crea localmente un polinomio arbitrario <em>pi(x) de grado k-1. <\/em>Luego env\u00edan a cada participante<em> j <\/em>valor<em> p<\/em>i(j), cifrado con la clave p\u00fablica <em>Xj. <\/em>De este modo, solo el<em> el i-<\/em>j-\u00e9simo<em> <\/em>y<em> participante sabe<\/em>j-\u00e9simo<em> <\/em>i(j). El participante<em> p<\/em>tambi\u00e9n anuncia p\u00fablicamente <em>i<\/em> pi(j)G <em>inclusively. <\/em>para todos<em> j <\/em>desde<em> 1 <\/em>hasta<em> k <\/em>Todos los participantes utilizan alg\u00fan consenso para elegir<\/p>\n<\/li>\n<li>\n<p>a los participantes, cuyos polinomios se utilizar\u00e1n. Dado que algunos participantes pueden estar fuera de l\u00ednea, no podemos esperar a que todos<em> k <\/em>los participantes publiquen sus polinomios. El resultado de este paso es un conjunto<em> n <\/em>que consiste en al menos<em> <\/em><strong><em>Z<\/em><\/strong><em> <\/em>los polinomios creados en el paso (1)<em> k <\/em>Los participantes se aseguran de que los valores que conocen<em>.<\/em><\/p>\n<\/li>\n<li>\n<p>i(j) correspondan a los<em> p<\/em>pi(j)G. <em>Despu\u00e9s de este paso, deben quedar \u00fanicamente polinomios para los cuales se ha transmitido privadamente <\/em>calcula su componente privada<em> <\/em><strong><em>Z <\/em><\/strong>p(j)<em> p<\/em>pi(j)G. <em>Despu\u00e9s de este paso, deben quedar \u00fanicamente polinomios para los cuales se ha transmitido privadamente<\/em><\/p>\n<\/li>\n<li>\n<p>Cada participante<em> j <\/em>como la suma de<em> i(j) para todos <\/em>. Cada participante tambi\u00e9n calcula todos los valores<em> p<\/em>pi(x)G para todos i <em>i<\/em> en <strong><em>Z<\/em><\/strong>p(x) \u2013 <em>p(x)G <\/em>. Cada participante tambi\u00e9n calcula todos los valores <em>es realmente un polinomio de grado <\/em>en<em> <\/em><strong><em>Z<\/em><\/strong><em>.<\/em><\/p>\n<\/li>\n<\/ol>\n<p><img decoding=\"async\" alt=\"\u00bfEs posible generar n\u00fameros aleatorios si no confiamos unos en otros? Parte 2\" src=\"\/wp-content\/uploads\/2020\/10\/a7a92dba3b9de7a376c415fc6c330c46.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Tenga en cuenta que<em> k-1, <\/em>porque es la suma de cada uno de los<em> i(x), cada uno de los cuales es un polinomio de grado <\/em>porque es la suma de t\u00e9rminos individuales<em> p<\/em>i(x), cada uno de los cuales es un polinomio de grado <em>k<\/em>-1. Luego, ten en cuenta que, aunque cada participante <em>j<\/em> conoce <em>p(j), <\/em>no tienen informaci\u00f3n sobre <em>p(x)<\/em> para <em>x \u2260 j<\/em>. De hecho, para calcular este valor, necesitan conocer todos los <em>pi(x), <\/em>y mientras el participante<em> j <\/em>no conozca al menos uno de los polinomios seleccionados, no tiene suficiente informaci\u00f3n sobre<em> p(x).<\/em><\/p>\n<p>Este es todo el proceso de generaci\u00f3n del polinomio que era necesario en la secci\u00f3n anterior. Los pasos 1, 2 y 4 mencionados anteriormente tienen una implementaci\u00f3n suficientemente evidente. Sin embargo, el paso 3 no es tan trivial.<\/p>\n<p>Espec\u00edficamente, necesitamos ser capaces de demostrar que los cifrados<em> p<\/em>i(j) corresponden realmente a los publicados <em>Despu\u00e9s de este paso, deben quedar \u00fanicamente polinomios para los cuales se ha transmitido privadamente <\/em>Si no podemos demostrarlo, un atacante<em> i <\/em>podr\u00eda enviar basura en lugar de<em> p<\/em>i(j) al participante <em>j<\/em>, y el participante <em>j <\/em>no podr\u00e1 obtener el verdadero valor <em>pi(j), <\/em>y no podr\u00e1 calcular su componente privada<em>.<\/em><\/p>\n<p>Hay un protocolo criptogr\u00e1fico que permite crear un mensaje adicional<em> proof<\/em>i(j), de manera que cualquier participante, teniendo un valor cierto <em>e, <\/em>as\u00ed como<em> proofi(j) <\/em>y<em> p<\/em>i(j)G, puede convencerse localmente de que <em>e<\/em> \u2013 esto es realmente <em>pi(j), <\/em>cifrado con la clave del participante<em> j. <\/em>Desafortunadamente, el tama\u00f1o de tal prueba es incre\u00edblemente grande, y considerando que es necesario publicar<em> O(nk) <\/em>tales pruebas, no se pueden utilizar para este prop\u00f3sito.<\/p>\n<p>En lugar de demostrar que <em>pi(j) <\/em>corresponde a<em> p<\/em>i(j)G, podemos en el protocolo de generaci\u00f3n del polinomio dedicar un per\u00edodo de tiempo muy grande, durante el cual todos los participantes verifican los cifrados recibidos <em>pi(j), <\/em>y si el mensaje descifrado no corresponde al p\u00fablico<em> p<\/em>i(j)G, publican una prueba criptogr\u00e1fica de que el mensaje cifrado que recibieron es incorrecto. Demostrar que el mensaje <em>no <\/em>corresponde a <em>pi(G)<\/em> es mucho m\u00e1s sencillo que demostrar que coincide. Cabe se\u00f1alar que esto requiere que cada participante aparezca en la red al menos una vez durante el tiempo asignado para la creaci\u00f3n de tales pruebas, y se basa en la suposici\u00f3n de que si publicaron tal prueba, llegar\u00e1 a todos los dem\u00e1s participantes dentro de ese mismo tiempo asignado.<\/p>\n<p><img decoding=\"async\" alt=\"\u00bfEs posible generar n\u00fameros aleatorios si no confiamos unos en otros? Parte 2\" src=\"\/wp-content\/uploads\/2020\/10\/f7d92f18c75aa6161a9e3f1724b57426.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Si un participante no aparece en la red durante ese per\u00edodo, y realmente ten\u00eda al menos un componente incorrecto, entonces este participante espec\u00edfico no podr\u00e1 participar en la generaci\u00f3n futura de n\u00fameros. El protocolo, sin embargo, seguir\u00e1 funcionando si hay al menos <em>k<\/em> de participantes que o bien solo recibieron componentes correctos, o pudieron dejar evidencia de incorrecci\u00f3n en el tiempo asignado.<\/p>\n<h3>Evidencias de la correcci\u00f3n de H_i<\/h3>\n<p>La \u00faltima parte que queda por discutir es c\u00f3mo demostrar la correcci\u00f3n de lo publicado<em> H<\/em>i, a saber, que <em>Hi = p(i)H, <\/em>sin revelaci\u00f3n<em> p(i).<\/em><\/p>\n<p>Recordemos que los valores<em> H, G, p(i)G <\/em>son p\u00fablicos y conocidos por todos.<em> <\/em>La operaci\u00f3n de obtenci\u00f3n<em> p(i) <\/em>conociendo<em> p(i)G <\/em>y<em> G <\/em>se llama logaritmo discreto, o<em> dlog, <\/em>y queremos demostrar que:<\/p>\n<p><em>dlog(p(i)G, G) = dlog(H<\/em>i, <em>H<\/em>)<\/p>\n<p>sin divulgaci\u00f3n <em>p(i)<\/em>. Existen construcciones para tales pruebas, por ejemplo,<noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Proof_of_knowledge#Schnorr_protocol\"> <u>Protocolo de Schnorr<\/u><\/a><\/noindex>.<\/p>\n<p>Con tal construcci\u00f3n, cada participante junto con <em>Hola <\/em>env\u00eda una prueba de correcci\u00f3n de acuerdo con la construcci\u00f3n.<\/p>\n<p>Cuando se genera un n\u00famero aleatorio, a menudo es necesario que lo utilicen participantes distintos a aquellos que lo generaron. A esos participantes, junto con el n\u00famero, se les debe enviar toda la <em>Hola<\/em> y pruebas complementarias.<\/p>\n<p>Un lector curioso puede preguntarse: dado que el n\u00famero aleatorio final es<em> H<\/em>0, y <em>p(0)G \u2013 <\/em>es informaci\u00f3n p\u00fablica, \u00bfpor qu\u00e9 es necesaria una prueba para cada individual<em> H<\/em>i, por qu\u00e9 en lugar de eso no enviar una prueba de que<\/p>\n<p>dlog(<em>p(0)G, G) = dlog(H<\/em>0, <em>H<\/em>)<\/p>\n<p>El problema es que con el Protocolo de Schnorr no se puede crear tal prueba, porque nadie conoce el valor <em>p(0),<\/em>que es necesario para crear la prueba, y m\u00e1s a\u00fan, todo el generador de n\u00fameros aleatorios est\u00e1 basado en el hecho de que nadie conoce este valor. Por lo tanto, es necesario tener todos los valores <em>Hola <\/em>y sus pruebas individuales, para demostrar la correcci\u00f3n.<em> H<\/em>0.<\/p>\n<p>Sin embargo, si hubiera alguna operaci\u00f3n en los puntos de las curvas el\u00edpticas que fuera sem\u00e1nticamente similar a la multiplicaci\u00f3n, la prueba de correcci\u00f3n de <em>H0 <\/em>ser\u00eda trivial, simplemente comprobar\u00edamos que<\/p>\n<p><em>H<\/em>0 \u00d7 <em>G<\/em> = <em>p(0)G \u00d7 H<\/em><\/p>\n<p>Si la curva seleccionada soporta <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/@VitalikButerin\/exploring-elliptic-curve-pairings-c73c1864e627\"><u>emparejamientos de curvas el\u00edpticas,<\/u><\/a><\/noindex>tal prueba funciona. En este caso,<em> H<\/em>0 no solo es la salida del generador de n\u00fameros aleatorios que puede verificar cualquier participante que conozca <em>G, H<\/em> y <em>p(0)G. H<\/em>0 tambi\u00e9n es una firma en el mensaje que se utiliz\u00f3 como semilla, que confirma que <em>k<\/em> y <em>n <\/em>los participantes firmaron este mensaje. As\u00ed, si <em>seed \u2013 <\/em>es el hash de un bloque en el protocolo blockchain, entonces <em>H0<\/em> es simult\u00e1neamente una multi-firma sobre el bloque, y un muy buen n\u00famero aleatorio.<\/p>\n<h4>En conclusi\u00f3n<\/h4>\n<p>Este art\u00edculo es parte de una serie de art\u00edculos t\u00e9cnicos en el blog <noindex><a rel=\"nofollow\" href=\"https:\/\/near.org\">NEAR<\/a><\/noindex>. NEAR es un protocolo de blockchain y una plataforma para el desarrollo de aplicaciones descentralizadas, enfoc\u00e1ndose en la simplicidad de desarrollo y la facilidad de uso para los usuarios finales.<\/p>\n<p>El c\u00f3digo del protocolo es de c\u00f3digo abierto, nuestra implementaci\u00f3n est\u00e1 escrita en Rust y se puede encontrar <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nearprotocol\/nearcore\">aqu\u00ed<\/a><\/noindex>.<\/p>\n<p>Puedes ver c\u00f3mo es el desarrollo en NEAR y experimentar en un IDE en l\u00ednea <noindex><a rel=\"nofollow\" href=\"https:\/\/examples.near.org\">aqu\u00ed<\/a><\/noindex>.<\/p>\n<p>Puedes seguir todas las noticias en ruso en <noindex><a rel=\"nofollow\" href=\"https:\/\/t.me\/near_protocol\">el grupo de Telegram<\/a><\/noindex> y en <noindex><a rel=\"nofollow\" href=\"https:\/\/vk.com\/nearprotocol\">el grupo en VKontakte<\/a><\/noindex>, y en ingl\u00e9s en el oficial <noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/NEARProtocol\">twitter<\/a><\/noindex>.<\/p>\n<p>\u00a1Hasta pronto!<\/p>\n<p>Fuente: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/near\/blog\/521700\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0412 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u0442\u0430\u0442\u044c\u0438 \u043c\u044b \u043e\u0431\u0441\u0443\u0434\u0438\u043b\u0438, \u0437\u0430\u0447\u0435\u043c \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0435 \u0447\u0438\u0441\u043b\u0430 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0430\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u0434\u043e\u0432\u0435\u0440\u044f\u044e\u0442 \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0443, \u043a\u0430\u043a\u0438\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u044b\u0434\u0432\u0438\u0433\u0430\u044e\u0442\u0441\u044f \u043a \u0442\u0430\u043a\u0438\u043c \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430\u043c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b, \u0438 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u0434\u0432\u0430 \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u043a \u0438\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438. \u0412 \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u0442\u0430\u0442\u044c\u0438 \u043c\u044b \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u043f\u043e\u0434\u0445\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043f\u043e\u0440\u043e\u0433\u043e\u0432\u044b\u0435 \u043f\u043e\u0434\u043f\u0438\u0441\u0438. \u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":95847,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-95846","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/mozhno-li-generirovat-sluchajnye-chisla-esli-my-ne-doveryaem-drug-drugu-chast-2\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"es_ES\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041c\u043e\u0436\u043d\u043e \u043b\u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0435 \u0447\u0438\u0441\u043b\u0430, \u0435\u0441\u043b\u0438 \u043c\u044b \u043d\u0435 \u0434\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0443? \u0427\u0430\u0441\u0442\u044c 2 | ProHoster\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/mozhno-li-generirovat-sluchajnye-chisla-esli-my-ne-doveryaem-drug-drugu-chast-2\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-10-03T23:42:23+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-10-03T23:42:23+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47\u00bfEs posible generar n\u00fameros aleatorios si no nos confiamos entre nosotros? Parte 2 | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/mozhno-li-generirovat-sluchajnye-chisla-esli-my-ne-doveryaem-drug-drugu-chast-2","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"es_ES","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041c\u043e\u0436\u043d\u043e \u043b\u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0435 \u0447\u0438\u0441\u043b\u0430, \u0435\u0441\u043b\u0438 \u043c\u044b \u043d\u0435 \u0434\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0443? \u0427\u0430\u0441\u0442\u044c 2 | ProHoster","og:url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/mozhno-li-generirovat-sluchajnye-chisla-esli-my-ne-doveryaem-drug-drugu-chast-2","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-10-03T23:42:23+00:00","article:modified_time":"2020-10-03T23:42:23+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"95846","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 10:56:24","updated":"2022-09-30 13:54:48","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/95846","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/comments?post=95846"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/95846\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media\/95847"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=95846"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=95846"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=95846"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}