Návrh šifrovacího algoritmu

Jenda

Re:Návrh šifrovacího algoritmu
« Odpověď #15 kdy: 04. 07. 2015, 15:48:34 »
Uvazujem ci by sa dala navrhnut sifra ktora by sa dala vykonat rucne a zaroven by ste ju nedokazali prelomit beznym PC.
RC4 je docela jednoduchá (napíšeš si hodnoty bajtů na kartičky, zarovnáš je do mřížky 16x16 a pak je prohazuješ), ale je na ni pár útoků (kterým by se při opatrném používání šlo asi bránit). Další realizovatelné jsou třeba LFSR šifry - tam to jde dělat třeba šoupáním barevných žetonů. Například A5/1, kdyby se jí o něco zvětšil stavový prostor, by mohla být fajn. (nejlepší útok o kterém vím zredukoval prostor z 2^64 na 2^60, což už menší cluster zvládne - kdyby byl původní prostor třeba 2^96 a zmenšil se na 2^93 tak je to pořád dostatečně silné)


Jenda

Re:Návrh šifrovacího algoritmu
« Odpověď #16 kdy: 04. 07. 2015, 15:49:56 »
Obávám se, že bez porušení Kerckhoffových principů se těžko bude hledat algoritmus s jednoznačným průběhem, který by se nedal převést do řeči počítače.
Jemu přece nejde o to aby se to nedalo naprogramovat, ale o to, aby to nešlo cracknout.

prst

Re:Návrh šifrovacího algoritmu
« Odpověď #17 kdy: 04. 07. 2015, 18:10:09 »
Vdaka za vsetky prispevky, vsetko su to teda zahranicne navrhy, ale poznamenavam, ze by som nasim priatelom pripravil nieco tuzemskeho (tj. made in Czechoslovakia), nebolo by nieco take prakticke a dostatocne blbuvzdorne?:)

nou

Re:Návrh šifrovacího algoritmu
« Odpověď #18 kdy: 04. 07. 2015, 18:12:08 »
Hej presne tak. Chcel som vediet ci sa da len pomocou papiera a pera nieco zasifrovat aspon s klucom ekvivalentne 2^64 co este dnes nie je prelomitelne na beznom PC. Ako Jenda ukazal velmi pravdepodobne by to slo.

Radovan.

Re:Návrh šifrovacího algoritmu
« Odpověď #19 kdy: 04. 07. 2015, 22:58:15 »
nieco tuzemskeho (tj. made in Czechoslovakia)

Myslíš jako šifru vymyšlenou přímo v Československu? Asi bych někde vyhrabal šifry používané za války českým odbojem na komunikaci s Londýnem, ale to byla kombinace několika transpozic a substituce nebo tak nějak, příliš pracné na hraní.

Jestli chceš něco praktického a blbuvzdorného, tak zkus tu Playfairovu šifru, místo anglické tabulky 5x5 použij slovenskou 6x6 s vybranými znaky s háčky (nebo 7x7 i s číslicemi), všechno ostatní zůstane stejné:

Abeceda: 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 ž - (čeština)

Heslo: byl pozdní večer první máj

Tabulka:
b y l p o z
d n i v e č
r m a j c ď
ě f g h k ň
q ř s š t ť
u ů w x ž -


Text: zítra bude výlet na sněžku

Postup:
zi tr a- bu de -v yl et -n a- sn ěž ku
lč qc ďw db nč xč lp cž ůč ďw ři ku ěž


Kód: lčqcď wdbnč xčlpc žůčďw řikuě ž


Tady jsem jako jeden ze znaků použil i oddělovač slov, takový malý bonus díky větší tabulce.

Ale když už jsem zmínil tu transpozici, co takhle šifrovací mřížku? Ruční použití je opravdu jednoduché, a programuje se to velmi snadno ;)


prst

Re:Návrh šifrovacího algoritmu
« Odpověď #20 kdy: 05. 07. 2015, 09:49:00 »
Vdaka Radovan. Tak tu mam pythonacky 3.x "hruby" sifrovaci nacrt, ale neviem preco to niekedy nesifruje ako ma, skuste sa na to pozriet, odbornici:)

