Caesar-Verschlüsselung mit fortschreitender Quelle - Umkehralgorithmus

Neue Frage »

Auf diesen Beitrag antworten »
InformaTiger Caesar-Verschlüsselung mit fortschreitender Quelle - Umkehralgorithmus

Hallo,
ich bin ziemlich am verzweifeln... den "Hinweg" - Algorithmus habe ich Problemlos hingekriegt, aber der "Rückweg" - Algorithmus macht nur probleme...

Dies ist der "Hinweg" - Algorithmus:

code:
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:
  private string EncryptToCaesarHigh(string sText)
        {
            string temp = null;

            if (!chBDecrypt.Checked)
            {
                iChiffre = 0;

                for (int i = 0; i < sText.Length; i++)
                {
                    iChiffre++;
                    if (IsInValueRange(sText[i], cCryptoalphabet))
                    {
                        int index = GetIndexOfArray(sText[i], cCryptoalphabet);

                        if (index + iChiffre < cCryptoalphabet.Length)
                        {
                            temp += cCryptoalphabet[index + iChiffre];
                        }
                        else
                        {
                            temp += cCryptoalphabet[GetRestToCryptoalphabet(index)];
                        }
                    }
                    else
                    {
                        temp += sText[i];
                    }
                }

                return temp;
            }
            else
            {
                // Umkehralgorithmus
                return temp;
            }


Kann mir jemand einen Ansatz geben wie ich den hier umkehren kann?

Weitere Details:
Caesar Verschlüsselung mit fortschreitender Quelle

Der gesamte Quellcode ist als Anhang mitdabei.

Danke, schon im voraus.

Mfg
InformaTiger
 
Auf diesen Beitrag antworten »
eulerscheZahl

code:
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:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Caesar_high
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void buttonDecrypt_Click(object sender, EventArgs e)
        {
            richTextBoxCrypto.Text = Crypto.CaesarHigh.Encrypt(richTextBoxPlain.Text, "ABCDEFGHIJKLMNOPQRSTUVWXYZ");
        }

        private void buttonEncrypt_Click(object sender, EventArgs e)
        {
            richTextBoxCrypto.Text = Crypto.CaesarHigh.Decrypt(richTextBoxPlain.Text, "ABCDEFGHIJKLMNOPQRSTUVWXYZ");
        }
    }
}

namespace Crypto
{
    public static class CaesarHigh
    {
        public static string Encrypt(string text, string alpabet)
        {
            string erg = "";
            for (int i = 1; i <= text.Length; i++)
                if (alpabet.Contains(text[i - 1]))
                    erg += alpabet[(alpabet.IndexOf(text[i - 1]) + i) % alpabet.Length];
                else erg += text[i - 1];
            return erg;
        }

        public static string Decrypt(string text, string alpabet)
        {
            string erg = "";
            for (int i = 1; i <= text.Length; i++)
                if (alpabet.Contains(text[i - 1]))
                    erg += alpabet[(((alpabet.IndexOf(text[i - 1]) - i) % alpabet.Length) + alpabet.Length) % alpabet.Length];
                else erg += text[i - 1];
            return erg;
        }
    }
}
Auf diesen Beitrag antworten »
InformaTiger

Man erkennt wiedermal den unterschied zwischen einem Anfänger und einem Proficode.... großes Grinsen

Die String.Contains Methode erspart es dir eine eigene Methode zu schreiben, das ist klar. Mit der IndexOf Methode kannst du ein Zeichen sozusagen finden, wenn ich das richtig verstanden habe. Das einzige was ich dann noch nicht ganz verstehe ist die Sache mit dem Modulo, wobei ich mir denke, dass dir diese erspart zu kontrollieren ob sich das Zeichen innerhalb des Alphabets befindet.

verwirrt

Danke

Mfg
InformaTiger
Auf diesen Beitrag antworten »
eulerscheZahl

Noch besser wäre es gewesen, wenn ich für das Ergebnis einen StringBuilder genommen hätte (wegen besserer Performance) Augenzwinkern
Contains und IndexOf hast du richtig erkannt.

Zum Modulo:
Mein Alphabet vom Beispielaufruf hat 26 Zeichen. Wenn ich z.B. den Buchstaben X(=23, wenn A=0) und eine Verschiebung von 5 habe, dann ist die Summe 28, was größer als Z(=25) ist. Durch das Modulo sorge ich dafür, dass die 28 zur 2 wird, also wieder von Vorne begonnen.

Beim Entschlüsseln muss ich die Verschiebung aber abziehen, nicht aufaddieren.
Modulo kann bei negativer Eingangszahl aber auch negative Zahlen liefern (hier Intervall [-25;0]), hier wäre ich außerhalb des Arraybereichs.
Um sicherzustellen, dass ich eine positive Zahl habe, addiere ich daher 26 und rechne dann (wegen 0+26 = 26 bzw. positivem Ergebnis nach 1. Modulo) nochmals Modulo 26.
 
 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »