Transpozičná šifra

Dokument bez názvu

Prehodenie (permutácia) stĺpcov

  • štvorcová tab.
  • heslo
    • uniq - unikátne (bez duplicít)
    • rep - priame použitie

Šifrovanie

Zo vstupu sa vytvorí matica, ktorú čítame po riadkoch, zvyšné polia vyplníme náhodnými znakmi.

Ak je vstup napr.: "Toto je tajna sprava.", spracovaná matica pre heslo typu rep s hodnotou "peter" vyzerá nasledovne:

p e t e r
0 1 2 3 4
T O T O J
E T A J N
A S P R A
V A . H A
N X Z F A

Heslo "peter" zoradíme vzostupne, máme "eeprt". Šifru zostavíme po stĺpcoch. Poradie stĺpcov závisí od indexov písmen v pôvodnom hesle, ktoré hľadáme iteráciou vo vzostupne zoradenom pôvodnom hesle:

0 1 2 3 4       1 3 0 4 2
p e t e r   =>   e e p r t

Začíname teda čítať od 1. stĺpca, potom 3. atď, postupne zhora nadol. Výsledný šifra bude "OTSAXOJRHFTEAVNJNAAATAP.Z".

Dešifrovanie

Pri dešifrovaní zostavíme rovnakým spôsobom predošlú maticu, t.j. zoradíme heslo vzostupne a znaky šifry vkladáme do príslušných stĺpcov podľa získaných indexov z pôvodného hesla. Vypísaním matice po riadkoch sa dopracujeme k pôvodnému (nezašifrovanému) textu.

Implementácia

 



Kód

<script>

var matica
var heslo_asc, rozmer, heslo, vstup
var znaky = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
var stlpec
var chyba_znakov

function nacitaj()
{	
	vstup=tab.vstup.value.replace(/s/g,'').toUpperCase()
	
	heslo = tab.heslo.value.split("")
	
	//odstranenie duplikatov
	if (tab.uniq[0].checked) {
		heslo = heslo.filter(function(item, i,arr) { return arr.indexOf(item) == i; })
		tab.heslo.value = heslo.join("")
	}
	heslo_asc = heslo.slice(0)
	heslo_asc.sort()	

	rozmer= heslo.length
	matica = new Array(rozmer)
	for (i = 0; i<rozmer; i++) matica[i] = new Array(rozmer)

	console.log(rozmer)		

	//pridanie nadbytocnych znakov
	chyba_znakov = rozmer*rozmer - vstup.length
	if (chyba_znakov>0) 
		for (i = 0; i<chyba_znakov; i++) vstup += znaky.charAt(Math.floor(Math.random() * znaky.length))
}

tab.zasifruj.onclick = function()
{
	nacitaj()
	tab.vystup.value=''

	//vlozenie vstupu do matice	
	for (i = 0; i<rozmer; i++)
		for (j = 0; j<rozmer; j++)
			matica[i][j]=vstup[i*rozmer+j]
	
	for(i = 0; i<rozmer;i++) {
		console.log(matica[i].join())
		stlpec = heslo.indexOf(heslo_asc[i])
		for(j = 0; j<rozmer;j++) tab.vystup.value+=matica[j][stlpec]
		heslo[stlpec]="*"
	}
}

tab.odsifruj.onclick = function()
{
	nacitaj()
	tab.vystup.value=''
	
	//vlozenie vstupu do matice	
	for (i = 0; i<rozmer; i++) {
		stlpec = heslo.indexOf(heslo_asc[i])
		for (j = 0; j<rozmer; j++) matica[j][stlpec]=vstup[i*rozmer+j]
		heslo[stlpec]="*"
	}	
	
	for(i = 0; i<rozmer;i++) {
		console.log(matica[i].join())
		for(j = 0; j<rozmer;j++) tab.vystup.value+=matica[i][j]
	}
}
</script>