# Czech Vigenere cipher - Ch is '+' character - to encipher a message...

CHARSET = 'ABCČDEFGH+IJKLMNOPRŘSŠTUVXYZŽ'

def main():
   

    message = input('Message to encrypt: ')
    key = input('Encryption key: ').upper()

    encrypted = []

    index = 0

    for character in message:
        current = CHARSET.find(character.upper())
        if current != -1:
            current += CHARSET.find(key[index])
           
            current %= len(CHARSET) - 1
            encrypted.append(CHARSET[current + 1].upper())
            index += 1
            if index == len(key):
                index = 0
        else:
            key = encrypted


    print('Input: %s' % message)
    print('Output: %s' % ''.join(encrypted))


if __name__ == '__main__':
    main()



Radovan.

Re:Návrh šifrovacího algoritmu
« Odpověď #21 kdy: 05. 07. 2015, 11:16:12 »
CHARSET = 'ABCČDEFGH+IJKLMNOPRŘSŠTUVXYZŽ'

V jakém kódování pracuje tvůj systém? Znaky s diakritikou můžou být kódované více bajty, takže z pohledu programu tam můžeš mít něco takového:

CHARSET = 'ABCČDEFGH+IJKLMNOPRŘSŠTUVXYZś'

Tím se ti posun samozřejmě rozhodí. Také proto jsem psal že máš porovnávat celé řetězce, nejen kvůli tomu CH ;-)

prst

Re:Návrh šifrovacího algoritmu
« Odpověď #22 kdy: 05. 07. 2015, 11:36:41 »
Myslim, ze v kodovani nebude pes zakopany ide len o to, ze posuny u niektorych "suctov" pismen spravy a kluca su posunute o jedno miesto:)
Napriklad:
Message to encrypt: programujte
Encryption key: python
Input: programujte
Output: GPJOGODTFČT

po spravnosti by mal byt vysledok:
Sprava: programujte
Kluc:   pythonpytho
Sifra:  gojogodšfčt

teda: r+y = p nie o a u+y = t a nie š.

prst

Re:Návrh šifrovacího algoritmu
« Odpověď #23 kdy: 05. 07. 2015, 12:01:01 »
Aj ked je CHARSET = 'ABC0DEFGH1IJKLMNOPR2S3TUVXYZ4', kde sa da zarucit neovplyvnenie typom kodovania, potom vystup z programu je:
Message to encrypt: programujte
Encryption key: python
Input: programujte
Output: GPJOGODTF0T
A nie spravne "gojogod3f0t"...

Radovan.

Re:Návrh šifrovacího algoritmu
« Odpověď #24 kdy: 05. 07. 2015, 14:00:22 »
Nojo, máš to rozbité. Začal bych nejdřív s jednoduchou tabulkou s anglickou abecedou:

CHARSET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'

Tu si můžeš snadno zkontrolovat ručně: http://www.limited-entropy.com/wp-content/uploads/2009/03/vigenere_square.png

Potom mi zkus vysvětlit účel těch jedniček v těchhle dvou řádcích:

current %= len(CHARSET) - 1
encrypted.append(CHARSET[current + 1].upper())


Když jsem to -1 a +1 vyhodil, začalo mi to fungovat přesně podle originální tabulky.

prst

Re:Návrh šifrovacího algoritmu
« Odpověď #25 kdy: 05. 07. 2015, 14:38:09 »
Moja "pretransformovana" tabulka by mala obsahovat toto:
        ABCČDEFGHCHIJKLMNOPRŘSŠTUVXYZŽ
   -------------------------------------
