Implementace Vigenerovy šifry v Matlabu.
function vystup = vigener(zprava,klic,zasifrovat) % Vigenerova sifra - kryptovaci funkce % VSTUP: % zprava - retezec, odpovidajici zprave % mozne hodnoty: pouze pismena % klic - retezec, odpovidajici sifrovacimu klici % mozne hodnoty: pouze pismena % zasifrovat - volba, zda se ma sifrovat ci desifrovat % mozne hodnoty: true|false % % Autor: JanKoWeb, jankoweb(at)volny.cz, 2011 % % Vigenerova sifrovaci tabulka TAB = ... ['ABCDEFGHIJKLMNOPQRSTUVWXYZ'; 'BCDEFGHIJKLMNOPQRSTUVWXYZA'; 'CDEFGHIJKLMNOPQRSTUVWXYZAB'; 'DEFGHIJKLMNOPQRSTUVWXYZABC'; 'EFGHIJKLMNOPQRSTUVWXYZABCD'; 'FGHIJKLMNOPQRSTUVWXYZABCDE'; 'GHIJKLMNOPQRSTUVWXYZABCDEF'; 'HIJKLMNOPQRSTUVWXYZABCDEFG'; 'IJKLMNOPQRSTUVWXYZABCDEFGH'; 'JKLMNOPQRSTUVWXYZABCDEFGHI'; 'KLMNOPQRSTUVWXYZABCDEFGHIJ'; 'LMNOPQRSTUVWXYZABCDEFGHIJK'; 'MNOPQRSTUVWXYZABCDEFGHIJKL'; 'NOPQRSTUVWXYZABCDEFGHIJKLM'; 'OPQRSTUVWXYZABCDEFGHIJKLMN'; 'PQRSTUVWXYZABCDEFGHIJKLMNO'; 'QRSTUVWXYZABCDEFGHIJKLMNOP'; 'RSTUVWXYZABCDEFGHIJKLMNOPQ'; 'STUVWXYZABCDEFGHIJKLMNOPQR'; 'TUVWXYZABCDEFGHIJKLMNOPQRS'; 'UVWXYZABCDEFGHIJKLMNOPQRST'; 'VWXYZABCDEFGHIJKLMNOPQRSTU'; 'WXYZABCDEFGHIJKLMNOPQRSTUV'; 'XYZABCDEFGHIJKLMNOPQRSTUVW'; 'YZABCDEFGHIJKLMNOPQRSTUVWX'; 'ZABCDEFGHIJKLMNOPQRSTUVWXY']; % uprava vstupu na velka pismena zprava = upper(zprava); klic = upper(klic); % kontrola vstupu if ( ~((zprava(1,:) >= 65) & (zprava(1,:) <= 90)) ) %znak v ASCII error('Zprava muze obsahovat jen pismena.'); end %& if ( ~((klic(1,:) >= 65) & (klic(1,:) <= 90)) ) %znak v ASCII error('Klic muze obsahovat jen pismena.'); end % inicializace pole vystupu vystup = []; % pro i jdouci po 1 do delky zpravy for i=1:length(zprava) % osetreni kratsiho klice nez je delka zpravy % +1 ... Matlab indexuje pole od jedne pozice = mod(i-1,length(klic)) + 1; if (zasifrovat) % koukneme se do sifrovaci tabulky na pozici aktualniho % znaku v klici a ve zprave % -65 + 1 ... chceme dostat cislo pismene, ale Matlab indexuje pole od 1 zasifrovane = TAB( klic(pozice)-65 + 1 , zprava(i)-65 + 1 ); % pridani prvku do vystupniho pole vystup = [vystup zasifrovane]; else % najdeme v tabulce sloupec, jehoz index odpovida puvodni zprave % -65 + 1 ... chceme dostat cislo pismene, ale Matlab indexuje pole od 1 desifrovane = find(TAB(klic(pozice)-65 + 1,:) == zprava(i)); % prevedeme na pismena; zde kvuli indexum Matlabu jednicku odecteme desifrovane = char(desifrovane + 65 - 1); % pridani prvku do vystupniho pole vystup = [vystup desifrovane]; end end % end of for end
Tento web jsem zakládal na střední, v roce 2008. Je zde hlavně archiv mé tvorby.
Aktuální věci publikuji kvůli úspoře času na Twitter.
Honza
"To, co druzí dělají, může být podnětem našich pocitů, nikoli však jejich příčinou."