Einzelnen Beitrag anzeigen
Alt 02.01.07, 16:20   #27 (permalink)
Eydeet
 
Benutzerbild von Eydeet
 
Registriert seit: 14.04.06
Eydeet Leistung: Facit NTK
Likes: 4
Standard

Ich hab das ganze jetzt in zwei Programme gepackt. Die Werte werden über die Bash mitgegeben (nur unter Linux getestet)

vigenere.cpp   
Code:
#include <iostream>

using namespace std;

int main(int argc, char* argv[]) {
    if(argc != 5) {
        cerr << "Usage: " << argv[0] << " [e|d] [r|a] key text" << endl << endl
             << "e(ncrypt), d(ecrypt)" << endl
             << "mode: Wenn der zu verschlüsselnde Wert länger ist als der Key..." << endl
             << "  r(epeat): wird der Key wiederholt" << endl
             << "  a(utokey): wird der Wert selbst an den Key angehängt (sicherer)" << endl
             << "example: " << argv[0] << " e a AKEY HALLO (returns HKPJV)" << endl;
        return -1;
    }

    int key_len = strlen(argv[3]);
    int txt_len = strlen(argv[4]);

    //string letters = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ";
    //int letters_len = 63;
    string letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    int letters_len = 26;
    int false_keys = 0;

    string out, out_key;

    for(int i=0; i<txt_len; i++)
    {
        char key;
        if(key_len > i) {
            key = argv[3][i-false_keys];
        }
        else if(argv[2][0] == 'r') {
             key = argv[3][i % key_len - false_keys];
        }
        else {
            key = argv[4][i-key_len-false_keys];
        }

        int cur_key = letters.find(toupper(key), 0);
        if(cur_key > letters_len) {
            false_keys++;
            continue;
        }

        int cur_letter = letters.find(toupper(argv[4][i]), 0);
        if(cur_letter > letters_len) continue;

        // Wenn encrypted werden soll, key addieren, sonst subtrahieren
        if(argv[1][0] == 'e') {
            cur_letter += cur_key;
            while(cur_letter > letters_len)
                cur_letter -= letters_len;
        }
        else {
            cur_letter -= cur_key;
            while(cur_letter < 0)
                cur_letter += letters_len;
        }

        out += letters[cur_letter];
        out_key += letters[cur_key];
    }
    cout << out << endl;
    cout << "KEY: " << out_key << endl;
}


caesar.cpp   
Code:
#include <iostream>

using namespace std;

int main(int argc, char* argv[]) {
    if(argc < 3) {
        cerr << "Usage: " << argv[0] << " key text [sys]" << endl
                << "\texample: " << argv[0] << " 1 Hallo (returns Ibmmp)" << endl;
        return -1;
    }

    int key = atoi(argv[1]);
    int txt_len = strlen(argv[2]);

    string letters = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
    int letters_len = 63;

    string out;

    for(int i=0; i<txt_len; i++)  {
        int cur_letter = letters.find(argv[2][i]);
        if(cur_letter > letters_len) continue;

        cur_letter += key;
        while(cur_letter > letters_len)
            cur_letter -= letters_len;

        out += letters[cur_letter];
    }
    cout << out << endl;
}

Beim Cäsar-Programm muss man einen negativen Wert angeben, um zu entschlüsseln.