A   BCČDEFGHCHIJKLMNOPRŘSŠTUVXYZŽA
B   CČDEFGHCHIJKLMNOPRŘSŠTUVXYZŽAB
C   ČDEFGHCHIJKLMNOPRŘSŠTUVXYZŽABC
Č   DEFGHCHIJKLMNOPRŘSŠTUVXYZŽABCČ
D   EFGHCHIJKLMNOPRŘSŠTUVXYZŽABCČD
E   FGHCHIJKLMNOPRŘSŠTUVXYZŽABCČDE
F   GHCHIJKLMNOPRŘSŠTUVXYZŽABCČDEF
G   HCHIJKLMNOPRŘSŠTUVXYZŽABCČDEFG
H   CHIJKLMNOPRŘSŠTUVXYZŽABCČDEFGH
CH   IJKLMNOPRŘSŠTUVXYZŽABCČDEFGHCH
I   JKLMNOPRŘSŠTUVXYZŽABCČDEFGHCHI
J   KLMNOPRŘSŠTUVXYZŽABCČDEFGHCHIJ
K   LMNOPRŘSŠTUVXYZŽABCČDEFGHCHIJK
L   MNOPRŘSŠTUVXYZŽABCČDEFGHCHIJKL
M   NOPRŘSŠTUVXYZŽABCČDEFGHCHIJKLM
N   OPRŘSŠTUVXYZŽABCČDEFGHCHIJKLMN
O   PRŘSŠTUVXYZŽABCČDEFGHCHIJKLMNO
P   RŘSŠTUVXYZŽABCČDEFGHCHIJKLMNOP
R   ŘSŠTUVXYZŽABCČDEFGHCHIJKLMNOPR
Ř   SŠTUVXYZŽABCČDEFGHCHIJKLMNOPRŘ
S   ŠTUVXYZŽABCČDEFGHCHIJKLMNOPRŘS
Š   TUVXYZŽABCČDEFGHCHIJKLMNOPRŘSŠ
T   UVXYZŽABCČDEFGHCHIJKLMNOPRŘSŠT
U   VXYZŽABCČDEFGHCHIJKLMNOPRŘSŠTU
V   XYZŽABCČDEFGHCHIJKLMNOPRŘSŠTUV
X   YZŽABCČDEFGHCHIJKLMNOPRŘSŠTUVX
Y   ZŽABCČDEFGHCHIJKLMNOPRŘSŠTUVXY
Z   ŽABCČDEFGHCHIJKLMNOPRŘSŠTUVXYZ
Ž   ABCČDEFGHCHIJKLMNOPRŘSŠTUVXYZŽ

