elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Desarrollo Web (Moderador: #!drvy)
| | |-+  ASCII a Base64 (encoder - javascript)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: ASCII a Base64 (encoder - javascript)  (Leído 2,379 veces)
@XSStringManolo
Hacker/Programador
Colaborador
***
Desconectado Desconectado

Mensajes: 2.397


Turn off the red ligth


Ver Perfil WWW
ASCII a Base64 (encoder - javascript)
« en: 8 Agosto 2019, 03:58 am »

Decoder https://foro.elhacker.net/desarrollo_web/base64_a_ascii_decoder-t498429.0.html
Cambiarle las etiquetas <js> y </js> por las correspondientes para añadir el javascript al html. Lo puse así para que el Cloudfare no me detecte los scripts y no me rediriga en bucle a captchas al publicar el código en el foro.

Podeis probarlo offline con un copia y pega, substituyendo las etiquetas y guardándolo con extensión html o htm con el bloc de notas o cualquier otro editor de texto dándole a "guardar como". Por ejemplo: cifradobase64.html

Podeis añadirlo a vuestra web o usarlo como querais y para lo que querais.

Características.
-La implementación es super sencilla de entender. Así quien no sepa como funciona exactamente el cifrado base64, buscándolo en wikipedia (o en el propio foro de criptografía se lo expliqué a un usuario) y mirando el código pueda entenderlo. A parte es fácilmente portable a cualquier otro lenguaje.
-Filtra todos los espacios y carácteres no contemplados en la tabla común del cifrado base64 del texto original. Se le añaden fácilmente si se desea.
-Facil cambiar la base de 64 a otra base.
-Solo cifra, no descifra. Le añadí el igual al texto cifrado (en caso de necesitarlo) para poder descifrarlo con cualquier herramienta online o implementar vosotros el decoder. Puede que lo haga yo y lo suba también cuando me aburra.


Código
  1. &#65279;<html>
  2. <head><title>Encoder Base64</title></head>
  3. <body>
  4. <js>
  5. var CadenaEnTexto;
  6. var CadenaEnTextoTamanho;
  7. var CadenaEnASCII = "";
  8. var CadenaDeBits6en6 = "";
  9. var CadenaDeBits6en6Tamanho;
  10. var RestoDeDividirEntre6 = 0;
  11. var ContadorNumDeCerosAnhadidos = 0;
  12. var mantenerseEnBucle = true;
  13. var TempBits6 = "";
  14. var x = 0;
  15. var z = 0;
  16. var CifradoFinal = "";
  17.  
  18.  
  19. CadenaEnTexto = prompt("Pon el texto");
  20.  
  21. CadenaEnTextoTamanho = CadenaEnTexto.length;
  22.  
  23. for (var i = 0; i < CadenaEnTextoTamanho; ++i)
  24. {
  25.   if (CadenaEnTexto[i] == 'A')
  26.   {
  27.   CadenaEnASCII += "01000001";
  28.   }
  29.  
  30. if (CadenaEnTexto[i] == 'B')
  31.   {
  32.   CadenaEnASCII += "01000010";
  33.   }
  34.  
  35. if (CadenaEnTexto[i] == 'C')
  36.   {
  37.   CadenaEnASCII += "01000011";
  38.   }
  39.  
  40. if (CadenaEnTexto[i] == 'D')
  41.   {
  42.   CadenaEnASCII += "01000100";
  43.   }
  44.  
  45. if (CadenaEnTexto[i] == 'E')
  46.   {
  47.   CadenaEnASCII += "01000101";
  48.   }
  49.  
  50. if (CadenaEnTexto[i] == 'F')
  51.   {
  52.   CadenaEnASCII += "01000110";
  53.   }
  54.  
  55. if (CadenaEnTexto[i] == 'G')
  56.   {
  57.   CadenaEnASCII += "01000111";
  58.   }
  59.  
  60. if (CadenaEnTexto[i] == 'H')
  61.   {
  62.   CadenaEnASCII += "01001000";
  63.   }
  64.  
  65. if (CadenaEnTexto[i] == 'I')
  66.   {
  67.   CadenaEnASCII += "01001001";
  68.   }
  69.  
  70. if (CadenaEnTexto[i] == 'J')
  71.   {
  72.   CadenaEnASCII += "01001010";
  73.   }
  74.  
  75. if (CadenaEnTexto[i] == 'K')
  76.   {
  77.   CadenaEnASCII += "01001011";
  78.   }
  79.  
  80. if (CadenaEnTexto[i] == 'L')
  81.   {
  82.   CadenaEnASCII += "01001100";
  83.   }
  84.  
  85. if (CadenaEnTexto[i] == 'M')
  86.   {
  87.   CadenaEnASCII += "01001101";
  88.   }
  89.  
  90. if (CadenaEnTexto[i] == 'N')
  91.   {
  92.   CadenaEnASCII += "01001110";
  93.   }
  94.  
  95. if (CadenaEnTexto[i] == 'O')
  96.   {
  97.   CadenaEnASCII += "01001111";
  98.   }
  99.  
  100. if (CadenaEnTexto[i] == 'P')
  101.   {
  102.   CadenaEnASCII += "01010000";
  103.   }
  104.  
  105. if (CadenaEnTexto[i] == 'Q')
  106.   {
  107.   CadenaEnASCII += "01010001";
  108.   }
  109.  
  110. if (CadenaEnTexto[i] == 'R')
  111.   {
  112.   CadenaEnASCII += "01010010";
  113.   }
  114.  
  115. if (CadenaEnTexto[i] == 'S')
  116.   {
  117.   CadenaEnASCII += "01010011";
  118.   }
  119.  
  120. if (CadenaEnTexto[i] == 'T')
  121.   {
  122.   CadenaEnASCII += "01010100";
  123.   }
  124.  
  125. if (CadenaEnTexto[i] == 'U')
  126.   {
  127.   CadenaEnASCII += "01010101";
  128.   }
  129.  
  130. if (CadenaEnTexto[i] == 'V')
  131.   {
  132.   CadenaEnASCII += "01010110";
  133.   }
  134.  
  135. if (CadenaEnTexto[i] == 'W')
  136.   {
  137.   CadenaEnASCII += "01010111";
  138.   }
  139.  
  140. if (CadenaEnTexto[i] == 'X')
  141.   {
  142.   CadenaEnASCII += "01011000";
  143.   }
  144.  
  145. if (CadenaEnTexto[i] == 'Y')
  146.   {
  147.   CadenaEnASCII += "01011001";
  148.   }
  149.  
  150. if (CadenaEnTexto[i] == 'Z')
  151.   {
  152.   CadenaEnASCII += "01011010";
  153.   }
  154.  
  155. if (CadenaEnTexto[i] == 'a')
  156.   {
  157.   CadenaEnASCII += "01100001" ;
  158.   }
  159.  
  160. if (CadenaEnTexto[i] == 'b')
  161.   {
  162.   CadenaEnASCII += "01100010";
  163.   }
  164.  
  165. if (CadenaEnTexto[i] == 'c')
  166.   {
  167.   CadenaEnASCII += "01100011";
  168.   }
  169.  
  170. if (CadenaEnTexto[i] == 'd')
  171.   {
  172.   CadenaEnASCII += "01100100";
  173.   }
  174.  
  175. if (CadenaEnTexto[i] == 'e')
  176.   {
  177.   CadenaEnASCII += "01100101";
  178.   }
  179.  
  180. if (CadenaEnTexto[i] == 'f')
  181.   {
  182.   CadenaEnASCII += "01100110";
  183.   }
  184.  
  185. if (CadenaEnTexto[i] == 'g')
  186.   {
  187.   CadenaEnASCII += "01100111";
  188.   }
  189.  
  190. if (CadenaEnTexto[i] == 'h')
  191.   {
  192.   CadenaEnASCII += "01101000";
  193.   }
  194.  
  195. if (CadenaEnTexto[i] == 'i')
  196.   {
  197.   CadenaEnASCII += "01101001";
  198.   }
  199.  
  200.  
  201. if (CadenaEnTexto[i] == 'j')
  202.   {
  203.   CadenaEnASCII += "01101010";
  204.   }
  205.  
  206. if (CadenaEnTexto[i] == 'k')
  207.   {
  208.   CadenaEnASCII += "01101011";
  209.   }
  210.  
  211. if (CadenaEnTexto[i] == 'l')
  212.   {
  213.   CadenaEnASCII += "01101100";
  214.   }
  215.  
  216. if (CadenaEnTexto[i] == 'm')
  217.   {
  218.   CadenaEnASCII += "01101101";
  219.   }
  220.  
  221. if (CadenaEnTexto[i] == 'n')
  222.   {
  223.   CadenaEnASCII += "01101110";
  224.   }
  225.  
  226. if (CadenaEnTexto[i] == 'o')
  227.   {
  228.   CadenaEnASCII += "01101111";
  229.   }
  230.  
  231. if (CadenaEnTexto[i] == 'p')
  232.   {
  233.   CadenaEnASCII += "01110000";
  234.   }
  235.  
  236. if (CadenaEnTexto[i] == 'q')
  237.   {
  238.   CadenaEnASCII += "01110001";
  239.   }
  240.  
  241.  
  242. if (CadenaEnTexto[i] == 'r')
  243.   {
  244.   CadenaEnASCII += "01110010";
  245.   }
  246.  
  247. if (CadenaEnTexto[i] == 's')
  248.   {
  249.   CadenaEnASCII += "01110011";
  250.   }
  251.  
  252. if (CadenaEnTexto[i] == 't')
  253.   {
  254.   CadenaEnASCII += "01110100";
  255.   }
  256.  
  257. if (CadenaEnTexto[i] == 'u')
  258.   {
  259.   CadenaEnASCII += "01110101";
  260.   }
  261.  
  262. if (CadenaEnTexto[i] == 'v')
  263.   {
  264.   CadenaEnASCII += "01110110";
  265.   }
  266.  
  267. if (CadenaEnTexto[i] == 'w')
  268.   {
  269.   CadenaEnASCII += "01110111";
  270.   }
  271.  
  272. if (CadenaEnTexto[i] == 'x')
  273.   {
  274.   CadenaEnASCII += "01111000";
  275.   }
  276.  
  277. if (CadenaEnTexto[i] == 'y')
  278.   {
  279.   CadenaEnASCII += "01111001";
  280.   }
  281.  
  282. if (CadenaEnTexto[i] == 'z')
  283.   {
  284.   CadenaEnASCII += "01111010";
  285.   }
  286.  
  287. if (CadenaEnTexto[i] == '0')
  288.   {
  289.   CadenaEnASCII += "00110000";
  290.   }
  291.  
  292. if (CadenaEnTexto[i] == '1')
  293.   {
  294.   CadenaEnASCII += "00110001";
  295.   }
  296.  
  297. if (CadenaEnTexto[i] == '2')
  298.   {
  299.   CadenaEnASCII += "00110010";
  300.   }
  301.  
  302.  
  303. if (CadenaEnTexto[i] == '3')
  304.   {
  305.   CadenaEnASCII += "00110011";
  306.   }
  307.  
  308. if (CadenaEnTexto[i] == '4')
  309.   {
  310.   CadenaEnASCII += "00110100";
  311.   }
  312.  
  313. if (CadenaEnTexto[i] == '5')
  314.   {
  315.   CadenaEnASCII += "00110101";
  316.   }
  317.  
  318. if (CadenaEnTexto[i] == '6')
  319.   {
  320.   CadenaEnASCII += "00110110";
  321.   }
  322.  
  323. if (CadenaEnTexto[i] == '7')
  324.   {
  325.   CadenaEnASCII += "00110111";
  326.   }
  327.  
  328. if (CadenaEnTexto[i] == '8')
  329.   {
  330.   CadenaEnASCII += "00111000";
  331.   }
  332.  
  333. if (CadenaEnTexto[i] == '9')
  334.   {
  335.   CadenaEnASCII += "00111001";
  336.   }
  337.  
  338. if (CadenaEnTexto[i] == '+')
  339.   {
  340.   CadenaEnASCII += "00101011";
  341.   }
  342.  
  343. if (CadenaEnTexto[i] == '/')
  344.   {
  345.   CadenaEnASCII += "00101111";
  346.   }
  347.  
  348. }
  349.  
  350. CadenaDeBits6en6 += CadenaEnASCII;
  351. CadenaDeBits6en6Tamanho = CadenaDeBits6en6.length;
  352.  
  353. RestoDeDividirEntre6 = CadenaDeBits6en6Tamanho % 6;
  354.  
  355. switch (RestoDeDividirEntre6)
  356. {
  357.   case 2:
  358.   {
  359.   CadenaDeBits6en6 += "0000";
  360.   ContadorNumDeCerosAnhadidos = 4;
  361.   CadenaDeBits6en6Tamanho += 4;
  362.   } break;
  363.  
  364.   case 4:
  365.   {
  366.   CadenaDeBits6en6 += "00";
  367.   ContadorNumDeCerosAnhadidos = 2;
  368.   CadenaDeBits6en6Tamanho += 2;
  369.   } break;
  370.  
  371.   default:
  372.   {
  373.  
  374.   } break;
  375. }
  376.  
  377.  
  378. do
  379. {
  380.  
  381. TempBits6 += CadenaDeBits6en6[z];
  382.  
  383. x++;
  384. z++;
  385.  
  386.  
  387.   if (x == 6 )
  388.   {
  389.  
  390.  
  391. if ( TempBits6 == "000000")
  392.       {
  393.       CifradoFinal += "A";
  394.       }
  395.  
  396. if ( TempBits6 == "000001")
  397.       {
  398.       CifradoFinal += "B";
  399.       }
  400.  
  401. if ( TempBits6 == "000010")
  402.       {
  403.       CifradoFinal += "C";
  404.       }
  405.  
  406. if ( TempBits6 == "000011")
  407.       {
  408.       CifradoFinal += "D";
  409.       }
  410.  
  411. if ( TempBits6 == "000100")
  412.       {
  413.       CifradoFinal += "E";
  414.       }
  415.  
  416. if ( TempBits6 == "000101")
  417.       {
  418.       CifradoFinal += "F";
  419.       }
  420.  
  421. if ( TempBits6 == "000110")
  422.       {
  423.       CifradoFinal += "G";
  424.       }
  425.  
  426. if ( TempBits6 == "000111")
  427.       {
  428.       CifradoFinal += "H";
  429.       }
  430.  
  431. if ( TempBits6 == "001000")
  432.       {
  433.       CifradoFinal += "I";
  434.       }
  435.  
  436. if ( TempBits6 == "001001")
  437.       {
  438.       CifradoFinal += "J";
  439.       }
  440.  
  441. if ( TempBits6 == "001010")
  442.       {
  443.       CifradoFinal += "K";
  444.       }
  445.  
  446. if ( TempBits6 == "001011")
  447.       {
  448.       CifradoFinal += "L";
  449.       }
  450.  
  451. if ( TempBits6 == "001100")
  452.       {
  453.       CifradoFinal += "M";
  454.       }
  455.  
  456. if ( TempBits6 == "001101")
  457.       {
  458.       CifradoFinal += "N";
  459.       }
  460.  
  461. if ( TempBits6 == "001110")
  462.       {
  463.       CifradoFinal += "O";
  464.       }
  465.  
  466. if ( TempBits6 == "001111")
  467.       {
  468.       CifradoFinal += "P";
  469.       }
  470.  
  471. if ( TempBits6 == "010000")
  472.       {
  473.       CifradoFinal += "Q";
  474.       }
  475.  
  476. if ( TempBits6 == "010001")
  477.       {
  478.       CifradoFinal += "R";
  479.       }
  480.  
  481. if ( TempBits6 == "010010")
  482.       {
  483.       CifradoFinal += "S";
  484.       }
  485.  
  486. if ( TempBits6 == "010011")
  487.       {
  488.       CifradoFinal += "T";
  489.       }
  490.  
  491. if ( TempBits6 == "010100")
  492.       {
  493.       CifradoFinal += "U";
  494.       }
  495.  
  496. if ( TempBits6 == "010101")
  497.       {
  498.       CifradoFinal += "V";
  499.       }
  500.  
  501. if ( TempBits6 == "010110")
  502.       {
  503.       CifradoFinal += "W";
  504.       }
  505.  
  506. if ( TempBits6 == "010111")
  507.       {
  508.       CifradoFinal += "X";
  509.       }
  510.  
  511. if ( TempBits6 == "011000")
  512.       {
  513.       CifradoFinal += "Y";
  514.       }
  515.  
  516. if ( TempBits6 == "011001")
  517.       {
  518.       CifradoFinal += "Z";
  519.       }
  520.  
  521. if ( TempBits6 == "011010")
  522.       {
  523.       CifradoFinal += "a";
  524.       }
  525.  
  526. if ( TempBits6 == "011011")
  527.       {
  528.       CifradoFinal += "b";
  529.       }
  530.  
  531. if ( TempBits6 == "011100")
  532.       {
  533.       CifradoFinal += "c";
  534.       }
  535.  
  536. if ( TempBits6 == "011101")
  537.       {
  538.       CifradoFinal += "d";
  539.       }
  540.  
  541. if ( TempBits6 == "011110")
  542.       {
  543.       CifradoFinal += "e";
  544.       }
  545.  
  546. if ( TempBits6 == "011111")
  547.       {
  548.       CifradoFinal += "f";
  549.       }
  550.  
  551. if ( TempBits6 == "100000")
  552.       {
  553.       CifradoFinal += "g";
  554.       }
  555.  
  556. if ( TempBits6 == "100001")
  557.       {
  558.       CifradoFinal += "h";
  559.       }
  560.  
  561. if ( TempBits6 == "100010")
  562.       {
  563.       CifradoFinal += "i";
  564.       }
  565.  
  566. if ( TempBits6 == "100011")
  567.       {
  568.       CifradoFinal += "j";
  569.       }
  570.  
  571. if ( TempBits6 == "100100")
  572.       {
  573.       CifradoFinal += "k";
  574.       }
  575.  
  576. if ( TempBits6 == "100101")
  577.       {
  578.       CifradoFinal += "l";
  579.       }
  580.  
  581. if ( TempBits6 == "100110")
  582.       {
  583.       CifradoFinal += "m";
  584.       }
  585.  
  586. if ( TempBits6 == "100111")
  587.       {
  588.       CifradoFinal += "n";
  589.       }
  590.  
  591. if ( TempBits6 == "101000")
  592.       {
  593.       CifradoFinal += "o";
  594.       }
  595.  
  596. if ( TempBits6 == "101001")
  597.       {
  598.       CifradoFinal += "p";
  599.       }
  600.  
  601. if ( TempBits6 == "101010")
  602.       {
  603.       CifradoFinal += "q";
  604.       }
  605.  
  606. if ( TempBits6 == "101011")
  607.       {
  608.       CifradoFinal += "r";
  609.       }
  610.  
  611. if ( TempBits6 == "101100")
  612.       {
  613.       CifradoFinal += "s";
  614.       }
  615.  
  616. if ( TempBits6 == "101101")
  617.       {
  618.       CifradoFinal += "t";
  619.       }
  620.  
  621. if ( TempBits6 == "101110")
  622.       {
  623.       CifradoFinal += "u";
  624.       }
  625.  
  626. if ( TempBits6 == "101111")
  627.       {
  628.       CifradoFinal += "v";
  629.       }
  630.  
  631. if ( TempBits6 == "110000")
  632.       {
  633.       CifradoFinal += "w";
  634.       }
  635.  
  636. if ( TempBits6 == "110001")
  637.       {
  638.       CifradoFinal += "x";
  639.       }
  640.  
  641. if ( TempBits6 == "110010")
  642.       {
  643.       CifradoFinal += "y";
  644.       }
  645.  
  646. if ( TempBits6 == "110011")
  647.       {
  648.       CifradoFinal += "z";
  649.       }
  650.  
  651. if ( TempBits6 == "110100")
  652.       {
  653.       CifradoFinal += "0";
  654.       }
  655.  
  656. if ( TempBits6 == "110101")
  657.       {
  658.       CifradoFinal += "1";
  659.       }
  660.  
  661. if ( TempBits6 == "110110")
  662.       {
  663.       CifradoFinal += "2";
  664.       }
  665.  
  666. if ( TempBits6 == "110111")
  667.       {
  668.       CifradoFinal += "3";
  669.       }
  670.  
  671. if ( TempBits6 == "111000")
  672.       {
  673.       CifradoFinal += "4";
  674.       }
  675.  
  676. if ( TempBits6 == "111001")
  677.       {
  678.       CifradoFinal += "5";
  679.       }
  680.  
  681. if ( TempBits6 == "111010")
  682.       {
  683.       CifradoFinal += "6";
  684.       }
  685.  
  686. if ( TempBits6 == "111011")
  687.       {
  688.       CifradoFinal += "7";
  689.       }
  690.  
  691. if ( TempBits6 == "111100")
  692.       {
  693.       CifradoFinal += "8";
  694.       }
  695.  
  696. if ( TempBits6 == "111101")
  697.       {
  698.       CifradoFinal += "9";
  699.       }
  700.  
  701. if ( TempBits6 == "111110")
  702.       {
  703.       CifradoFinal += "+";
  704.       }
  705.  
  706. if ( TempBits6 == "111111")
  707.       {
  708.       CifradoFinal += "/";
  709.       }
  710.  
  711.  
  712.   x = 0;
  713.   TempBits6 = "";
  714.   }
  715.  
  716.   if ( z == CadenaDeBits6en6Tamanho )
  717.   {
  718.   mantenerseEnBucle = false;
  719.   }
  720.  
  721. } while ( mantenerseEnBucle == true )
  722.  
  723.  
  724. switch (ContadorNumDeCerosAnhadidos)
  725. {
  726.   case 2:
  727.   {
  728.   CifradoFinal += "=";
  729.   } break;
  730.  
  731.   case 4:
  732.   {
  733.    CifradoFinal += "==";
  734.   } break;
  735. }
  736.  
  737. document.write(CifradoFinal);
  738. alert (CifradoFinal);
  739. </js>
  740. </body>
  741. </html>
  742.  

Comentarios del código:
Los 2 switchs es parte necesaria del cifrado base64. Básicamente lo que hago es usar el operador módulo (%) para obtener el resto de dividir el tamaño del texto que se quiere cifrar entre 6 (los bits, ceros y unos, se agrupan de 6 en 6 en el cifrado base64) Como puede ser que al agrupar de 6 en 6 te queden bits sueltos, es necesario añadirle el símbolo = por cada 2bits. Con un ejemplo se ve mejor:
Si tengo los bits 1 0 0 0 1 0 1 1 y los quiero agrupar de 6 en 6. Tendré dos grupos. 100010 y 11. Lógicamente me faltan bits en el segundo grupo para tener 6 bits en ambos grupos. Entonces le añado ceros hasta tener 6 bits: 11 -> 110000
Y los simbolos igual entonces para que?
Para identificar si al número se le añadieron ceros o el número ya era así, ya que si no usamos los iguales, no podrías diferenciar cuando el texto a cifrar fue 1 0 0 0 1 0 1 1 de cuando el texo a cifrar fue 1 0 0 0 1 0 1 1 0 0 0 0.
Al no poder diferenciar tendríamos un serio problema al descifrar el cifrado y por eso se añade un igual por cada grupo de 2 bits añadidos.

Y por qué por cada 2 bits 1 igual y no por cada bit un igual? Porque solo existen 2 posibilidades. Que falten 2 bits para llegar a tener los 6 bits, o que falten 4 bits para llegar a tener los 6 bits. No tendría sentido usar 2 iguales y 4 iguales cuando podemos representar lo mismo con 1 igual y 2 iguales.

Si te parece complejo en realidad es una tontería, leete la entrada sobre el cifrado en wikipedia y lo acabarás entendiendo. Yo aprendí a implementar el cifrado usando como único recurso la wikipedia y un cifrador online psra ver si lo estaba haciendo bien.
Cuando pone case 2 en el switch del resto significa que sobraron 2 bits, por eso hay que añadirle 4 bits más para llegar a los 6.

El código dentro del bucle do while lo único que hace es añadir bits a una variable y en cuanto tiene 6 bits guarda en otra variable ese número binario pasado a caracter usando la tabla comun de base64. 000000 = A, 000001 = B, etc.
Tras obtener la cadena, vuelve a tomar los 6 siguientes bits repitiendo este proceso hasta que no queden bits que tomar.

Pueden usarse arrays para la comparación y breaks en los if para mejorar el rendimiento y reducir drásticamente las líneas del código. Pero así es más visual y fácil de entender para newbies. Lo mismo con reducir el uso de variables, etc.

Si no entendeis algo comentarlo.


« Última modificación: 9 Agosto 2019, 15:57 pm por string Manolo » En línea

Mi perfil de patrocinadores de GitHub está activo! Puedes patrocinarme para apoyar mi trabajo de código abierto 💖

engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: Cifrar texto a Base64 en javascript
« Respuesta #1 en: 8 Agosto 2019, 07:29 am »

Base64 no es un cifrado, es una codificación (un cifrado es un método de seguridad, una codificación es un cambio de medio para un mensaje)

Fuera de todo, tengo una curiosidad, por que no usar

Código
  1. codigo = btoa(mensaje);
  2. // O
  3. mensaje = atob(codigo);

Intentas saltar algún filtro de funciones?


En línea

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.
animanegra

Desconectado Desconectado

Mensajes: 287



Ver Perfil
Re: Cifrar texto a Base64 en javascript
« Respuesta #2 en: 8 Agosto 2019, 09:21 am »

Entiendo que es por realizar el ejercicio de implementarlo y por dejarlo como guía o manual de como hacer la codificación.
Enhorabuena por el código, este tipo de cosas las deberíamos de hacer todos, aunque después igual utilicemos librerías. Pero para entender bien como funcionan los algoritmos creo que es la manera más efectiva. Y eso es algo que a la gente se le suele olvidar o suele pasar de ello.
En línea


42
No contesto mensajes por privado, si tienes alguna pregunta, consulta o petición plantéala en el foro para que se aproveche toda la comunidad.
@XSStringManolo
Hacker/Programador
Colaborador
***
Desconectado Desconectado

Mensajes: 2.397


Turn off the red ligth


Ver Perfil WWW
Re: Cifrar texto a Base64 en javascript
« Respuesta #3 en: 8 Agosto 2019, 18:19 pm »

Base64 no es un cifrado, es una codificación (un cifrado es un método de seguridad, una codificación es un cambio de medio para un mensaje)

Fuera de todo, tengo una curiosidad, por que no usar

Código
  1. codigo = btoa(mensaje);
  2. // O
  3. mensaje = atob(codigo);

Intentas saltar algún filtro de funciones?
Básicamente es para lo que comenta animanegra. Me gusta implementar cifrados para entenderlos a la perfección. Así al conocer como funcionan varios cifrados puedo hacer mi propio cifrado con las técnicas que voy aprendiendo al implementarlos.
A parte al tener el cifrado implementado puedes hacer cambios en la implementación para por ejemplo cambiar la base, la tabla para usar tu propio diccionario de 64 carácteres o 128 con unicode o 32 con no case sensitive...
A parte así la gente puede revisarlo y entenderlo simplemente por curiosidad de como funciona. Las librerías e implementaciones que veo por ahí hacen un montón de operaciones y son un caos aunque sean más eficientes o no.

Igual voy subiendo más implementaciones un poco más complejo tipo serpent o un algoritmo propio que tengo para compresión de texto.
En línea

Mi perfil de patrocinadores de GitHub está activo! Puedes patrocinarme para apoyar mi trabajo de código abierto 💖

MinusFour
Moderador Global
***
Desconectado Desconectado

Mensajes: 5.529


I'm fourth.


Ver Perfil WWW
Re: Cifrar texto a Base64 en javascript
« Respuesta #4 en: 9 Agosto 2019, 03:16 am »

Es más simple si utilizas operadores bitwise:

Código
  1. let b64 = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S',
  2. 'T','U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
  3. 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/', '='];
  4.  
  5. function asciiToBase64(str){
  6.        if(!str.length) return "";
  7.        let [f8, s8, t8] = str.substring(0,3).split('').map(c => c.charCodeAt(0));
  8.        let firstB = (f8 & 0b11111100) >>> 2;
  9.        let secondB = ((f8 & 0b00000011) << 4) | ((s8 & 0b11110000) >>> 4);
  10.        let thirdB = s8 ? (((s8 & 0b00001111) << 2) | ((t8 & 0b11000000) >>> 6)) : 64;
  11.        let fourthB = t8 ? (t8 & 0b00111111) : 64;
  12.        return b64[firstB] + b64[secondB] + b64[thirdB] + b64[fourthB] + asciiToBase64(str.slice(3));
  13. }
En línea

@XSStringManolo
Hacker/Programador
Colaborador
***
Desconectado Desconectado

Mensajes: 2.397


Turn off the red ligth


Ver Perfil WWW
Re: Cifrar texto a Base64 en javascript
« Respuesta #5 en: 9 Agosto 2019, 07:23 am »

Es más simple si utilizas operadores bitwise:

Código
  1. let b64 = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S',
  2. 'T','U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
  3. 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/', '='];
  4.  
  5. function asciiToBase64(str){
  6.        if(!str.length) return "";
  7.        let [f8, s8, t8] = str.substring(0,3).split('').map(c => c.charCodeAt(0));
  8.        let firstB = (f8 & 0b11111100) >>> 2;
  9.        let secondB = ((f8 & 0b00000011) << 4) | ((s8 & 0b11110000) >>> 4);
  10.        let thirdB = s8 ? (((s8 & 0b00001111) << 2) | ((t8 & 0b11000000) >>> 6)) : 64;
  11.        let fourthB = t8 ? (t8 & 0b00111111) : 64;
  12.        return b64[firstB] + b64[secondB] + b64[thirdB] + b64[fourthB] + asciiToBase64(str.slice(3));
  13. }

--------------------------------------------------------------------

Sí, mucho más sencillo, corto y eficiente. Lo hice a lo bruto para poder modificarlo fácilmente y tener control en cualquier parte del proceso. Si te fijas por el nombre de la variable iba a poner primero el valor en ASCII traduciendo la A a 65, por si se quería realizar alguna operación con los valores en ASCII y los valores que no estuviesen en el rango de caracteres de base64 hacer saltos hacia los siguientes pero no quería usar un array y me iba a dar pereza y por eso puse el binario directo xD.

Por si alguien va usar los operadores de bits para implementar la codificación, según el standart de javascript se necesita tirar una excepción en caso de que los valores no estén dentro del rango 0-255 (que son los que contempla el ASCII) en el momento de hacer el encode:
Código
  1. if (/([^\u0000-\u00ff])/.cadenaCodificar(cadenaCodificar)){ throw new Error("No se pueden codificar caracteres no ASCII.");

Para el decoder:
Código
  1. CadenaDecodificar = CadenaDecodificar.replace(/\s/g,""); if(!(/^[a-z0-9\+\/\s]+\={0,2}$/i.test(text)) || text.length % 4 > 0){ throw new Error("El texto no es una cadena base64.");

Hace 10 mins me puse a hacer el decoder de la misma forma que el encoder, ya funciona todo, pero de momento solo decodifica el binario de la letra A. Me falta ponerle los 62 if restantes asique igual lo acabo mañana que no me apetece xD

El decoder lo debería poner en este mismo hilo? O creo otro independiente y pongo links del uno al otro? Funcionan ambos por separado aunque le cambié el nombre a las variables para que no coincidiesen por si se quieren usar en las mismas etiquetas los 2 juntos.
Cuando tenga datos los meto en un blogspot y los linkeo también por si alguien los quiere probar antes de usarlos.
En línea

Mi perfil de patrocinadores de GitHub está activo! Puedes patrocinarme para apoyar mi trabajo de código abierto 💖

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
ionCube PHP Encoder
Ingeniería Inversa
el_cantante 0 4,290 Último mensaje 8 Junio 2008, 13:28 pm
por el_cantante
[Base64 encoder/decoder]
Java
xmbeat 1 2,201 Último mensaje 13 Julio 2012, 22:08 pm
por Debci
encoder anti avg
Hacking
fsnpower 1 2,800 Último mensaje 14 Febrero 2016, 19:32 pm
por abaadoon
[Delphi] Base64 Image Encoder 0.2
Programación General
BigBear 2 2,668 Último mensaje 18 Septiembre 2016, 18:13 pm
por BigBear
Base64 a ASCII (decoder - javascript)
Desarrollo Web
@XSStringManolo 2 1,755 Último mensaje 10 Agosto 2019, 01:52 am
por @XSStringManolo
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines