descifrar codigo con Análisis de frecuencia

Iniciado por deepmaniaco, 27 Octubre 2015, 23:19 PM

0 Miembros y 1 Visitante están viendo este tema.

deepmaniaco

Buenas gente! Ando con la asignatura de Seguridad en este ultimo año de carrera y ando un tanto perdido.. me han pedido implementar un codigo que desencripte el siguiente texto que os pondre mediante el método de Análisis de Frecuencia. ¿Alguien me arroja algo de luz?

Gracias


Código:
w (Delcetyr pilxawp qzc esp NcjaEzzw gpcdtzy qlxtwj 1.i)

NcjaEzzw td l nzxacpspydtgp qcpp pofnletzylw aczrclx lmzfe ncjaezrclasj lyo ncjaelylwjdtd
zqqpctyr piepydtgp zywtyp spwa lyo xlyj gtdflwtkletzyd.

Estd td l epie qtwp, ncplepo ty zcopc ez spwa jzf ez xlvp jzfc qtcde depad htes NcjaEzzw.

1) Ld l qtcde depa te td cpnzxxpyopo jzf cplo esp tynwfopo zywtyp spwa, estd htww aczgtop l fdpqfw zgpcdtrse zq lww lgltwlmwp qfynetzyd htesty estd laawtnletzy. Esp delcetyr alrp zq esp zywtyp spwa nly mp lnnpddpo gtl esp xpyf "Spwa -> Delcetyr Alrp" le esp eza ctrse zq esp dncppy zc fdtyr esp dplcns vpjhzco "Delcetyr alrp" htesty esp tyopi zq esp zywtyp spwa.
Acpdd Q1 ez delce esp zywtyp spwa pgpcjhspcp ty NcjaEzzw.

2) L azddtmwp ypie depa hzfwo mp ez pyncjae l qtwp htes esp Nlpdlc lwrzctesx. Estd nly mp ozyp gtl esp xpyf "Ncjae/Opncjae -> Djxxpectn (Nwlddtn)".

3) Espcp lcp dpgpclw pilxawpd (efezctlwd) aczgtopo htesty esp zywtyp spwa hstns aczgtop ly pldj hlj ez rlty ly fyopcdelyotyr zq ncjaezwzrj. Espdp pilxawpd nly mp qzfyo gtl esp xpyf "Spwa -> Dnpylctzd (Efezctlwd)".

4) Jzf nly lwdz opgpwza jzfc vyzhwporp mj:
- Ylgtrletyr esczfrs esp xpyfd. Jzf nly acpdd Q1 le lyj dpwpnepo xpyf tepx ez rpe qfcespc tyqzcxletzy.
- Cplotyr esp tynwfopo Cploxp qtwp (dpp esp xpyf "Spwa -> Cploxp").
- Gtphtyr esp tynwfopo nzwzcqfw acpdpyeletzy (Estd acpdpyeletzy nly mp qzfyo zy dpgpclw hljd: p.r. ty esp "Spwa" xpyf zq estd laawtnletzy, zc gtl esp "Oznfxpyeletzy" dpnetzy qzfyo le esp "Delcetyr" alrp zq esp zywtyp spwa).
- Gtphtyr esp hpmalrp hhh.ncjaezzw.zcr.   

Ufwj 2010
Esp NcjaEzzw eplx

Vaagish

Woow! Tenes una cuenta creada desde 2013 y este es tu primer mensaje?  :silbar:

Perdón por la ignorancia.. pero.. se supone que ese texto solo tiene "letras equivocadas" o "letras remplazadas"? (como guste llamarle)

Es decir.. no esta cifrado realmente..? Es eso asi?

Podrías hacer un programa que cambie letra a letra por otro valor y listo.. una iteracion por cada letra del abecedario y ya lo tendrías :/

Saludos!

deepmaniaco

Me registre hara un tiempo, pero con el tema de andar fuera de españa y no haber tocado nada acerca de este tema, he tenido la cuenta un tanto abandonada, espero darle un mayor uso ahora.

En lo que se basa princialmente el ejercicio es en lo siguiente:

Your task is to make a tool for frequency analysis, which allows the (partial) disclosure of the text and manual change of each letter. Since your tool will only allow partial disclosure of the text, you will be using manual exchange of letters to get the exact decrypted text.

Your tool has to include the following functionality:

Frequency analysis of the encrypted text.
Frequency analysis of the reference text.
With help of the frequency analysis the tool has to (partially) reveal the encrypted text.
Preview of partially revealed text.
Possibility of manual switching letters (NOTE: If for example you replace "a" with "t", the tool has to automatically change "t" with "a", because otherwise you lose trace of letters).
Opening (encrypted text and reference text) and storing the text (decrypted) in a text file.
The exercise can be performed in any programming language. If you use additional libraries, include them in the project. The tool should have a window user interface through which you can enter parameters and obtain results.