Ucel tych riadkov co si uviedol je prave v tom, aby nejako odrazali tu moju "transformaciu" na cestinu:)
Ale to nefunguje pri vsetkych pismenach a rozhodne to nefunguje pri jednom pismeni:(
Vies sa s tym nejako vysporiadat?

Radovan.

Re:Návrh šifrovacího algoritmu
« Odpověď #26 kdy: 05. 07. 2015, 15:55:00 »
Aha, tak to máš tu tabulku ale transformovanou poněkud blbě. Základ je že A+A=A! Takže takhle:

   | A  B  C  Č  D  E  F  G  H  CH I  J  K  L  M  N  O  P  R  Ř  S  Š  T  U  V  X  Y  Z  Ž
---+--------------------------------------------------------------------------------------
A  | A  B  C  Č  D  E  F  G  H  CH I  J  K  L  M  N  O  P  R  Ř  S  Š  T  U  V  X  Y  Z  Ž
B  | B  C  Č  D  E  F  G  H  CH I  J  K  L  M  N  O  P  R  Ř  S  Š  T  U  V  X  Y  Z  Ž  A
C  | C  Č  D  E  F  G  H  CH I  J  K  L  M  N  O  P  R  Ř  S  Š  T  U  V  X  Y  Z  Ž  A  B
Č  | Č  D  E  F  G  H  CH I  J  K  L  M  N  O  P  R  Ř  S  Š  T  U  V  X  Y  Z  Ž  A  B  C
D  | D  E  F  G  H  CH I  J  K  L  M  N  O  P  R  Ř  S  Š  T  U  V  X  Y  Z  Ž  A  B  C  Č
E  | E  F  G  H  CH I  J  K  L  M  N  O  P  R  Ř  S  Š  T  U  V  X  Y  Z  Ž  A  B  C  Č  D
F  | F  G  H  CH I  J  K  L  M  N  O  P  R  Ř  S  Š  T  U  V  X  Y  Z  Ž  A  B  C  Č  D  E
G  | G  H  CH I  J  K  L  M  N  O  P  R  Ř  S  Š  T  U  V  X  Y  Z  Ž  A  B  C  Č  D  E  F
H  | H  CH I  J  K  L  M  N  O  P  R  Ř  S  Š  T  U  V  X  Y  Z  Ž  A  B  C  Č  D  E  F  G
CH | CH I  J  K  L  M  N  O  P  R  Ř  S  Š  T  U  V  X  Y  Z  Ž  A  B  C  Č  D  E  F  G  H
I  | I  J  K  L  M  N  O  P  R  Ř  S  Š  T  U  V  X  Y  Z  Ž  A  B  C  Č  D  E  F  G  H  CH
J  | J  K  L  M  N  O  P  R  Ř  S  Š  T  U  V  X  Y  Z  Ž  A  B  C  Č  D  E  F  G  H  CH I
K  | K  L  M  N  O  P  R  Ř  S  Š  T  U  V  X  Y  Z  Ž  A  B  C  Č  D  E  F  G  H  CH I  J
L  | L  M  N  O  P  R  Ř  S  Š  T  U  V  X  Y  Z  Ž  A  B  C  Č  D  E  F  G  H  CH I  J  K
M  | M  N  O  P  R  Ř  S  Š  T  U  V  X  Y  Z  Ž  A  B  C  Č  D  E  F  G  H  CH I  J  K  L
N  | N  O  P  R  Ř  S  Š  T  U  V  X  Y  Z  Ž  A  B  C  Č  D  E  F  G  H  CH I  J  K  L  M
O  | O  P  R  Ř  S  Š  T  U  V  X  Y  Z  Ž  A  B  C  Č  D  E  F  G  H  CH I  J  K  L  M  N
P  | P  R  Ř  S  Š  T  U  V  X  Y  Z  Ž  A  B  C  Č  D  E  F  G  H  CH I  J  K  L  M  N  O
R  | R  Ř  S  Š  T  U  V  X  Y  Z  Ž  A  B  C  Č  D  E  F  G  H  CH I  J  K  L  M  N  O  P
Ř  | Ř  S  Š  T  U  V  X  Y  Z  Ž  A  B  C  Č  D  E  F  G  H  CH I  J  K  L  M  N  O  P  R
S  | S  Š  T  U  V  X  Y  Z  Ž  A  B  C  Č  D  E  F  G  H  CH I  J  K  L  M  N  O  P  R  Ř
Š  | Š  T  U  V  X  Y  Z  Ž  A  B  C  Č  D  E  F  G  H  CH I  J  K  L  M  N  O  P  R  Ř  S
T  | T  U  V  X  Y  Z  Ž  A  B  C  Č  D  E  F  G  H  CH I  J  K  L  M  N  O  P  R  Ř  S  Š
U  | U  V  X  Y  Z  Ž  A  B  C  Č  D  E  F  G  H  CH I  J  K  L  M  N  O  P  R  Ř  S  Š  T
V  | V  X  Y  Z  Ž  A  B  C  Č  D  E  F  G  H  CH I  J  K  L  M  N  O  P  R  Ř  S  Š  T  U
X  | X  Y  Z  Ž  A  B  C  Č  D  E  F  G  H  CH I  J  K  L  M  N  O  P  R  Ř  S  Š  T  U  V
Y  | Y  Z  Ž  A  B  C  Č  D  E  F  G  H  CH I  J  K  L  M  N  O  P  R  Ř  S  Š  T  U  V  X
Z  | Z  Ž  A  B  C  Č  D  E  F  G  H  CH I  J  K  L  M  N  O  P  R  Ř  S  Š  T  U  V  X  Y
Ž  | A  B  C  Č  D  E  F  G  H  CH I  J  K  L  M  N  O  P  R  Ř  S  Š  T  U  V  X  Y  Z  Ž


Ten horní řádek a levý sloupec by tam ani nemusely být, tabulka je obsahuje v prvním řádku a prvním sloupci.

Tímhle se odstraní to +1, a z toho vyplývající dvojitý posun. Ono to totiž blbne ještě hůř než to na první pohled vypadá.

Druhá věc je to -1. Při překročení velikosti tabulky děláš modulo, ale když máš 29 znaků s čísly 0..28, tak nemůžeš udělat modulo 28 aby ti vyšlo 0..27!

Třetí věc - zkusil sis to po zašifrování zase dešifrovat? Když uděláš malou úpravu v téhle proceduře, tak pro dešifrování bude stačit jenom změna jediného znaménka z + na - (v tvojí původní podobě bys těch znamének musel otáčet víc). Tušíš jaká úprava by to měla být?

No a poslední věc, pokud bys nechtěl mít přepínač šifrování/dešifrování, nebo dvě různé procedury (programy), můžeš zapřemýšlet nad tou reciprokou abecedou (není to žádná novinka). Pro tu totiž používáš úplně stejný postup při šifrování i dešifrování, přitom stačí jenom malá změna tabulky. Vlevo najdeš písmeno hesla, nahoře písmeno textu, a získáš tím totéž co dělají šifrovací stroje jako Enigma nebo Hagelin:

   | Ž  Z  Y  X  V  U  T  Š  S  Ř  R  P  O  N  M  L  K  J  I  CH H  G  F  E  D  Č  C  B  A
---+--------------------------------------------------------------------------------------
A  | A  B  C  Č  D  E  F  G  H  CH I  J  K  L  M  N  O  P  R  Ř  S  Š  T  U  V  X  Y  Z  Ž
B  | B  C  Č  D  E  F  G  H  CH I  J  K  L  M  N  O  P  R  Ř  S  Š  T  U  V  X  Y  Z  Ž  A
C  | C  Č  D  E  F  G  H  CH I  J  K  L  M  N  O  P  R  Ř  S  Š  T  U  V  X  Y  Z  Ž  A  B
Č  | Č  D  E  F  G  H  CH I  J  K  L  M  N  O  P  R  Ř  S  Š  T  U  V  X  Y  Z  Ž  A  B  C
D  | D  E  F  G  H  CH I  J  K  L  M  N  O  P  R  Ř  S  Š  T  U  V  X  Y  Z  Ž  A  B  C  Č
E  | E  F  G  H  CH I  J  K  L  M  N  O  P  R  Ř  S  Š  T  U  V  X  Y  Z  Ž  A  B  C  Č  D
F  | F  G  H  CH I  J  K  L  M  N  O  P  R  Ř  S  Š  T  U  V  X  Y  Z  Ž  A  B  C  Č  D  E
G  | G  H  CH I  J  K  L  M  N  O  P  R  Ř  S  Š  T  U  V  X  Y  Z  Ž  A  B  C  Č  D  E  F
H  | H  CH I  J  K  L  M  N  O  P  R  Ř  S  Š  T  U  V  X  Y  Z  Ž  A  B  C  Č  D  E  F  G
CH | CH I  J  K  L  M  N  O  P  R  Ř  S  Š  T  U  V  X  Y  Z  Ž  A  B  C  Č  D  E  F  G  H
I  | I  J  K  L  M  N  O  P  R  Ř  S  Š  T  U  V  X  Y  Z  Ž  A  B  C  Č  D  E  F  G  H  CH
J  | J  K  L  M  N  O  P  R  Ř  S  Š  T  U  V  X  Y  Z  Ž  A  B  C  Č  D  E  F  G  H  CH I
K  | K  L  M  N  O  P  R  Ř  S  Š  T  U  V  X  Y  Z  Ž  A  B  C  Č  D  E  F  G  H  CH I  J
L  | L  M  N  O  P  R  Ř  S  Š  T  U  V  X  Y  Z  Ž  A  B  C  Č  D  E  F  G  H  CH I  J  K
M  | M  N  O  P  R  Ř  S  Š  T  U  V  X  Y  Z  Ž  A  B  C  Č  D  E  F  G  H  CH I  J  K  L
N  | N  O  P  R  Ř  S  Š  T  U  V  X  Y  Z  Ž  A  B  C  Č  D  E  F  G  H  CH I  J  K  L  M
O  | O  P  R  Ř  S  Š  T  U  V  X  Y  Z  Ž  A  B  C  Č  D  E  F  G  H  CH I  J  K  L  M  N
P  | P  R  Ř  S  Š  T  U  V  X  Y  Z  Ž  A  B  C  Č  D  E  F  G  H  CH I  J  K  L  M  N  O
R  | R  Ř  S  Š  T  U  V  X  Y  Z  Ž  A  B  C  Č  D  E  F  G  H  CH I  J  K  L  M  N  O  P
Ř  | Ř  S  Š  T  U  V  X  Y  Z  Ž  A  B  C  Č  D  E  F  G  H  CH I  J  K  L  M  N  O  P  R
S  | S  Š  T  U  V  X  Y  Z  Ž  A  B  C  Č  D  E  F  G  H  CH I  J  K  L  M  N  O  P  R  Ř
Š  | Š  T  U  V  X  Y  Z  Ž  A  B  C  Č  D  E  F  G  H  CH I  J  K  L  M  N  O  P  R  Ř  S
T  | T  U  V  X  Y  Z  Ž  A  B  C  Č  D  E  F  G  H  CH I  J  K  L  M  N  O  P  R  Ř  S  Š
U  | U  V  X  Y  Z  Ž  A  B  C  Č  D  E  F  G  H  CH I  J  K  L  M  N  O  P  R  Ř  S  Š  T
V  | V  X  Y  Z  Ž  A  B  C  Č  D  E  F  G  H  CH I  J  K  L  M  N  O  P  R  Ř  S  Š  T  U
X  | X  Y  Z  Ž  A  B  C  Č  D  E  F  G  H  CH I  J  K  L  M  N  O  P  R  Ř  S  Š  T  U  V
Y  | Y  Z  Ž  A  B  C  Č  D  E  F  G  H  CH I  J  K  L  M  N  O  P  R  Ř  S  Š  T  U  V  X
Z  | Z  Ž  A  B  C  Č  D  E  F  G  H  CH I  J  K  L  M  N  O  P  R  Ř  S  Š  T  U  V  X  Y
Ž  | A  B  C  Č  D  E  F  G  H  CH I  J  K  L  M  N  O  P  R  Ř  S  Š  T  U  V  X  Y  Z  Ž

prst

Re:Návrh šifrovacího algoritmu
« Odpověď #27 kdy: 05. 07. 2015, 18:45:32 »
Vdaka za napady a reciproku abecedu, uz som vyriesil ten posun abecedy, v tej mojej prvotnej tabulke sa nachadzaju nejednoznacne transformacie. Radovan, naozaj vdaka.

Radovan.

Re:Návrh šifrovacího algoritmu
« Odpověď #28 kdy: 05. 07. 2015, 21:17:13 »
Ještě tam máš jeden hodně velký problém, pokud zadáš text s mezerami, rozhodí ti to posun hesla a naopak! To se nesmí stát, mezery a jiné neplatné znaky se musí přeskočit, na papíře bys je také vynechal.

Jo, to CH je fakt hodně nejednoznačné. Teda mezi náma, po dnešku je Python na mojí stupnici, kde Java je 0 a C 100, tak někde pod čtyřiceti. BASICu bych dal 80, tomu od M$ o třicet méně ;D

Ale maličko jsem se ho za odpoledne s pomocí Google naučil, takže tohle můžeš použít pro porovnání výsledků, vyházej si z (obou!) tabulek znaky které nepotřebuješ, je tam celá česká abeceda. Také si otestuj to kódování, případně ho změň. A mám jenom verzi 2.7.3, takže tě možná čeká pár dalších úprav:

Kód: [Vybrat]
#! /usr/bin/python
# coding: utf-8

mala= ['a','á','b','c','č','d','ď','e','é','ě','f','g','h','ch',
       'i','í','j','k','l','m','n','ň','o','ó','p','q','r','ř',
       's','š','t','ť','u','ú','ů','v','w','x','y','ý','z','ž','']
velka=['A','Á','B','C','Č','D','Ď','E','É','Ě','F','G','H','CH',
       'I','Í','J','K','L','M','N','Ň','O','Ó','P','Q','R','Ř',
       'S','Š','T','Ť','U','Ú','Ů','V','W','X','Y','Ý','Z','Ž','']

text =raw_input('Text:  ')
heslo=raw_input('Heslo: ')
zasif=desif=sifra=""

# proměnné:
# i index
# p písmeno
# k klíč
# t text
# h heslo
# s stopka

t=h=0
while t<=len(text):
      i=0
      p=-1
      while mala[i]:
            if (text[t:].startswith(mala[i])) or (text[t:].startswith(velka[i])):
               p=i
            i+=1
      if p<0:
         t+=1
      else:
         k=-1
         s=h
         while k<0:
               i=0
               while mala[i]:
                     if (heslo[h:].startswith(mala[i])) or (heslo[h:].startswith(velka[i])):
                        k=i
                     i+=1
               if k<0:
                  h+=1
               else:
                  h+=len(velka[k])
               if h>=len(heslo):
                  h=0
               if s==h:
                  k=0
                  break
         t+=len(velka[p])
         i=len(mala)-1
         zasif+=velka[(p+k)%i]
         desif+=velka[(p+i-k)%i]
         sifra+=velka[(k+i-p)%i]

print("Zašifrováno: "+zasif)
print("Dešifrováno: "+desif)
print("Reciproká:   "+sifra)

Je to sice zoufale poslepovaná prasárna, ale dodnes jsem o Pythonu věděl akorát že je v něm print a že má bláznivé odsazování, tak mě nekamenujte ;)

