sábado, 25 de julio de 2020

JavaScript: cifrado Rail Fence

Hace un momento he terminado de programar el cifrado Rail Fence en JavaScript. Ha sido un poquito más complejo de lo que había imaginado en un primer análisis, pero aquí está. Puedes utilizar esta herramienta para evitarte usar lápiz y papel y automatizar el proceso. ¡Diviértete!

He dejado el código más abajo por si estás interesado (y he aprendido a usar la etiqueta "code" para que quede bonito :D).

Introduce el texto con el quieras trabajar y la clave (el número de raíles del cifrado). Desmarca la casilla si quieres descifrar o déjala marcada si deseas cifrar.

TEXTO  CLAVE k=  CIFRAR




function cipher(text, rails){
  var splitted = [], i;
  for(i = 0; i < rails; i++){
	splitted.push("");
  }
	
  var len = text.length, j = 0, downwards = true;
  i = 0;
  while(i < len){
	splitted[j] += text.charAt(i);
	if(downwards){
	  j++;
    }else{
	  j--
	}
	if(j == rails - 1){
	  downwards = false;
	}else if(j == 0){
	  downwards = true;
	}
	i++;
  }
	
  var result = "";
  for(i = 0; i < rails; i++){
	result += splitted[i];
  }
  return result;
}
  
  
function decipher(text, rails){
  var len = text.length, cicle = 2*rails-2;
  var remainder = len%cicle, numCicles = (len-remainder)/cicle;
  var splitted = [], i, j, max, tempLen;
  //Compute until which rail the remainder gets.
  var lastRail = 0;
  if(remainder > rails){
	lastRail = 2*rails-remainder-1;
  }
  //If lastRail is 0, then the extra letters only go downwards.
  //Otherwise, the bottom rails get 2 extra letters (except the last one).
		
  for(i = 0; i < rails; i++){
	splitted.push("");
	if(i == 0){
	  if(remainder > 0){
		max = numCicles + 1;
		remainder--;
	  }else{
		max = numCicles;
	  }
	}else if(i == rails - 1){
	  //No need for check computations, we made sure with the data above.
	}else{
	  if(remainder > 0){
		if(lastRail > i || lastRail == 0){
		  max = 2*numCicles + 1;
		  remainder--;
		}else{
		  max = 2*numCicles + 2;
	      remainder = remainder - 2;
	    }
	  }else{
		max = 2*numCicles;
	  }
	}
	splitted[i] = text.substring(0,max);
	tempLen = text.length;
	text = text.substring(max, tempLen);
  }
	
  //We have drawn the zigzag. We only need to read it.
  var result = ""; downwards = true;
  i = 0; //number of letter
  j = 0; //rail
  while(i < len){
	result += splitted[j].charAt(0);
	splitted[j] = splitted[j].substring(1, splitted[j].length);
	if(downwards){
	  j++;
    }else{
	  j--
	}
	if(j == rails - 1){
	  downwards = false;
	}else if(j == 0){
	  downwards = true;
	}
	i++;
  }

  return result;
}

No hay comentarios:

Publicar un comentario