In order to verify the correctness of the tool, use the test files.

Nos dan el texto modelo el cual debe de quedar, y vaya con las pocas instrucciones que nos dan la verdad que ando un tanto perdido.

Por cierto estoy estudiando este año en Eslovenia y bueno, tampoco tienen un nivel muy exagerado en general en lo que llevo visto.

Espero que me puedas echar una mano.

Gracias

Vaagish

Hi!

Bueno, tuve que leer un poco primero.. y si,, es lo que me esperaba..

Si hace un tiempo tenes una cuenta en el foro, ya sabras que no se resuelven tareas, deberias empezar por poner algo (por minimo que sea) del codigo que tengas. Te puedo dar ideas, ya que el ejercicio pide:

CitarThe exercise can be performed in any programming language. If you use additional libraries, include them in the project. The tool should have a window user interface through which you can enter parameters and obtain results.

Ya sabes en que lenguaje vas a trabajar? Eso es fundamental para poder empezar  :silbar:

CitarOpening (encrypted text and reference text) and storing the text (decrypted) in a text file.

Ahí básicamente lo que dice es que puedas abrir un archivo para lectura y otro para escritura.. (no estaría mal empezar por ahi,, es lo que yo lo haria)

CitarFrequency analysis of the encrypted text.
Frequency analysis of the reference text.
With help of the frequency analysis the tool has to (partially) reveal the encrypted text.
Preview of partially revealed text.

Esto lo que dice es que tiene que funcionar.. Es decir.. es bulto. Damos por sentado que tiene que funcionar xD

A grandes rasgos lo que hay que hacer es ir leyendo letra por letra en el archivo "cifrado" e ir remplazando por otra. Despues te tenes que ayudar de las estadisticas..

Wikipedia:
CitarPor ejemplo, en inglés la letra E es muy común, mientras que la X es muy rara. Igualmente, las combinaciones ST, NG, TH y QU son pares de letras comunes, mientras que NZ y QJ son raros. La frase mnemotécnica "ETAOIN SHRDLU" agrupa las doce letras más frecuentes en los textos ingleses. En español, las vocales son muy frecuentes, ocupando alrededor del 45 % del texto, siendo la E y la A las que aparecen en más ocasiones, mientras que la frecuencia sumada de F, Z, J, X, W y K no alcanza el 2 %. La regla mnemotécnica para el español sería "EAOSR NIDLC" o bien "EAOSN RILDUT".

Quiere decir que podrias acertar en gran medida en que idioma esta escrito el mensaje, y el mensaje..

Suerte! Saludos!!

deepmaniaco

Buenas!

Ya ya vi que no te solucionan, pero mas o menos intentan encaminarte para encontrar la solucion acertada.

tenia pensado hacerlo en c++ o c

Osea segun entiendo al leerte por ejemplo es que a la hora de leer el texto finalice por ejemplo cuando encuentre algun return o algo no?

Le pregunte al profesor y me dijo que si no se hacerlo a traves de una interfaz grafica (que sinceramente no se hacerlo) podria hacerlo a través de la propia ventana de consola.

Como podria empezar ?

Gracias

Vaagish

Hi!

CitarYa ya vi que no te solucionan, pero mas o menos intentan encaminarte para encontrar la solucion acertada.

Bueno, es lo que voy a hacer.. pero todos los que lean de aqui en mas van a querer ver algo del code que no has puesto aun..

Quiero pensar que no faltaste a todas las clases de programacion y que sabes como escribir un entry point en C++  :silbar:

CitarOpening (encrypted text and reference text) and storing the text (decrypted) in a text file.

Ahí básicamente lo que dice es que puedas abrir un archivo para lectura y otro para escritura.. (no estaría mal empezar por ahi,, es lo que yo lo haria)

Citarhttps://pasky.wordpress.com/2009/08/04/funciones-openclose-y-readwrite-en-c/
http://c.conclase.net/ficheros/?cap=002#inicio

Ahi te explica como podes abrir y leer archivos en C, los datos que va leyendo van quedando en una variable (buffer), esa misma variable es la que podes usar para ir trabajando con el codigo..


CitarLe pregunte al profesor y me dijo que si no se hacerlo a traves de una interfaz grafica (que sinceramente no se hacerlo) podria hacerlo a través de la propia ventana de consola.

Ok.. entonces manos a la obra..  :D

Saludos!

deepmaniaco

Buenas!

Estoy que no encuentro el fallo. A la hora de recorrer la cadena, no me sustituye la letra que quiero por la letra a sustituir. Si funcionada esto ya estaria un tanto cerca de acabar.

Pongo el codigo para ver si veis el error:


// Analizador de frecuencia alfabética

var x = new Array("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","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","0",".",",","<",">","-","(",")");
var n = x.length;
var ch1 = "";
var ch2 = "";
var z = "";

var texto = prompt("Escribe la palabra a analizar","");
var cant = texto.length;