Radovan.

Re:Návrh šifrovacího algoritmu
« Odpověď #29 kdy: 06. 07. 2015, 22:21:22 »
Není nic horšího než předčasné vydání nedostatečně prověřeného programu (žejo, Redmonde), takže update s opravenými chybami a funkčním reciprokým šifrováním, to bylo blbě posunuté. Snad je to všechno. Navrch přidaná volba mezi anglickou a českou abecedou, ať mají táborníci trochu větší luxus :)

Kód: [Vybrat]
#! /usr/bin/python
# coding: utf-8

i=0;
while (i<>1) and (i<>2):
      print("    Vigenérova šifra")
      print("1 - anglická abeceda"+'\n'+"2 - česká abeceda s diakritikou a CH")
      i=input()
if (1==i):
   mala= ['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','']
   velka=['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','']
else:
   mala= ['a','á','b','c','č','d','ď','e','é','ě','f','g','h','ch',
          'i','í','j','k','l','m','n','ň','o','ó','p','q','r','ř',
          's','š','t','ť','u','ú','ů','v','w','x','y','ý','z','ž','']
   velka=['A','Á','B','C','Č','D','Ď','E','É','Ě','F','G','H','CH',
          'I','Í','J','K','L','M','N','Ň','O','Ó','P','Q','R','Ř',
          'S','Š','T','Ť','U','Ú','Ů','V','W','X','Y','Ý','Z','Ž','']

text =raw_input('Zadej text:  ')
heslo=raw_input('Zadej heslo: ')
zasif=desif=recip=""

# proměnné:
# i index
# p písmeno
# k klíč
# t text
# h heslo
# s stopka

t=h=0
while t<len(text):
      i=0
      p=-1
      while mala[i]:
            if (text[t:].startswith(mala[i])) or (text[t:].startswith(velka[i])):
               p=i
            i+=1
      if p<0:
         t+=1
      else:
         k=-1
         s=0
         while k<0:
               i=0
               while mala[i]:
                     if (heslo[h:].startswith(mala[i])) or (heslo[h:].startswith(velka[i])):
                        k=i
                     i+=1
               if k<0:
                  h+=1
               else:
                  h+=len(velka[k])
               if h>len(heslo):
                  h=0
               if s>len(heslo):
                  k=0
                  break
               s+=1
         t+=len(velka[p])
         i=len(mala)-1
         zasif+=velka[(p+k)%i]
         desif+=velka[(p+i-k)%i]
         recip+=velka[(k+i-p-1)%i]

print("Zašifrováno: "+zasif)
print("Dešifrováno: "+desif)
print("Reciproká:   "+recip)