Entwickler-Ecke

Open Source Projekte - affine Chiffre


Fiete - Fr 05.01.18 17:21
Titel: affine Chiffre
Moin,
wünsche allen Programmierern ein produktives 2018.

Das Programm ist ein Nachtrag zum Adventskalender,
beim Alphabet sind die einzelnen Buchstaben beginnend mit der Null durchnummeriert.
m bezeichnet die Anzahl der Zeichen des Alphabets.
Mein Alfa=ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜabcdefghijklmnopqrstuvwxyzäöüß 0123456789,.-_:;#+*<>^?=)(/&%$§"!°|~\{}´' wobei m=101

Der geheime Schlüssel ist ein Zahlenpaar (a,b)wobei a,b Zahlen von 0 bis m-1 sind.
Zusätzlich muss gelten ggt(a,m)=1.

Wenn als Zahlenpaar "normal" gewählt wird, können
a, b und m gewählt werden und das Alphabet wird nicht
verwürfelt, bei "zufällig" wird das Zahlenpaar aus einer
Geheimzahl generiert, die Sender und Empfänger kennen.
Die 101 Zeichen des Alphabets werden zufällig verwürfelt.
Screen
Ist x das zu verschlüsselnde Zeichen, dann berechnet sich das zugehörige Zeichen
y des Geheimtexts nach der Formel
y = (a*x+b)mod m
Zur Entschlüsselung berechnet man das multiplikativ inverse Element

x =[a^{-1}*(y - b)] mod m
https://de.wikipedia.org/wiki/Affine_Chiffre

a ist für die multiplikative Chiffrierung zuständig, b für die anschließende Verschiebung
Viel Spaß beim Testen.
Gruß Fiete


Symbroson - Fr 05.01.18 17:47

Ich hatte sowas ähnliches als app gemacht

hardcode: (wie ich es Anfangs gelöst hatte)

JavaScript-Quelltext
1:
2:
3:
4:
5:
6:
7:
dec = {'A':'Z''B':'I''C':'R''D':'A''E':'J''F':'S''G':'B''H':'K''I':'T''J':'C''K':'L''L':'U''M':'D''N':'M''O':'V''P':'E''Q':'N''R':'W''S':'F''T':'O''U':'X''V':'G''W':'P''X':'Y''Y':'H''Z':'Q',
            'a':'z''b':'i''c':'r''d':'a''e':'j''f':'s''g':'b''h':'k''i':'t''j':'c''k':'l''l':'u''m':'d''n':'m''o':'v''p':'e''q':'n''r':'w''s':'f''t':'o''u':'x''v':'g''w':'p''x':'y''y':'h''z':'q'}
enc = {'A':'D''B':'G''C':'J''D':'M''E':'P''F':'S''G':'V''H':'Y''I':'B''J':'E''K':'H''L':'K''M':'N''N':'Q''O':'T''P':'W''Q':'Z''R':'C''S':'F''T':'I''U':'L''V':'O''W':'R''X':'U''Y':'X''Z':'A',
            'a':'d''b':'g''c':'j''d':'m''e':'p''f':'s''g':'v''h':'y''i':'b''j':'e''k':'h''l':'k''m':'n''n':'q''o':'t''p':'w''q':'z''r':'c''s':'f''t':'i''u':'l''v':'o''w':'r''x':'u''y':'x''z':'a'};

function encrypt( s ) { return s.replace(/[a-zA-Z]/gfunction(c, i, s) { return dec[c] || c; } ); }
function decrypt( s ) { return s.replace(/[a-zA-Z]/gfunction(c, i, s) { return enc[c] || c; } ); }

Oder explizit: (wobei hier nicht die Zeichen abgefangen werden, die nicht im Alphabet vorkommen)

JavaScript-Quelltext
1:
2:
3:
4:
5:
6:
7:
function decrypt(s) {
  s.replace(/./gfunction(c) {
    c = c.charCodeAt(0);
    if(c < 91return String.fromCharCode(((c-65)*9+25)%26+65);
    else return String.fromCharCode(((c-97)*9+25)%26+97);
  });
}


aber deine Lösung ist natürlich viel wissenschaftlicher ^^


Fiete - Fr 05.01.18 18:12

Moin Symbroson,
versuch mal die anderen Codedateien zu knacken!

Gruß Fiete