var letra1 = "";
var letra2 = "";

document.write("<h1>The sentence of analice: " + texto + "</h1>");
for (i=0;i<n;i++)
{
ch1 = x;
for (h=0;h<cant;h++)
{
  ch2 = texto.substr(h,1);
  if (ch1 == ch2)
   z++;
}
document.write("<br>The frecuency of " + ch1 + " is: " + z);
z = 0;
}

//Nuevo

//char cadena = texto; /*Con esto asignaras el contenido de la cadena*/

//char letra1 = "";
//char letra2 = "";
var letra1 = prompt("Escribe letra a sustituir","");
var letra2 = prompt("Por la letra que lo sustituya","");


for(i=0;i<cant; i++)  /*Esta sera la instrucción encargada de correr por la cadena*/
{
   if(texto == 'letra1' ){ /* Se encargara de ir testeando cada letra, para ver si es una letra1 */
   texto = 'letra2'; /*Cambiara las testeadas por letra2*/
   //str_replace ( "letra1" , "letra2" , texto)
   }

//document.write(i);
}

document.write("<br> Modificado: " + texto);


</SCRIPT>
</HTML>

Vaagish

Hi! Bueno.. espero que esto ayude, creo que estas un poco perdido.. no ibas a trabajar en C ?  :silbar:

CitarOpening (encrypted text and reference text) and storing the text (decrypted) in a text file.

Capaz que me equivoco, pero me parece que esa parte del ejercicio no la vas a poder hacer en javascript, sera cuestion de googlear una solucion..

Por otro lado:

Mira que facil seria usando este metodo:
Citarhttp://www.w3schools.com/jsref/jsref_replace.asp

Esto remplaza todas las f en un texto dado por x.

Código (javascript) [Seleccionar]
<script language="javascript">
var txt = prompt("Ingrese el texto");
document.write(txt.replace(/f/g, 'x'));
</script>


Yo creo que es muy simple la tarea.. es darse maña e imaginacion de aqui en mas.. haces un bucle, un array de caracteres a remplazar (como el que tenes esta bien), un if, un document.write,, vamos.. no es mucho..

Saludos! Suerte!

PD: Te recomiendo usar funciones, cosa que puedas reutilizar el codigo, mostrar en pantalla, etc,, etc.. y mejor usa la etiqueta de codigo javascript para poner codigo..

deepmaniaco

Estuve mirando para hacerlo en c, pero rebuscando en programas de 1º de carrera, recicle codigo que tenia jaja

Segun el tema de sacar el texto descifrado no hay problema, primero nos basamos en sacarlo por pantalla asi simplon, luego ya para detallitos de archivos y demas pues se vera en funcion del timepo, loimportante al menos para pasar es que funcione.


Con respecto al codigo intente hacerlo un tanto mas laborioso, ya que aqui ni tienen en cuenta recursividad ni historias.

Lo que has puesto de codigo esta bien, pero la cosa es pedirme por pantalla que letras quiero sustituir por las que elija a gusto, luego ya para el tema de ir iterando metere un while y que finalice con algun caracter raro , el problema es a la hora de usar ese replace es tomar el valor de esa letra que he metido desde teclado.

No es complicado, pero son 5 años sin picar nada de código y ahora cuesta tela arrancar..

Vaagish

Hi!

CitarCon respecto al codigo intente hacerlo un tanto mas laborioso, ya que aqui ni tienen en cuenta recursividad ni historias.

Yo me había puesto a hacer cosas con arrays también, (porque me gusto el asunto para intentarlo, aunque al rato me aburri) xD

Código (javascript) [Seleccionar]
<html>
<script language="javascript">

function strToArr(str) {
var letters = new Array();
for(i = 0; i < str.length; i++)
letters[i] = str.charAt(i);
return letters;
}
function printArr(arr) {
document.write("<br>Array: [");
for(i = 0; i < arr.length; i++)
document.write(" " + arr[i]);
document.write(" ]");
return;
}
function replaceInArr(x, y, z) { // Remplaza en x, el valor y, con el valor de z
var letters = x;
for(i = 0; i < x.length; i++)
if(x[i] == y) letters[i] = z;
return letters;
}

// **************************************************

var crypt = prompt("Texto Cifrado: ");

var cryptArr = strToArr(crypt);
printArr(cryptArr);

var newcryptArr = replaceInArr(cryptArr, 'M', 'P');
printArr(newcryptArr);

</script>
</html>


Bueno, conste que falta trabajo por hacerle al code, pero hasta aca llego yo xD

Esa es "otra forma" de hacerlo.. tene en cuenta que la funcion replaceInArr() remplaza un caracter por otro, pero no guarda el caracter remplazado.. creo que vos deberias remplazar uno por otro, (o sea, lo que no hace del todo esa funcion).

Y lo que te comentaba de las funciones,, va a ser lo mejor seguro ;)

Saludos!