Mostrando las entradas con la etiqueta cifrado. Mostrar todas las entradas
Mostrando las entradas con la etiqueta cifrado. Mostrar todas las entradas
Vamos a programar #46 - Código Bacon (ver Java android)
Hola de nuevo a todos, el día de hoy vamos a ver un poco mas sobre el código Bacon y cómo implementar una aplicación en android que haga todo el trabajo sucio por nosotros.
En post anteriores vimos cómo hacer la misma aplicación para C# (escritorio) y Javascript (Web), en esta ocasión, todo el post será solo para mostrar la app, puesto que las funciones que se emplean son exactamente las mismas que la versión de C#. El código completo es el siguiente:
Cómo notarás, no hay ningún cambio significativo (y no lo habrá en unos días debido a que mi PC murió y no cuento con el tiempo cómo para arreglarlo). Por ahora dejo el código fuente y el APK ya compilado para que los descargues de mi dropbox. Las actualizaciones se harán juntas para las 3 versiones en alguno de los próximos post
Por ahora es todo, los leo luego.
En post anteriores vimos cómo hacer la misma aplicación para C# (escritorio) y Javascript (Web), en esta ocasión, todo el post será solo para mostrar la app, puesto que las funciones que se emplean son exactamente las mismas que la versión de C#. El código completo es el siguiente:
package com.mdev.baconiancipher;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
public class MainActivity extends Activity {
EditText ETInput, ETInput2, ETPreResult, ETResult;
Button BtnPreCipher, BtnCipher;
String[] Values = new String[]{"AAAAA", "AAAAB", "AAABA",
"AAABB", "AABAA", "AABAB", "AABBA", "AABBB", "ABAAA", "ABAAA",
"ABAAB", "ABABA", "ABABB", "ABBAA", "ABBAB", "ABBBA", "ABBBB",
"BAAAA", "BAAAB", "BAABA", "BAABB", "BAABB", "BABAA", "BABAB",
"BABBA", "BABBB"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ETInput = findViewById(R.id.ETInput);
ETInput2 = findViewById(R.id.ETInput2);
ETPreResult = findViewById(R.id.ETPreResult);
ETResult = findViewById(R.id.ETResult);
BtnPreCipher = findViewById(R.id.BtnPreCipher);
BtnCipher = findViewById(R.id.BtnCipher);
BtnPreCipher.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ETPreResult.setText(CharToBaconianCode(ETInput.getText().toString()));
}
}
);
BtnCipher.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ETResult.setText(FinalCipher(ETPreResult.getText().toString(),ETInput2.getText().toString()));
}
});
}
private String CharToBaconianCode(String Input)
{
Input = Input.toUpperCase();
char[] Letras = Input.toCharArray();
String OutValue = "";
for (int X = 0; X < Letras.length; X++)
{
if ((byte)Letras[X] < 91 && (byte)Letras[X] > 64)
{
OutValue += Values[(byte)Letras[X] - 65];// + " ";
}
}
return OutValue;
}
private boolean IsLower(byte Code)
{
if (Code > 96 && Code < 123)
return true;
else
return false;
}
private String FinalCipher(String PreCipher, String Phrase)
{
if (PreCipher.length() != Phrase.length())
{
ShowDialog("Error","Las longitudes del pre-cifrado y la frase para insertarlo no coinciden");
return "Error";
}
char[] PreCipherChars = PreCipher.toCharArray();
char[] PhraseChars = Phrase.toCharArray();
String FinalResult = "";
for (int Y = 0; Y < PhraseChars.length; Y++)
{
if ((byte)PreCipherChars[Y] == 65)
{
if (IsLower((byte)PhraseChars[Y]))
FinalResult += PhraseChars[Y];
else
FinalResult += (char)(PhraseChars[Y] + 32);
}
else
{
if (!IsLower((byte)PhraseChars[Y]))
FinalResult += PhraseChars[Y];
else
FinalResult += (char)(PhraseChars[Y] - 32);
}
}
return FinalResult;
}
//Mostrar dialog de manera sencilla
private void ShowDialog(String Title, String Caption)
{
new AlertDialog.Builder(this)
.setTitle(Title)
.setMessage(Caption)
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// algo
}
})
.setIcon(android.R.drawable.ic_dialog_alert)
.show();
}
}
Cómo notarás, no hay ningún cambio significativo (y no lo habrá en unos días debido a que mi PC murió y no cuento con el tiempo cómo para arreglarlo). Por ahora dejo el código fuente y el APK ya compilado para que los descargues de mi dropbox. Las actualizaciones se harán juntas para las 3 versiones en alguno de los próximos post
Por ahora es todo, los leo luego.
1/14/2018 06:41:00 p.m.
aprende
,
cifrado
,
Código Bacon
,
programacion
Vamos a programar #44 - Código Bacon (ver. C#).
Hola de nuevo a todos, el día de hoy vamos a ver el código en C# que sirve para cifrar un mensaje usando el código Bacon.
El código consiste de 3 funciones, pero además hay una matriz del tipo "string" en el cual se almacena cada valor del código correspondiente a cada letra. En esta matriz verás que hay valores duplicados; pero si hacemos memoria, hay que recordar que el código para los pares de letras "i - j" y "u - v" son iguales, entonces, para fines prácticos, simplemente repetimos los valores de estas.
Antes de empezar con la explicación del código, hay que plantear lo que tenemos que hacer. Para poder trabajar más cómodamente, tenemos que buscar una forma de "entendernos" con la computadora. Si hacemos un poco más de memoria, en el post donde usábamos el cifrado de Vigenere lo que hacíamos realmente, era pasar la letra a su equivalente en el código ASCII. Al revisarlo, notaremos que las letras mayúsculas estaban comprendidas entre el 65 y 90, mientras que las minúsculas, están entre el 97 y 122 (si contar las letras ñ's), así que aprovechando eso y la matriz que creamos al inicio, podemos hacer mucho más fácil el proceso.
Ahora, el código en orden de aparición. Primero tenemos la función "CharToBaconianCode". Está función recibe un parámetro del tipo "string" y lo que hace, es crear el pre-cifrado aplicando a la frase que queremos ocultar las reglas del código, ya que para esta parte no necesitamos distinguir entre mayúsculas o minúsculas, lo primero que hacemos es convertir toda las frase a mayúsculas, así nos aseguraremos que todos los números (que representan a cada letra), estarán dentro del rango 65 ~ 90. Luego convertimos la frase en un arreglo del tipo "char", usando la función "ToCharArray()", cuando separamos todo, tenemos que la letra "A" tiene el código 65, pero en la matriz que creamos al inicio en donde almacenamos el valor del código Bacon para cada letra, esta en la primer posicion (en la posición cero en realidad), entonces para ajustar cada valor y que coincida con loas valores de la matriz "Values", solo debemos de restar 65 y así obtendremos en automático el valor correcto desde la matriz (aquí lo importante de convertir todo a mayúsculas). Está función devuelve un valor del tipo "string" que representa el mensaje ingresado cómo parámetro pero con el pre-cifrado ya aplicado.
La siguiente función es: "IsLower". Cómo su nombre lo indica, está función solo sirve para identificar si un valor está dentro del rango de las letras minúsculas. Esta función recibe un parámetro del tipo "byte" que corresponde a la letra que queramos saber si es minúscula. Esta función devuelve un valor del tipo "bool" "true" si el parámetro ingresado están dentro del rango 97 ~ 122 (indicando que es una letra minúscula).
La última función es "FinalCipher". Esta función recibe dos parámetros, el primero de tipo "string" llamado "PreCipher", este debe de ser SIEMPRE, el resultado de la función "CharToBaconianCode" (o si lo hiciste a mano, el resultado del pre-cifrado). El segundo parámetro, también es del tipo "string" y se llama "Phrase", el cual debe de ser la frase en la cual queremos insertar el mensaje pre-cifrado. Para generar el resultado final, esta función separa los dos parámetros de entrada y los convierte en una matriz del tipo "char", la frase pre-cifrada es la que nos va a dictar cómo debe de estar escrito el mensaje, pero lo que primero nos aseguramos de solo tener "A" y "B", así podemos crear un par de condiciones para cada caso (Al encontrar "A" se escribirá una minúscula y al encontrar una "B", se usara una mayúscula). Dentro de cada condición, vamos a tener otra condición más. Puede ser que el mensaje de destino (o segundo parámetro) tenga ya una letra mayúscula o minúscula, si el pre-cifrado nos dice que debe de haber una minúscula, solamente mandamos a llamar a la función "IsLower" y si el resultado es "true", dejamos las cosas cómo están, pero si es el caso contrario, convertimos el valor de la letra actual a un valor del tipo "byte" y le restaremos 32 (recuerda que la letra "A" es 65 y la letra "a" es 97, al restar 32 a la "a" tenemos "A"), para el caso contrario, solamente bastará con sumarle 32 y obtendremos el mismo resultado.
El Código.
El código en c# que vamos a utilizar es el siguiente:
//El código Bacon sigue las siguientes reglas:
// a- AAAAA
// b- AAAAB
// c- AAABA
// d- AAABB
// e- AABAA
// f- AABAB
// g- AABBA
// h- AABBB
// i j- ABAAA
// k- ABAAB
// l- ABABA
// m- ABABB
// n- ABBAA
// o- ABBAB
// p- ABBBA
// q- ABBBB
// r- BAAAA
// s- BAAAB
// t- BAABA
// u v- BAABB
// w- BABAA
// x- BABAB
// y- BABBA
// z- BABBB
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace Baconiancipher
{
public partial class FrmMain : Form
{
private String[] Values = {"AAAAA", "AAAAB", "AAABA",
"AAABB", "AABAA", "AABAB", "AABBA", "AABBB", "ABAAA", "ABAAA",
"ABAAB", "ABABA", "ABABB", "ABBAA", "ABBAB", "ABBBA", "ABBBB",
"BAAAA", "BAAAB", "BAABA", "BAABB", "BAABB", "BABAA", "BABAB",
"BABBA", "BABBB"};
private string CharToBaconianCode(string Input)
{
Input = Input.ToUpper();
char[] Letras = Input.ToCharArray();
string OutValue = "";
for (int X = 0; X < Letras.Length; X++)
{
if ((byte)Letras[X] < 91 && (byte)Letras[X] > 64)
{
OutValue += Values[(byte)Letras[X] - 65];// + " ";
}
}
return OutValue;
}
private bool IsLower(byte Code)
{
if (Code > 96 && Code < 123)
return true;
else
return false;
}
private string FinalCipher(string PreCipher, string Phrase)
{
if (PreCipher.Length != Phrase.Length)
{
MessageBox.Show("Las longitudes del pre-cifrado y la frase para insertarlo no coinciden", "Error",
MessageBoxButtons.OK, MessageBoxIcon.Error);
return "Error";
}
char[] PreCipherChars = PreCipher.ToCharArray();
char[] PhraseChars = Phrase.ToCharArray();
string FinalResult = "";
for (int Y = 0; Y < PhraseChars.Length; Y++)
{
if ((byte)PreCipherChars[Y] == 65)
{
if (IsLower((byte)Phrase[Y]))
FinalResult += PhraseChars[Y];
else
FinalResult += (char)(PhraseChars[Y] + 32);
}
else
{
if (!IsLower((byte)Phrase[Y]))
FinalResult += PhraseChars[Y];
else
FinalResult += (char)(PhraseChars[Y] - 32);
}
}
return FinalResult;
}
public FrmMain()
{
InitializeComponent();
}
private void BtnPreCipher_Click(object sender, EventArgs e)
{
TxtPrecipherResult.Text = CharToBaconianCode(TxtInput.Text);
if (TxtPrecipherResult.TextLength == txtInput2.TextLength)
BtnCipher.Enabled = true;
}
private void txtInput2_TextChanged(object sender, EventArgs e)
{
GBInput2.Text = "Frase de " + txtInput2.TextLength + " letras.";
if (TxtPrecipherResult.TextLength == txtInput2.TextLength)
BtnCipher.Enabled = true;
else
BtnCipher.Enabled = false;
}
private void BtnCipher_Click(object sender, EventArgs e)
{
TxtFinalResult.Text = FinalCipher(TxtPrecipherResult.Text, txtInput2.Text);
}
}
}
El código consiste de 3 funciones, pero además hay una matriz del tipo "string" en el cual se almacena cada valor del código correspondiente a cada letra. En esta matriz verás que hay valores duplicados; pero si hacemos memoria, hay que recordar que el código para los pares de letras "i - j" y "u - v" son iguales, entonces, para fines prácticos, simplemente repetimos los valores de estas.
Antes de empezar con la explicación del código, hay que plantear lo que tenemos que hacer. Para poder trabajar más cómodamente, tenemos que buscar una forma de "entendernos" con la computadora. Si hacemos un poco más de memoria, en el post donde usábamos el cifrado de Vigenere lo que hacíamos realmente, era pasar la letra a su equivalente en el código ASCII. Al revisarlo, notaremos que las letras mayúsculas estaban comprendidas entre el 65 y 90, mientras que las minúsculas, están entre el 97 y 122 (si contar las letras ñ's), así que aprovechando eso y la matriz que creamos al inicio, podemos hacer mucho más fácil el proceso.
Ahora, el código en orden de aparición. Primero tenemos la función "CharToBaconianCode". Está función recibe un parámetro del tipo "string" y lo que hace, es crear el pre-cifrado aplicando a la frase que queremos ocultar las reglas del código, ya que para esta parte no necesitamos distinguir entre mayúsculas o minúsculas, lo primero que hacemos es convertir toda las frase a mayúsculas, así nos aseguraremos que todos los números (que representan a cada letra), estarán dentro del rango 65 ~ 90. Luego convertimos la frase en un arreglo del tipo "char", usando la función "ToCharArray()", cuando separamos todo, tenemos que la letra "A" tiene el código 65, pero en la matriz que creamos al inicio en donde almacenamos el valor del código Bacon para cada letra, esta en la primer posicion (en la posición cero en realidad), entonces para ajustar cada valor y que coincida con loas valores de la matriz "Values", solo debemos de restar 65 y así obtendremos en automático el valor correcto desde la matriz (aquí lo importante de convertir todo a mayúsculas). Está función devuelve un valor del tipo "string" que representa el mensaje ingresado cómo parámetro pero con el pre-cifrado ya aplicado.
La siguiente función es: "IsLower". Cómo su nombre lo indica, está función solo sirve para identificar si un valor está dentro del rango de las letras minúsculas. Esta función recibe un parámetro del tipo "byte" que corresponde a la letra que queramos saber si es minúscula. Esta función devuelve un valor del tipo "bool" "true" si el parámetro ingresado están dentro del rango 97 ~ 122 (indicando que es una letra minúscula).
La última función es "FinalCipher". Esta función recibe dos parámetros, el primero de tipo "string" llamado "PreCipher", este debe de ser SIEMPRE, el resultado de la función "CharToBaconianCode" (o si lo hiciste a mano, el resultado del pre-cifrado). El segundo parámetro, también es del tipo "string" y se llama "Phrase", el cual debe de ser la frase en la cual queremos insertar el mensaje pre-cifrado. Para generar el resultado final, esta función separa los dos parámetros de entrada y los convierte en una matriz del tipo "char", la frase pre-cifrada es la que nos va a dictar cómo debe de estar escrito el mensaje, pero lo que primero nos aseguramos de solo tener "A" y "B", así podemos crear un par de condiciones para cada caso (Al encontrar "A" se escribirá una minúscula y al encontrar una "B", se usara una mayúscula). Dentro de cada condición, vamos a tener otra condición más. Puede ser que el mensaje de destino (o segundo parámetro) tenga ya una letra mayúscula o minúscula, si el pre-cifrado nos dice que debe de haber una minúscula, solamente mandamos a llamar a la función "IsLower" y si el resultado es "true", dejamos las cosas cómo están, pero si es el caso contrario, convertimos el valor de la letra actual a un valor del tipo "byte" y le restaremos 32 (recuerda que la letra "A" es 65 y la letra "a" es 97, al restar 32 a la "a" tenemos "A"), para el caso contrario, solamente bastará con sumarle 32 y obtendremos el mismo resultado.
A tomar en cuenta...
A pesar de que el programa funciona, aun está en fase "beta", en el caso de la frase que se quiere cifrar, solo bastará con escribirlo y después pulsar el botón "Pre-Cifrar", dentro del programa se toman las medidas necesarias para que el resultado sea el mensaje correctamente pre-cifrado; pero en el caso de la frase en la cual queremos insertarlo, debemos de asegurarnos de no usar símbolos o espacios, ya que se pueden producir resultados cómo en la imagen siguiente:
![]() |
| No deberían de ir los @ |
Por el momento lo dejare así. El cómo solucionarlo, lo puedes averiguar si revisas los post de cifrado que ya hay en el blog.
Cómo siempre, el código completo, lo puedes descargar de mi dropbox, para que lo revises y lo modifiques. La próxima semana, publicaré el código resuelto y además veremos cómo hacer lo mismo en Java (android) o Javascript.
Por ahora es todo, los leo luego
12/31/2017 01:48:00 p.m.
aprende
,
cifrado
,
Código Bacon
,
programacion
Vamos a programar #33 - Calculadora de Vigenère ver2.0.
Hola de nuevo a todos, el día de hoy vamos a ver una actualización para la calculadora de Vigenere que previamente ya habíamos hecho.
La primera versión de esta cumplía con su trabajo, pero no estaba totalmente hecha, no era capaz de interpretar símbolos que no fueran letras. El día de hoy vamos a agregar el código necesario para que funcione.
La primera versión de esta cumplía con su trabajo, pero no estaba totalmente hecha, no era capaz de interpretar símbolos que no fueran letras. El día de hoy vamos a agregar el código necesario para que funcione.
El código.
El código javascript para la calculadora de Vigenere es el siguiente:
function AsciiToA1(Char1)
{
if (IsLower(Char1)){
Char1 -= 32;
}
if (IsEnie(Char1)){
return 15;
}else if(Char1-64 < 15){
return(Char1-64);
}
else if(Char1-64 >= 15 && Char1-64 < 28){
return(Char1-63);
}
}
function IsLetter(c){
return IsUpper(c) || IsLower(c);
}
function IsEnie(Char2){
if(Char2 == 209 || Char2 == 241){
return true;
}else{
return false;
}
}
function IsUpper(Char3){
if((Char3 >= 65 && Char3 <= 90) || (Char3 == 209)){
return true;
}else{
return false;
}
}
function IsLower(Char4){
if((Char4 >= 97 && Char4 <= 122) || (Char4 == 241)){
return true;
}else{
return false;
}
}
function IsA1Char(Char5){
if (Char5 > 27){
return false;
}else{
return true;
}
}
function Encriptar(ModeEnc)
{
debugger;
var GetPhrase = document.getElementById('InputText').value;
var GetPass = document.getElementById('PassWord').value;
var Codes = [];
if(GetPhrase.length < 1 || GetPass.length < 1)
{
alert('La frase/contraseña no puede estar en blanco')
return;
}
var PassData = PhraseToArray(GetPass);
var PhraseData = PhraseToArray(GetPhrase);
var SpaceCount = 0;
if (ModeEnc == true){
for(var i = 0; i < PhraseData.length; i++){
if(IsA1Char(PhraseData[i]) == false){
Codes.push(PhraseData[i]);
SpaceCount += 1;
}else if(IsA1Char(PhraseData[i]) == true){
Codes.push((PassData[(i - SpaceCount) % PassData.length] + PhraseData[i]) % 27);
}
}
}else{
for(var i = 0; i < PhraseData.length; i++) {
if(IsA1Char(PhraseData[i]) == false){
Codes.push(PhraseData[i]);
SpaceCount += 1;
}else{
var Value = PhraseData[i] - PassData[(i - SpaceCount) % PassData.length];
if (Value < 1){
Value += 27;
}
Codes.push(Value % 27);
}
}
}
document.getElementById('Result').value = Codes;
return Codes;
}
function RebuildString(Codigos)
{
var Salida = ""
for(var i = 0; i < Codigos.length; i++)
{
if (IsA1Char(Codigos[i]) == false){
Salida += String.fromCharCode(Codigos[i]);
}else{
if (Codigos[i] == 15 )
Salida += String.fromCharCode(209);
if (Codigos[i] == 0)
Salida += String.fromCharCode(90);
if(Codigos[i] < 15 && Codigos [i] > 0)
Salida += String.fromCharCode(Codigos[i]+64);
if(Codigos[i] > 15 && Codigos[i] < 28)
Salida += String.fromCharCode(Codigos[i]+63);
}
}
document.getElementById('Result').value = Salida;
}
function PhraseToArray(Text){
var Out = [];
for(var i = 0; i < Text.length; i++){
var CodeChar = Text.charCodeAt(i);
if(IsLetter(CodeChar) == true){
Out.push(AsciiToA1(CodeChar));
}else{
Out.push(CodeChar);
}
}
return Out;
}
Cómo verás, se han agregado varias funciones, la primera de ellas es "AsciiToA1". Está cómo su nombre lo indica, servirá para que el carácter que se le pase cómo parámetro, lo convierta a su equivalente A1Z27. la función de vuelve un valor entre 1 y 27 que representa la posición de la letra en el alfabeto.
La función "IsLetter" sirve para determinar si el parámetro usado es una letra, para ello comprobara si al llamar a las funciones "IsUpper" ó "IsLower" devuelven true, si al llamar a esas funciones y cualquiera de las dos devuelve un valor false, podemos asumir que el numero de caracter que se pasó, es equivalente a una letra.
La función "IsEnie" sirve para determinar si el parámetro usado es la letra Ñ, ya se mayúscula o minuscula. Hay que recordar que en el standar Ascii extendido, la letra Ñ no es continua a la letra N, en cambio esta hasta la posición 209 para la "Ñ" y 241 para "ñ", cuando se pasan esos números cómo parámetro devuelve true, en caso contrario false.
Las funciones "IsUpper" e "IsLower", sirven para determinar si la letra que se pasó cómo parámetro es mayúscula o minúscula (respectivamente), si el parámetro está dentro del rango 65~90 o es 209, la función "IsUpper" devuelve true. Para la función "IsLower", cuando el parámetro está en el rango 97~122 o es 241, devuelve true, en caso contrario devuelve false.
Finalmente la función "IsA1Char" sirve para determinar si el parámetro que se le pasa, esta dentro del rango 1~27, si es así, devuelve true, en caso contrario devuelve false. Todo esto se usa porque cuando se hace el cálculo, los valores se trabajan de la forma A1Z27, entonces, cualquier valor que se encuentre fuera de este rango, será un símbolo y no se debe de tomar en cuenta.
Además los estilos CSS se mejoraron un poco para hacerlo un poco más vistoso.
Con el uso de estas funciones, la calculadora se ha vuelto más funcional y con el código CSS se ve mejor. El resultado cómo de costumbre lo puedes bajar de mi dropbox.
Por ahora es todo. Los leo luego.
La función "IsLetter" sirve para determinar si el parámetro usado es una letra, para ello comprobara si al llamar a las funciones "IsUpper" ó "IsLower" devuelven true, si al llamar a esas funciones y cualquiera de las dos devuelve un valor false, podemos asumir que el numero de caracter que se pasó, es equivalente a una letra.
La función "IsEnie" sirve para determinar si el parámetro usado es la letra Ñ, ya se mayúscula o minuscula. Hay que recordar que en el standar Ascii extendido, la letra Ñ no es continua a la letra N, en cambio esta hasta la posición 209 para la "Ñ" y 241 para "ñ", cuando se pasan esos números cómo parámetro devuelve true, en caso contrario false.
Las funciones "IsUpper" e "IsLower", sirven para determinar si la letra que se pasó cómo parámetro es mayúscula o minúscula (respectivamente), si el parámetro está dentro del rango 65~90 o es 209, la función "IsUpper" devuelve true. Para la función "IsLower", cuando el parámetro está en el rango 97~122 o es 241, devuelve true, en caso contrario devuelve false.
Finalmente la función "IsA1Char" sirve para determinar si el parámetro que se le pasa, esta dentro del rango 1~27, si es así, devuelve true, en caso contrario devuelve false. Todo esto se usa porque cuando se hace el cálculo, los valores se trabajan de la forma A1Z27, entonces, cualquier valor que se encuentre fuera de este rango, será un símbolo y no se debe de tomar en cuenta.
Además los estilos CSS se mejoraron un poco para hacerlo un poco más vistoso.
.h1v
{
font-size: 16px;
}
.formVigenere{
font: 95% Arial, Helvetica, sans-serif;
max-width: 400px;
margin: 10px auto;
padding: 16px;
background: #F9F9F9;
}
.textareaV
{
width: 100%;
height: 150px;
padding: 2px 5px;
box-sizing: border-box;
border: 2px solid #999;
border-radius: 4px;
resize: none;
-webkit-transition-duration: 0.4s; /* Safari */
transition-duration: 0.4s;
}
.textareaV:focus
{
width: 100%;
height: 150px;
padding: 2px 5px;
box-sizing: border-box;
border: 2px solid #00BB00;
border-radius: 4px;
resize: none;
}
.TextV
{
width: 100%;
box-sizing: border-box;
border: 2px solid #999;
border-radius: 4px;
}
.ButtonV
{
width: 100%;
background-color: #009900;
border: none;
color: white;
padding: 15px 32px;
text-align: center;
text-decoration: none;
display: inline-block;
-webkit-transition-duration: 0.4s; /* Safari */
transition-duration: 0.4s;
}
.ButtonV:hover
{
width: 100%;
background-color: #4CAF50;
border: none;
color: white;
padding: 15px 32px;
text-align: center;
text-decoration: none;
display: inline-block;
}
Con el uso de estas funciones, la calculadora se ha vuelto más funcional y con el código CSS se ve mejor. El resultado cómo de costumbre lo puedes bajar de mi dropbox.
Por ahora es todo. Los leo luego.
3/30/2017 04:08:00 p.m.
A1Z27
,
basic html
,
cifrado
,
cifrado vigenere
,
CSS
,
estilos css
,
HTML
,
Javascript
,
programacion
Vamos a programar #31 - Calculadora de Vigenere en javascript.
Hola de nuevo a todos el día de hoy vamos a ver cómo automatizar un poco el proceso de encriptar texto usando el cifrado de Vigenere.
En el post anterior vimos cómo realizarlo "a mano" pero cómo hacer eso requiere tiempo, el día de hoy veremos código en javascript que realiza el trabajo de manera mucho más rápida y "eficiente".
Con el código anterior insertamos 2 Textareas con ID "InputText" y "Resultado", ellas servirán para pedir la frase que se quiere procesar y para mostrar el resultado.
Tambien insertamos un Textbox con ID "PassWord" que serevirá para que el usuario instroduzca la frase que se usará cómo contraseña.
Finalmente insertaremos dos Buttons con ID "Encrypt" y "UnEncrypt" que se usarán para hace el proceso.
En el post anterior vimos cómo realizarlo "a mano" pero cómo hacer eso requiere tiempo, el día de hoy veremos código en javascript que realiza el trabajo de manera mucho más rápida y "eficiente".
El Cuerpo.
Para empezar debemos de incluir un nuevo formulario con los siguientes controles:- TextArea.
- Textbox.
- Boton1
- Boton2.
- Text Area.
<form class="formVigenere"> <span class="h1v">Frase a des/encriptar:</span> <textarea class="textareaV" id="InputText" rows="5"></textarea> <span class="h1v">Contraseña</span> <input class="TextV" id="PassWord" type="text" /> <input class="ButtonV" id="Encrypt" onclick="RebuildString(Encriptar(true))" type="button" value="Encriptar" /> <input class="ButtonV" id="UnEncrypt" onclick="RebuildString(Encriptar(false))" type="button" value="Desencriptar" /> <span class="h1v">Resultado</span> <textarea class="textareaV" id="Result" rows="5"></textarea></form>
Con el código anterior insertamos 2 Textareas con ID "InputText" y "Resultado", ellas servirán para pedir la frase que se quiere procesar y para mostrar el resultado.
Tambien insertamos un Textbox con ID "PassWord" que serevirá para que el usuario instroduzca la frase que se usará cómo contraseña.
Finalmente insertaremos dos Buttons con ID "Encrypt" y "UnEncrypt" que se usarán para hace el proceso.
El cerebro.
Ahora veamos el código de javascript que se encarga de hacer los cálculos.
<script type="text/javascript">
function PhraseToArray(Frase)
{
var Out = [];
for(var i = 0; i < Frase.length; i++)
{
var CodeNumber = Frase.charCodeAt(i);
if(CodeNumber >= 97 && CodeNumber <= 122)
{
CodeNumber = CodeNumber - 32;
}
if(CodeNumber == 209 || CodeNumber == 241)
{
Out.push(15);
}
if(CodeNumber == 32)
{
Out.push(32);
}
else{
if(CodeNumber-64 < 15)
{
Out.push(CodeNumber-64);
}
else if(CodeNumber-64 >= 15 && CodeNumber-64 < 28){
Out.push(CodeNumber-63);
}
}
}
return Out;
}
function Encriptar(ModeEnc)
{
var GetPhrase = document.getElementById('InputText').value;
var GetPass = document.getElementById('PassWord').value;
var Codes = [];
if(GetPhrase.length < 1 || GetPass.length < 1)
{
alert('La frase/contraseña no puede estar en blanco')
return;
}
var PassData = PhraseToArray(GetPass);
var PhraseData = PhraseToArray(GetPhrase);
var SpaceCount = 0;
if (ModeEnc == true)
{
for(var i = 0; i < PhraseData.length; i++)
{
if(PhraseData[i] == 32)
{
Codes.push(32);
SpaceCount += 1;
}else{
Codes.push((PassData[(i - SpaceCount) % PassData.length] + PhraseData[i]) % 27);
}
}
}else{
for(var i = 0; i < PhraseData.length; i++)
{
if(PhraseData[i] == 32)
{
Codes.push(32);
SpaceCount += 1;
}else{
var Value = PhraseData[i] - PassData[(i - SpaceCount) % PassData.length];
if (Value < 1)
{
Value += 27;
}
Codes.push(Value % 27);
}
}
}
return Codes;
}
<!-- Devolver el resultado -->
function RebuildString(Codigos)
{
var Salida = ""
for(var i = 0; i < Codigos.length; i++)
{
if (Codigos[i] == 15 )
{
Salida += String.fromCharCode(209);
}
if (Codigos[i] == 32)
{
Salida += String.fromCharCode(32);
}
if (Codigos[i] == 0)
{
Salida += String.fromCharCode(90);
}
if(Codigos[i] < 15 && Codigos [i] > 0)
Salida += String.fromCharCode(Codigos[i]+64);
else if(Codigos[i] > 15 && Codigos[i] < 28){
Salida += String.fromCharCode(Codigos[i]+63);
}
}
document.getElementById('Result').value = Salida;
}
</script>
El código anterior está "sucio" pero el principal motivo del post es mostrar cómo pasar la idea (lo que hicimos en el post anterior) a su versión de código mas cruda. En el próximo post modificaré el código para evitar todas esas partes que a la hora de la eficiencia se vuelven innecesarias.
Todo el proceso de encriptar se lleva a cabo con tres funciones.
La función "PhraseToArray" se encarga de convertir las letras de la frase a encriptar junto con la contraseña a números que se puedan usar en el cifrado donde "A = 1" y "Z = 27". Pero antes de hacer eso hay que recordar que internamente en una computadora, cada símbolo, letra o número;posee un valor y que realmente cuando pides que la computadora escriba un "@" utiliza un numero que representa a ese símbolo.
Cómo podrás ver, en la tabla (original de Wikipedia) hay toda una serie de símbolo y letras que se pueden mostrar usando el standard ascii (está es la versón extendida).
Antes que nada lo primero que puedes notar es que las letras minúsculas y mayúsculas tienen un numero diferente, entonces si queremos escribir la letra "A", su valor interno será diferente al de la letra "a", para poder usar el cifrado de Vigenere debemos de buscar una forma tal que sin importar que sea mayúscula o minúscula siempre nos devuelva 1.
Para eso en la función "PhraseToArray" nos encargamos de convertir cualquier valor que entre y dejarlo de tal forma que corresponda a la forma A1Z27.
La funcion "Encriptar" es la que se encargara de hacer los cálculos para que el resultado tenga el mensaje cifrado. Además la misma funcion recibe un parámetro booleano que indica cual es el método a seguir; es decir; si debe de encriptar o des-encriptar el texto. Internamente hace un para de llamadas a la función "PhraseToArray", la primera se usará para volver todas las letras de la frase a encriptar al modo A1Z27 y la segunda hará lo mismo pero está vez lo hará para la contraseña.
Después se encargará de hacer los cálculos, hay que recordar que los "valores" de las letras se suman, pero en ocasiones, la contraseña será mas corta que el texto a encriptar. entonces para evitar que si por ejemplo: tenemos una frase de 10 letras con una contraseña de 4 letras, cuando alcanzamos el numero máximo de letras en la contraseña, hay que repetir otra vez desde el inicio, ademas hay que recordar que cuando trabajamos con texto en una computadora, todos los caracteres tienen un valor por lo que si hay un espacio " " también contara, por lo que si tenemos una frase de 3 palabras con 10 letras podríamos tener en realidad 12 letras en una computadora.
Para evitar ese tipo de errores, la función se encarga de contar los espacios en blanco y hacer las operaciones pertinentes de tal modo que si hay espacios (y eso es lo que se debe de hacer con todos los caracteres NO alfabéticos) al momento de hacer las sumas no se tome en cuenta.
Lo mismo más o menos hace con el otro proceso.
Finalmente, el resultado serán los valores A1Z27 por lo que hay que volverlos a pasar a ASCII.
Para realizar este trabajo se usa la funcion "RebuildString" que lo único que hace es sumar determinado numero de tal forma que si tenemos 1 (que representa a la letra A) nos devuelva la letra en cuestión.
Los botones se usarán para mandar a llamar a la funcion "Encriptar" y el resultado se mostrará en el TextArea "Result".
Un punto importante a resltar es que al haber letras "Ñ" en el idioma español, es realmente importante hacer los cambios necesarios para que en el momento de realizar los calculos no nos llevemos sorpresas. La Ñ ocupa el lugar 15 pero en el standard ASCII si directamente le sumáramos el numero seguido de la N obtendríamos la O. Esto se debe a que la Ñ es representada por los números 209 para la Ñ y 241 para la ñ Mientras que la O es el 79.
Con el código anterior ya estaria todo listo pero para que no quede muy feo el formulario agregamos el siguiente código CSS.
Con eso ya tendrás lista la calculadora de Vigenere. En el siguiente post vamos a ver la versión optimizada de este código, se puede reducir bastante, además de que en este si se incluyen símbolos o números, no funciona correctamente.
El resultado:
Los leo Luego.
Todo el proceso de encriptar se lleva a cabo con tres funciones.
La función "PhraseToArray" se encarga de convertir las letras de la frase a encriptar junto con la contraseña a números que se puedan usar en el cifrado donde "A = 1" y "Z = 27". Pero antes de hacer eso hay que recordar que internamente en una computadora, cada símbolo, letra o número;posee un valor y que realmente cuando pides que la computadora escriba un "@" utiliza un numero que representa a ese símbolo.
| -0 | -1 | -2 | -3 | -4 | -5 | -6 | -7 | -8 | -9 | -A | -B | -C | -D | -E | -F | ||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0- | ☺ | ☻ | ♥ | ♦ | ♣ | ♠ | • | ◘ | ○ | ◙ | ♂ | ♀ | ♪ | ♫ | ☼ | 0- | |
| 1- | ► | ◄ | ↕ | ‼ | ¶ | § | ▬ | ↨ | ↑ | ↓ | → | ← | ∟ | ↔ | ▲ | ▼ | 1- |
| 2- | ! | " | # | $ | % | & | ' | ( | ) | * | + | , | - | . | / | 2- | |
| 3- | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | : | ; | < | = | > | ? | 3- |
| 4- | @ | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | 4- |
| 5- | P | Q | R | S | T | U | V | W | X | Y | Z | [ | \ | ] | ^ | _ | 5- |
| 6- | ` | a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | 6- |
| 7- | p | q | r | s | t | u | v | w | x | y | z | { | | | } | ~ | ⌂ | 7- |
| 8- | Ç | ü | é | â | ä | à | å | ç | ê | ë | è | ï | î | ì | Ä | Å | 8- |
| 9- | É | æ | Æ | ô | ö | ò | û | ù | ÿ | Ö | Ü | ¢ | £ | ¥ | ₧ | ƒ | 9- |
| A- | á | í | ó | ú | ñ | Ñ | ª | º | ¿ | ⌐ | ¬ | ½ | ¼ | ¡ | « | » | A- |
| B- | ░ | ▒ | ▓ | │ | ┤ | ╡ | ╢ | ╖ | ╕ | ╣ | ║ | ╗ | ╝ | ╜ | ╛ | ┐ | B- |
| C- | └ | ┴ | ┬ | ├ | ─ | ┼ | ╞ | ╟ | ╚ | ╔ | ╩ | ╦ | ╠ | ═ | ╬ | ╧ | C- |
| D- | ╨ | ╤ | ╥ | ╙ | ╘ | ╒ | ╓ | ╫ | ╪ | ┘ | ┌ | █ | ▄ | ▌ | ▐ | ▀ | D- |
| E- | α | ß | Γ | π | Σ | σ | µ | τ | Φ | Θ | Ω | δ | ∞ | φ | ε | ∩ | E- |
| F- | ≡ | ± | ≥ | ≤ | ⌠ | ⌡ | ÷ | ≈ | ° | ∙ | · | √ | ⁿ | ² | ■ | F- | |
| -0 | -1 | -2 | -3 | -4 | -5 | -6 | -7 | -8 | -9 | -A | -B | -C | -D | -E | -F |
Cómo podrás ver, en la tabla (original de Wikipedia) hay toda una serie de símbolo y letras que se pueden mostrar usando el standard ascii (está es la versón extendida).
Antes que nada lo primero que puedes notar es que las letras minúsculas y mayúsculas tienen un numero diferente, entonces si queremos escribir la letra "A", su valor interno será diferente al de la letra "a", para poder usar el cifrado de Vigenere debemos de buscar una forma tal que sin importar que sea mayúscula o minúscula siempre nos devuelva 1.
Para eso en la función "PhraseToArray" nos encargamos de convertir cualquier valor que entre y dejarlo de tal forma que corresponda a la forma A1Z27.
La funcion "Encriptar" es la que se encargara de hacer los cálculos para que el resultado tenga el mensaje cifrado. Además la misma funcion recibe un parámetro booleano que indica cual es el método a seguir; es decir; si debe de encriptar o des-encriptar el texto. Internamente hace un para de llamadas a la función "PhraseToArray", la primera se usará para volver todas las letras de la frase a encriptar al modo A1Z27 y la segunda hará lo mismo pero está vez lo hará para la contraseña.
Después se encargará de hacer los cálculos, hay que recordar que los "valores" de las letras se suman, pero en ocasiones, la contraseña será mas corta que el texto a encriptar. entonces para evitar que si por ejemplo: tenemos una frase de 10 letras con una contraseña de 4 letras, cuando alcanzamos el numero máximo de letras en la contraseña, hay que repetir otra vez desde el inicio, ademas hay que recordar que cuando trabajamos con texto en una computadora, todos los caracteres tienen un valor por lo que si hay un espacio " " también contara, por lo que si tenemos una frase de 3 palabras con 10 letras podríamos tener en realidad 12 letras en una computadora.
Para evitar ese tipo de errores, la función se encarga de contar los espacios en blanco y hacer las operaciones pertinentes de tal modo que si hay espacios (y eso es lo que se debe de hacer con todos los caracteres NO alfabéticos) al momento de hacer las sumas no se tome en cuenta.
Lo mismo más o menos hace con el otro proceso.
Finalmente, el resultado serán los valores A1Z27 por lo que hay que volverlos a pasar a ASCII.
Para realizar este trabajo se usa la funcion "RebuildString" que lo único que hace es sumar determinado numero de tal forma que si tenemos 1 (que representa a la letra A) nos devuelva la letra en cuestión.
Los botones se usarán para mandar a llamar a la funcion "Encriptar" y el resultado se mostrará en el TextArea "Result".
Un punto importante a resltar es que al haber letras "Ñ" en el idioma español, es realmente importante hacer los cambios necesarios para que en el momento de realizar los calculos no nos llevemos sorpresas. La Ñ ocupa el lugar 15 pero en el standard ASCII si directamente le sumáramos el numero seguido de la N obtendríamos la O. Esto se debe a que la Ñ es representada por los números 209 para la Ñ y 241 para la ñ Mientras que la O es el 79.
Con el código anterior ya estaria todo listo pero para que no quede muy feo el formulario agregamos el siguiente código CSS.
<style type="text/css">
.h1v
{
font-size: 16px;
}
.formVigenere{
font: 95% Arial, Helvetica, sans-serif;
max-width: 400px;
margin: 10px auto;
padding: 16px;
background: #F9F9F9;
}
.textareaV
{
width: 100%;
height: 150px;
padding: 2px 5px;
box-sizing: border-box;
border: 2px solid #999;
border-radius: 4px;
resize: none;
}
.TextV
{
width: 100%;
box-sizing: border-box;
border: 2px solid #999;
border-radius: 4px;
}
.ButtonV
{
width: 100%;
background-color: #4CAF50;
border: none;
color: white;
padding: 15px 32px;
text-align: center;
text-decoration: none;
display: inline-block;
}
</style>
Con eso ya tendrás lista la calculadora de Vigenere. En el siguiente post vamos a ver la versión optimizada de este código, se puede reducir bastante, además de que en este si se incluyen símbolos o números, no funciona correctamente.
El resultado:
Los leo Luego.
3/09/2017 05:36:00 p.m.
10K
,
A1Z27
,
basic html
,
Challenge
,
cifrado
,
cifrado vigenere
,
CSS
,
estilos css
,
Estlos para formularios
,
programacion
,
Reto de Xwork
El reto de Xwork #2.
Hola a todos. Con motivo de la celebración por las 10000 visitas al blog, he decidido lanzar el segundo reto. El primero fue resuelto por Zed008 hace ya algún tiempo; y el ahora ya tiene un lugar en el salón de la fama.
Para el reto vamos a ver la siguiente imagen.
A diferencia de la primera vez, en está ocasión la única pista disponible es que se usa ascii.
Por ahora es todo. Los leo luego.
Para el reto vamos a ver la siguiente imagen.
A diferencia de la primera vez, en está ocasión la única pista disponible es que se usa ascii.
Por ahora es todo. Los leo luego.
3/02/2017 03:13:00 p.m.
10K
,
Challenge
,
cifrado
,
Reto de Xwork
Vamos a encriptar #2 - El cifrado de Vigenère
Hola de nuevo a todos, el día de hoya vamos a continuar con la celebración por las 10000 visitas que ha recibido el blog, y para ello vamos a ver un poco de lo que en un inicio fue la causa de abrir este blog.
Cómo recordaras, uno de los primeros fue: "¿Un acertijo, Por qué no?", el reto fue resuelto no hace mucho. La persona que logro descifrarlo ahora tiene su lugar en el salon de la fama. Para continuar con el tema de encriptacion, hoy vamos a ver uno de los métodos de cifrado más sencillo (y funcional) a mi gusto.
Cómo notarás, si le asignamos el valor de 1 a "A" 2 a "B" y asi sucesivamente hasta "Z" tendremos una numeracion que solo llega hasta 26.
En el alfabeto en español hay que tener en cuenta que hay una letra más. La letra "Ñ" que no siempre se toma en cuenta en el alfabeto inglés. Si numeramos otra vez pero tomando en cuenta la letra "Ñ" tendremos algo como lo que sigue:
Siempre será necesario saber el idioma original para hacer los ajustes necesarios pero para fines practicos, en todos los ejemplo que te encuentres en este blog, siempre se usará el alfabeto en español (A1Z27).
Una vez aclarado lo anterior, empecemos con lo que sería el método para encriptar usando el cifrado de Vigenere.
Supongamos que queremos enviar de forma el siguiente mesaje: HelloWorld. Siempre debemos de usar una contraseña para este caso voy a usar "USG" (pero puede ser cualquier frase/palabra).
Usando el método A1Z27 procedemos a asignar el valor a cada letra de la contraseña:
El resultado de aplicar el cifrado de Vigenere en la frase "HELLOWORLD" con la contraseña "USG" es:
Par desencriptar lo primero que vamos a hacer es restar el numero correspondiente a la letra de la contraseña al letra ya de la frase ya cifrada, al igual que en la anterior, se avanzará de una en una y a cada letra se le restará su valor, si la frase o la contraseña son mas largas, se repetira hasta completar la palabra más larga.
Cómo recordaras, uno de los primeros fue: "¿Un acertijo, Por qué no?", el reto fue resuelto no hace mucho. La persona que logro descifrarlo ahora tiene su lugar en el salon de la fama. Para continuar con el tema de encriptacion, hoy vamos a ver uno de los métodos de cifrado más sencillo (y funcional) a mi gusto.
El cifrado de Vigenere.
Para empezar, ¿que es el cifrado de Vigenere? Bien, se puede resumir de la siguiente manera:
El cifrado Vigenère es un cifrado basado en diferentes series de caracteres o letras del cifrado César formando estos caracteres una tabla, llamada tabla de Vigenère, que se usa como clave. El cifrado de Vigenère es un cifrado de sustitución simple polialfabético.
El cifrado Vigenère se ha reinventado muchas veces. El método original fue descrito por Giovan Battista Belasso en su libro de 1553 La cifra del Sig. Giovan Battista Belasso. Sin embargo, fue incorrectamente atribuido más tarde a Blaise de Vigenère, concretamente en el siglo XIX, y por ello aún se le conoce como el "cifrado Vigenère".
Wikipedia/Cifrado de Vigenere.
Cómo cifrar.
Antes que nada vamos a revisar un par de puntos importantes. Para empezar con el cifrado de Vigenere, debemos hacer uso del cifrado A1Z27. El cifrado A1Z27 consiste en asignar un valor numerico a cada letra del alfabeto, pero hay que recordar que; dependiendo del idioma; este tiene más o menos letras. Si se usa el alfabeto en inglés, tendriamos algo cómo lo siguiente| A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 |
Cómo notarás, si le asignamos el valor de 1 a "A" 2 a "B" y asi sucesivamente hasta "Z" tendremos una numeracion que solo llega hasta 26.
En el alfabeto en español hay que tener en cuenta que hay una letra más. La letra "Ñ" que no siempre se toma en cuenta en el alfabeto inglés. Si numeramos otra vez pero tomando en cuenta la letra "Ñ" tendremos algo como lo que sigue:
| A | B | C | D | E | F | G | H | I | J | K | L | M | N | Ñ | O | P | Q | R | S | T | U | V | W | X | Y | Z |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 |
Siempre será necesario saber el idioma original para hacer los ajustes necesarios pero para fines practicos, en todos los ejemplo que te encuentres en este blog, siempre se usará el alfabeto en español (A1Z27).
Una vez aclarado lo anterior, empecemos con lo que sería el método para encriptar usando el cifrado de Vigenere.
Supongamos que queremos enviar de forma el siguiente mesaje: HelloWorld. Siempre debemos de usar una contraseña para este caso voy a usar "USG" (pero puede ser cualquier frase/palabra).
Usando el método A1Z27 procedemos a asignar el valor a cada letra de la contraseña:
- U = 22.
- S = 20.
- G = 7.
- H = 8.
- E = 5.
- L = 12.
- L = 12.
- O = 16.
- W = 24.
- O = 16.
- R = 19.
- L = 12.
- D = 4.
- H + U (8 + 22 = 30)
- E + S (5 + 20 = 25)
- L + G (12 + 7 = 19)
- L + U (12 + 22 = 34)
- O + S (16 + 20 = 36)
- W + G (24 + 7 = 31)
- O + U (16 + 22 = 38)
- R + S (19 + 20 = 39)
- L + G (12 + 7 = 19)
- D + U (4 + 22 = 26)
El resultado de aplicar el cifrado de Vigenere en la frase "HELLOWORLD" con la contraseña "USG" es:
- 30 mod 27 = 3 = C
- 25 mod 27 = 25 = X
- 19 mod 27 = 19 = R
- 34 mod 27 = 7 = G
- 36 mod 27 = 9 = I
- 31 mod 27 = 4 = D
- 38 mod 27 = 11 = K
- 39 mod 27 = 12 = L
- 19 mod 27 = 19 = R
- 26 mod 27 = 26 = Y
Cómo descifrar.
Ahora viene una parte importante de todo el proceso, devolver a una forma legible una frase que este cifrada. Siempre será necesario saber la contraseña que se uso para cifrar la frase. utilizando el ejemplo anterior; la contraseña es: "USG".Par desencriptar lo primero que vamos a hacer es restar el numero correspondiente a la letra de la contraseña al letra ya de la frase ya cifrada, al igual que en la anterior, se avanzará de una en una y a cada letra se le restará su valor, si la frase o la contraseña son mas largas, se repetira hasta completar la palabra más larga.
- 3-22 = -19
- 25 - 20 = 5
- 19 - 7 = 12
- 7 - 22 = -15
- ...
- -19 + 27 = 8 = H
- 5 = 5 = E
- 12 = 12 = L
- -15 + 27 = 12 = L
- ...
Ahora sabiendo esto, no me queda nada más que decir:
gizgxvgñlbi USG
2/21/2017 02:40:00 p.m.
10K
,
A1Z27
,
aprende
,
cifrado
,
cifrado vigenere
¿Un Acertijo? ¿Por qué no?
Muchas veces me he topado con gente que halla una manera de hacer las cosas mas interesantes en mi vida.
Una de ellas fue la encargada de introducir el concepto de cifrado a mi vida. Si bien ya sabía los conceptos básicos; véase cifrado de Cesar, Cifrado de Vigenère, etc. Esa persona me dio un acertijo que no pude resolver.
Las unicas pista que tuve fueron las obvias:
Una de ellas fue la encargada de introducir el concepto de cifrado a mi vida. Si bien ya sabía los conceptos básicos; véase cifrado de Cesar, Cifrado de Vigenère, etc. Esa persona me dio un acertijo que no pude resolver.
![]() |
| ¿Fácil, no? |
- Tiene que ver con el estandar ASCII
- La contraseña es: Mercury.
- El mensaje está en Inglés.
- Vas a sufrir un poquito.
Diviértanse y los leo después.
6/21/2016 12:30:00 p.m.
cifrado
,
divertido
,
interesante
Suscribirse a:
Entradas
(
Atom
)









