Macht es Sinn sein eigenes De und Encrypt System zu programmieren (Javascript)?

5 Antworten

Ave!

SHA und andere Hash-Algorithmen sind nur aus dem Grund entwickelt worden, damit sie eben nicht entschlüsselt werden können.

Die Einsatzbereiche sind vielfältig und wohl am häufigsten wird für Online-Services das Passwort per Hash verschlüsselt um es in Datenbanken zu sichern.

Möchtest du private Daten ver- und entschlüsseln können, dann kannst du selbstverständlich einen eigenen Algorithmus entwicklen.

In wieweit das aber von Nutzen ist, musst du selbst wissen. Spannend ist es auf jeden Fall um zu lernen wie das Konzept funktioniert.

Du könntest dabei klein anfangen wie z.B. mit einem Caesar Cipher.

Ich meine letztens beim Bundesamt für Informationssicherheit ein Jobangebot gesehen zu haben, wo man als Online-Test einen solchen selbst schreiben sollte. Das fand ich schon ziemlich fragwürdig als ehemaliger CISO (da es Kinderkram ist).

Richtige Verschlüsselungs-Algorithmen zu konzipieren und auszuarbeiten erfordert einiges an Erfahrung und Verständnis.

Deswegen: Fang klein an mit oben beschriebenen Dingen.

Weitere Tipps und Tricks:

  • Mixe das Zeichenset des Caesar Ciphers vorher in eine zufällige Reihenfolge.
  • Bringe einen "Seed" mit ein, der den Verschub deklariert und beim Entschlüsseln angegeben werden muss.
  • Der Seed könnte selbst eine Inversion der Verschlüsselung sein um Bruteforcing entgegen zu wirken.

Ergänzung: Der Seed sollte keinen einheitlichen Verschub deklarieren, sondern Pseudo-Randomisiert pro Zeichen anhand des Seeds sein.

Hast du all das eingebracht, ist es auch für einen erfahrenen Entwickler sehr schwer durch den Algorithmus zu kommen - selbst wenn er ihn kennt. Aufgrund des Seeds wird er auch dort Probleme haben.

Wenn du also dann eine damit verschlüsselte Datei irgendwo auf einen USB-Stick packst, ohne das Programm oder den Seed zum Entschlüsseln, kannst du dir quasi sicher sein, dass kein Normalsterblicher Programmierer an die Daten kommt.

Ergänzung: Habe gerade mal was ganz simples gebastelt, kannst du gerne nutzen:

const charset = 'HwQpdWYTt5Bk1xhurzRml3fS6894A0ZyKJGeqsoaVUCjMgOPFNX2ivLInEbD7c';
const extendedCharset = charset+'{[\\$&}-Üä",*ß(Ä] .#`üÖ%;+/)!=?\'ö<>';

// Nur eine kleine Hilfsfunktion
function getSeedValues(str){
    let seed=[];
    for (let char of str){
        if (extendedCharset.indexOf(char)===-1) continue;
        seed=[...seed, extendedCharset.indexOf(char)];
    }
    if(seed.length===0)seed[0]=0;
    return seed;
}

// Zum verschlüsseln. Seed ist standardmäßig "Default"
function encrypt(str, seed="Default"){
    seed=getSeedValues(seed);
    str=str.toString();
    let encr="", seedPos=0;
    for (let char of str){
        if (extendedCharset.indexOf(char)===-1) {
            encr+=char;
        }else{
            let newCharIndex=extendedCharset.indexOf(char)+seed[seedPos];
            if(newCharIndex>=extendedCharset.length)newCharIndex=newCharIndex-extendedCharset.length;
            encr+=extendedCharset[newCharIndex];
        }
        seedPos++;
        if(seedPos>=seed.length)seedPos=0;
    }
    return encr;
}

// Zum entschlüsseln. Seed ist auch hier standardmäßig "Default"
function decrypt(str, seed="Default"){
    seed=getSeedValues(seed);
    str=str.toString();
    let decr="", seedPos=0;
    for (let char of str){
        if (extendedCharset.indexOf===-1){
            decr+=char;
        }else{
            let newCharIndex=extendedCharset.indexOf(char)-seed[seedPos];
            if(newCharIndex<0)newCharIndex=newCharIndex+extendedCharset.length;
            decr+=extendedCharset[newCharIndex];
        }
        seedPos++;
        if(seedPos>=seed.length)seedPos=0;
    }
    return decr;
}

// Test:
let encrypted = encrypt("Hello World!");
console.log(encrypted);                 // DäCDvQxw2Cjt
console.log(decrypt(encrypted));        // Hello World!
Macht es da Sinn sein eigenes System zu entwickeln

Nein, da es genügend Crypto-Bibliotheken gibt, die von Leuten geschrieben wurden, die sich damit auch auskennen.

https://nodejs.org/api/crypto.html

https://developer.mozilla.org/en-US/docs/Web/API/Crypto

da welche wie SHA-256 nur verschlüsseln aber nicht entschlüsselt werden können

Klar, das sind Hashfunktionen.

Du bist wahrscheinlich nicht in der Lage, das gut nebenher zu machen.

Bitte auch nicht kryptographische Hashes und public Key Verschlüsselung verwechseln.

Also du verwechselst Hashing mit Verschlüsselung, das sind ganz unterschiedliche Konzepte mit unterschiedlichen Aufgaben.

Versuch niemals Kryptografie selbst zu entwickeln oder zu implementieren, du verliest nur. Nimm das von Experten. Du wirst ohne sehr sehr tiefes Fachwissen in diesen Bereichen niemals an das rankommen, was andere machen.

Woher ich das weiß:Berufserfahrung – Softwareentwicklerin