Contact
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutSign UpSign In
| Download
Views: 3715

Kryptering 1

Klassiska kryptosystem

load('../kryptering.sage')

Förskjutningskrypto

Förvald förskjutning är tre steg, d.v.s. Caesarkryptot.

print Caesarkrypto(u'hemligt')
khpoljx

Vi kan ange valfri krypteringsnyckel.

klartext = u'dettaärenkortklartext' kryptogram = Caesarkrypto(klartext, 15) print kryptogram
stggpnetaåbegåäpegtjg

Dekryptering fås med samma funktion, fast med motsvarande dekrypteringsnyckel.

print Caesarkrypto(kryptogram, 13) # vi har att 15 + 13 är kongruent med 0 modulo 28
dettaärenkortklartext

Det är möjligt att utgå från till exempel det engelska språket.

print Caesarkrypto('thisisamessage', 12, Aeng)
ftueuemyqeemsq

Monoalfabetiskt substitutionskrypto

Låt pSmp \in S_m vara en permutation på mängden {1,2,,m}\{1, 2, \ldots, m\}. Man kan beskriva en permutation som en lista (p1,p2,,pm)(p_1, p_2, \ldots, p_m), där heltalet ii avbildas på pip_i, d.v.s. p(i)=sip(i) = s_i.

p = Permutation([11, 7, 22, 14, 28, 8, 1, 16, 24, 5, 13, 27, 4, 3, 20, 17, 2, 10, 21, 25, 9, 26, 18, 15, 12, 6, 23, 19])

I ovansteånde exempel har vi bland annat att p(1)=11p(1) = 11 och p(17)=2p(17) = 2, eftersom det första och sjuttonde elementet i listan är 1111 respektive 22.

p(1)
11
p(17)
2
Applicerar vi permutationen pp på ett alfabtet, givet som en textsträng, så kastar vi om bokstäverna så att första bokstaven i alfabetet ersätts med den elfte bokstaven, d.v.s. a krypteras som k, o.s.v.
nyckel = p.action(Asve) # applicera p på svenska alfabetet, resultatet är en lista
Vi skriver ut krypteringsnyckeln.
for i in range(len(nyckel)) : print Asve[i], '->', nyckel[i]
a -> k b -> g c -> v d -> n e -> ö f -> h g -> a h -> p i -> y j -> e k -> m l -> ä m -> d n -> c o -> t p -> q q -> b r -> j s -> u t -> z u -> i v -> å x -> r y -> o z -> l å -> f ä -> x ö -> s
Kryptering med aktuell nyckel ger följande resultat.
klartext = u'dettaärenkortklartext' kryptogram = substitutionskrypto(klartext, p) print kryptogram
nözzkxjöcmtjzmäkjzörz
För dekryptering bestämmer vi inversen p1p^{-1}.
q = p.inverse() print substitutionskrypto(kryptogram, q)
dettaärenkortklartext

Vi kan definiera ett nytt alfabet och kryptera med avseende på det.

nytt_alfabet = '12+=' p = Permutation([3, 2, 4, 1]) print substitutionskrypto('1+1=2', p, nytt_alfabet)
+=+12

Transpositionskrypto

Låt nn vara en nyckel till ett kolumnär transpositionskrypto, d.v.s. nn är en permutation av heltalen 0,1,,k10, 1, \ldots, k-1. Om t.ex. k=4k = 4 och n=(2,0,3,1)n = (2, 0, 3, 1), så betyder det att vi skriver texten tt i en tabell om fyra kolumner och läser i tur och ordning tredje, första, fjärde och andra kolumnen.

print transpositionskrypto(u'okrypterat', [2, 0, 1])
rtaoyetkpr

Denna krypteringsfunktion är inte begränsad till något specifikt alfabet.

print transpositionskrypto(u'Enligt SageMath är 1 + 1 = 2.', [2, 3, 0, 1])
l eh iSM 112Egaaä .ntgtr+=

Alice har skickat oss nedanstående kryptogram. Som krypteringsnyckel ha hon använt n=(2,0,3,1)n = (2, 0, 3, 1). Vad kan klartexten vara?

c = u'levrs rUn oppnine sesgEäsåå!' print transpositionskrypto(c, [2, 0, 3, 1], 'dekryptera')
Uslingen Eve är oss på spåren!

Playfair

Nyckeln till ett Playfairkrypto ska vara en textsträng med de 25 bokstäverna a,b,,z\text{a}, \text{b}, \ldots, \text{z}, exklusive j. Funktionen Playfair ersätter alla j med ett i samt förbereder klartexten genom att lägga till eventuella x för att undvika par med med samma bokstav.

klartext = 'asslipperyasaneel' nyckel = 'thequickbrownfxmpsvlazydg' kryptogram = Playfair(klartext, nyckel) print kryptogram
ymvmcmshkgymyounus

Dekryptering fås med samma funktionen. Notera att eventuella utfylnadstecken inte tas bort.

print Playfair(kryptogram, nyckel, metod = 'dekryptera')
asslipperyasanexel

ADFGVX

Nyckeln till ett ADFGVX-krypto är dels en textsträng av längd 36 med bokstäverna a-z och siffrorna 0-9 (se Playfair) och dels en permutation av 0,1,,k10, 1, \ldots, k - 1 (se transpositionskrypto ovan).

n = 'ba6uy9srjfzkwm8ednct0hop1ig25vq34xl7' p = [1, 0, 2, 3, 4] klartext = 'toogoodtobetrue' kryptogram = ADFGVX(klartext, n, p) print kryptogram
DVVGGAGVGDFDGFFVGGVGVADFGVGADG

Man dekryptera med samma funktion, fast där man med ett fjärde argument specificera önskad metod.

print ADFGVX(kryptogram, n, p, 'dekryptera')
toogoodtobetrue