EDIT:
Das ganze in JavaScript, allerdings nur die Vigenere-Lösung, da Vigenere ja eigentlich schon die Caesar-Verschlüsselung beherrscht:
Vigenere.html   
Code:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <style language="text/css">
    body {
      font: 16px sans-serif;
      background-color: #eee;
    }

    #container {
      background-color: #fff;
      width: 700px;
      position: absolute;
      left: 50%;
      margin: 50px 0 50px -370px;
      padding: 20px;
    }

    h1 {
      font: 50px serif;
      text-align: center;
    }

    textarea, [type="text"] {
      border: 1px dashed #aaa;
      font-size: 16px;
    }

    textarea {
      width: 100%;
      height: 100px;
    }

    textarea:focus, [type="text"]:focus {
      background-color: #eef;
      border: 1px solid #aaa;
    }
    </style>

    <script language="JavaScript">
    function vigenere_en(uncrypted, key) {
        var crypted = "";
        uncrypted = onlyUpper(uncrypted);
        var myKey = onlyUpper(key);

        if(document.vigenere.selfKey.checked) {
            // Self-Key
            myKey += uncrypted;
        } else {
            // Repeat key
            var repeatKey = Math.floor(uncrypted.length / myKey.length);

            while(repeatKey > 0) {
                myKey += myKey;
                repeatKey--;
            }
        }

        var keyPos = 0;

        for(var i=0; i<uncrypted.length; i++) {
            var charCode = uncrypted.charCodeAt(i);
            var keyCode  = myKey.charCodeAt(keyPos);

            if(charCode >= 65 && charCode <= 91) {
                charCode += myKey.charCodeAt(keyPos)-65;
                while(charCode < 65) charCode += 26;
                while(charCode >= 91) charCode -= 26;
                crypted += String.fromCharCode(charCode);
                keyPos++;
            }
        }
        document.vigenere.fullKey.value = myKey;
        return crypted;
    }

    function vigenere_de(crypted, key) {
        var uncrypted = "";
        var myKey = onlyUpper(key);
        var keyPos = 0;
        crypted = onlyUpper(crypted);

        if(!(document.vigenere.selfKey.checked)) {
            // Repeat key
            var repeatKey = Math.floor(crypted.length / myKey.length);

            while(repeatKey > 0) {
                myKey += myKey;
                repeatKey--;
            }
        }

        for(var i=0; i<crypted.length; i++) {
            var charCode = crypted.charCodeAt(i);
            var keyCode  = myKey.charCodeAt(keyPos);

            charCode -= myKey.charCodeAt(keyPos)-65;

            while(charCode <= 65) charCode += 26;
            while(charCode >= 91) charCode -= 26;

            // Add char to solution string
            uncrypted += String.fromCharCode(charCode);

            // If selfkey method is used: add char also to key string
            if(document.vigenere.selfKey.checked) {
                myKey += String.fromCharCode(charCode);
            }

            keyPos++;
        }
        document.vigenere.fullKey.value = myKey;
        return uncrypted;
    }

    function onlyUpper(myText) {
        myText = myText.toUpperCase();
        var ret = "";

        for(var i=0; i<myText.length; i++) {
            var charCode = myText.charCodeAt(i);

            if(charCode >= 65 && charCode <= 91) {
                ret += String.fromCharCode(charCode);
            }
        }

        return ret;
    }

    function encode() {
        var uncrypted = document.vigenere.uncrypted.value;
        var key       = document.vigenere.key.value;
        var crypted   = vigenere_en(uncrypted, key);
        document.vigenere.crypted.value = crypted;
    }

    function decode() {
        var uncrypted = document.vigenere.uncrypted.value;
        var key       = document.vigenere.key.value;
        var crypted   = vigenere_de(uncrypted, key);
        document.vigenere.crypted.value = crypted;
    }

    function swap() {
        var tmp = document.vigenere.uncrypted.value;
        document.vigenere.uncrypted.value = document.vigenere.crypted.value;
        document.vigenere.crypted.value = tmp;
    }

    function clear_all() {
        if(confirm("Do you really want to clear the boxes?")) {
            document.vigenere.uncrypted.value = "";
            document.vigenere.crypted.value = "";
            document.vigenere.key.value = "";
            document.vigenere.fullKey.value = "";
        }
    }
    </script>

    <title>
      Vigenere Cipher
    </title>
  </head>
  <body>
    <div id="container">
      <h1>
        Vigenere Cipher
      </h1>
      <noscript>You have to enable JavaScript to use this tool</noscript>
      <form onsubmit="return false;" name="vigenere">
        <p>
          Input:<br />
          <textarea name="uncrypted" id="uncrypted">YOURTEXT</textarea>
        </p>
        <p>
          Key: <input type="text" id="key" value="ANYKEY" />
          <input type="checkbox" name="selfKey" checked="checked" />Self-Key
          <input type="button" value="encode" onmousedown="encode()" />
          <input type="button" value="decode" onmousedown="decode()" />
          <input type="button" value="swap" onmousedown="swap()" />
          <input type="button" value="clear" onmousedown="clear_all()" />
        </p>
        <p>
          Full key (only for debug purposes; don't enter any text):
          <input type="text" id="fullKey" value="" onkeydown="return false;" />
        </p>
        <p>
          Output:<br />
          <textarea name="crypted" id="crypted"></textarea>
        </p>
      </form>
    </div>
  </body>
</html>
Eydeet ist offline   Mit Zitat antworten
 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61