| 

.NET C# Java Javascript Exception

3
Hallo,

der Entwickler (Gideon Yuval) v. Treyfer gibt für die Umsetzung in C folgendes Code-Fragment an (kann auch hier eingesehen werden):

for(r=O; r<NumRounds; r++)
{
text [8] =text [0] ;
for(i=O;l<8;i++)
{
text[i+l] =(text [i+1] + Sbox[(key+text )Y,256])<<<I; // rotate i left
}
text [0] =text [8] ;
}

Dieses habe ich nach C# transportiert. Kann jemand meinen Einbaufehler erkennen und helfen? Wikipedia hat Treyfer auch als Beispiel verfügbar - auch hier lief bei mir die Entschlüsselung nicht. Beide Versionen würde ich gern lauffähig probieren können.


UPDATE-------------------------------------------------------

Nachfolgend wird durch den ctor eine 256 byte Sbox aufgefüllt. Die Methoden, die ich nutzte, die aber leider nicht funktionierten, stehen unter Antwort 1.

private byte[] Sbox = new byte[256];
private int NUMROUNDS = 32;

public Treyfer()
{
for(int i = 0; i < Sbox.Length; i++)
Sbox = (byte)(i);
}


UPDATE 2 -------------------------------------------------------

Wie versprochen, habe weitere Experimente gemacht. Beim folgenden Versuch habe ich mich an Feistel orientiert u. die damit verbundenen Vertauschungen auf Treyfer angewendet. Im ersten Moment scheint das Sinn ergeben zu können, allerdings ist die Durchmischung nicht gerade als optimal anzusehen, was darauf hin deutet, dass das so immer noch nicht stimmen wird. Ver- und Entschlüsselung funktionierten bei meinen ersten Tests.

Hilfe wäre also immer noch hoch eingeschätzt!


private byte[] Sbox = new byte[256];
private int NUMROUNDS = 32;

public TreyferTest_1()
{
for(int i = 0; i < Sbox.Length; i++)
Sbox = (byte)(i);
}

internal byte[] Encrypt(byte[] text, byte[] key)
{
byte tmp;
for(int r = 0; r < NUMROUNDS; r++)
{
tmp = text[0];
unchecked{
for (int i = 0; i < 8; i++)
{
text = (byte)( (text + tmp + Sbox[key]) % 256 );
text = (byte)((text << 1) | (text >> 7));
}}
tmp = text[7];
}
return text;
}

internal byte[] Decrypt(byte[] text, byte[] key)
{
byte tmp;
for (int r = 0; r < NUMROUNDS; r++)
{
tmp = text[0];
unchecked{
for (int i = 7; i > -1; i--)
{
text = (byte)((text << 7) | (text >> 1));
text = (byte)(((text + 512) - tmp - Sbox[key])% 256);
}}
tmp = text[7];
}
return text;
}
News:
22.02.2014
Falkner 795 3 9
Falkner 795 3 9
@Falkner: Warum gibst du das Thema nicht einfach wieder frei? Ich hätte gern die Lösung gewusst. Schreib doch einfach das Beispiel noch mal ohne die Codebox (Darstellungsfehler und so...). Eine Umkehrung muss doch möglich sein. Ich tippe da mal auf eine Exportbeschränkung, die ev. sogar einen deshalb eingebauten Fehler beinhaltet. Überlegs dir doch bitte noch mal.
boga 27.02.2014
@boga: Hab ich gemacht!
Falkner 27.02.2014
Ich bin nicht so der Experte. Könnte es sich bei dem Fragment um ein Feistel Network handeln? Dann wären die i+1 Geschichten vielleicht Pseudo Code und die damit die aufgeteilten Blöcke (links und rechts). Ist nur so ne Idee. Wär schön wenns hilft.
Wittgenstein 28.02.2014
@Wittgenstein: Einen Horst Feistel hatte ich auch schon angenommen. Am WE werde ich die damit verbundene Swap-Sache mal neu versuchen. Danke!
Falkner 28.02.2014
@Wittgenstein, @boga: Habe meinem Fragetext ein neues Update zugefügt.
Falkner 02.03.2014
Habe gerade gehehen, dass meine im Edit-Text gesetzten eckigen Klammern wieder nicht angezeigt werden. Keine Ahnung warum. Im Edit-Text sind sie da.
Falkner 02.03.2014
Hier noch mal d. Meth. m. Klammern in den folgenden Kommentaren:
Falkner 02.03.2014
internal byte[] Encrypt(byte[] text, byte[] key){
byte tmp;
for(int r = 0; r < NUMROUNDS; r++){
tmp = text[0];
unchecked{
for (int i = 0; i < 8; i++){
text[i] = (byte)( (text[i] + tmp + Sbox[key[i]]) % 256 );
text[i] = (byte)((text[i] << 1) | (text[i] >> 7)); }}
tmp = text[7];}
return text;}
Falkner 02.03.2014
internal byte[] Decrypt(byte[] text, byte[] key)
{
byte tmp;
for (int r = 0; r < NUMROUNDS; r++){
tmp = text[0];
unchecked{
for (int i = 7; i > -1; i--){
text[i] = (byte)((text[i] << 7) | (text[i] >> 1));
text[i] = (byte)(((text[i] + 512) - tmp - Sbox[key[i]])% 256);}}
tmp = text[7];}
return text;}
Falkner 02.03.2014
1
@Falkner und alle anderen, denen das noch neu ist: in Fragen und Antworten wird [i] immer als Marker für Kursiv-Darstellung interpretiert. Auch in Code-Blocks, leider. Wenn man hier Code posten will, der diese Zeichenfolge verwendet, hat man zwei Optionen:
- vorher in der IDE per Refactoring i in irgendwas anderes umbenennen
- alle Vorkommen von [i] ersetzen durch \[i] (oder [ i], das geht auch, glaube ich).
Matthias Hlawatsch 03.03.2014
@Matthias Hlawatsch: Danke, jetzt ist mir endlich klar, woran das liegt.
Falkner 03.03.2014
3 Antworten
2
Kritik an den Seitenbetreibern und Antwort

Wahrscheinlich ist die anfangs v. dir veröffentlichte Version, die ja funktionierte, die einzige Möglichkeit, ausser wenn Kryptoanalyse betrieben wird, zu ver- und entschlüsseln. Ich denke, die beiden Zeilen, die du einbringen wolltest, dienen led. dazu, einen MAC zu bilden. Sie scheinen die Aufgabe zu haben, eine Rückrechnung unmöglich zu machen.

Ich kenne das so nicht, dass man als Nutzer auf Schwächen der WEB-Software reagieren muss - MEHR ALS PEINLICH (mal als realistische Anmerkung)!!! Noch peinlicher wird es, wenn man bedenkt, dass dieser unmögliche Zustand schon länger zu bestehen scheint - es wissen User um die Sache!!!

Ich werde jetzt den Versuch wagen und deinen urspr. Code hier noch mal neu verfügbar machen. Ich habe die fehlenden Angaben intuitiv ergänzt. Mit kleinen Erweiterungen kann er die Basis für gute Verschlüsselung sein. Wenn jetzt wieder Code-Teile nicht angezeigt werden, dann habe ich auch keinen Rat mehr - vielleicht die Betreiber der Seite?

private byte[] Sbox = new byte[256];
private int NUMROUNDS = 32;

public Treyfer()
{
for(int i = 0; i < Sbox.Length; i++)
Sbox[i] = (byte)(i);
}

public byte[] treyfer_encrypt(byte[] text, byte[] key)
{
for (int r = 0; r < NUMROUNDS; r++)
{
unchecked{
for (int i = 0; i < 8; i++)
{
text[i] = (byte)(text[i] + text[(i+1)%8] + Sbox[(key[i]) % 256]);
text[i] = (byte)((text[i] << 1) | (text[i] >> 7));
}}
}
return text;
}

public byte[] treyfer_decrypt(byte[] text, byte[] key)
{
for (int r = 0; r < NUMROUNDS; r++)
{
unchecked{
for (int i = 7; i>-1; i--)
{
text[i] = (byte)((text[i] << 7) | (text[i] >> 1));
text[i] = (byte)((text[i] + 512) - text[(i+1)%8] - Sbox[(key[i]) % 256]);
}
}
}
return text;
}


Ist das denn so schwer, den Usern es einfach zu machen?

Mit freundlichem Gruss

Wittgenstein
04.03.2014
Wittgenstein 76 4
@Wittgenstein: Ich hatte zwar noch einige Stunden experimentiert, eine Lösung fand ich aber auch nicht. Es wird eine Lösung geben. Wahrscheinlich ist ein weiterer Schritt nötig, der nicht bekannt gemacht wurde.

Ich setzte jetzt den grünen Haken. Das Thema ist damit unerledigt abgehakt.

Vielen Dank an alle und eure Bemphungen.

Schönen Tag

Falkner

Falkner 04.03.2014
1
Hallo,

ich bin hier neu und über diese bisher unbeantwortete Frage "gesolpert". Meine Antwort, die sich auf die in Wikipedia Treyfer beschriebene Encryption Methode bezieht, sieht so aus:

Die S-Box s habe ich, um es einfach zu halten, mit Werten con 0 - 255 aufgefült.

using System;

namespace TreyferTest
{
sealed class Treyfer64
{
private int rounds = 32;
private byte[] s;

public Treyfer64()
{
s = new byte[256];

for (int i = 0; i < 256; i++)
{
s = (byte)i;
}
}

internal void treyfer_encrypt(byte[] data, byte[] key)
{
uint i;
byte t = data[0];
for (i = 0; i < 8 * rounds; i++)
{
t += key[i % 8];
t = (byte)(s[t] + data[(i + 1) % 8]);
data[(i + 1) % 8] = t = (byte)((t << 1) | (t >> 7));
}
}

internal void treyfer_decrypt(byte[] data, byte[] key)
{
byte t = 0, temp;

for (int j = 0; j < rounds; j++)
{
for (int i = 7; i >= 0; i--)
{
t = (byte)(data + key);
t = s[t]; temp = t;

t = data[(i + 1) % 8];
t = (byte)((t >> 1) | (t << 7));

data[(i + 1) % 8] = (byte)(t - temp);
}
}
}
}
}


// Die Klasse Treyfer64 kann so genutzt werden:

// ...
private byte[] bdata;

private void button1_Click(object sender, EventArgs e)
{
Treyfer64 trey = new Treyfer64();
string plaintext = "<Treyfer>";
string key = "<Treyfer>";

byte[] bKey = Encoding.GetEncoding("ISO-8859-1").GetBytes(key);
bdata = Encoding.GetEncoding("ISO-8859-1").GetBytes(plaintext);

trey.treyfer_encrypt(bdata, bKey);
string result = Encoding.GetEncoding("ISO-8859-1").GetString(bdata);
MessageBox.Show(result);
}

private void button2_Click(object sender, EventArgs e)
{
Treyfer64 trey = new Treyfer64();
string key = "<Treyfer>";

byte[] bKey = Encoding.GetEncoding("ISO-8859-1").GetBytes(key);
trey.treyfer_decrypt(bdata, bKey);

string result = Encoding.GetEncoding("ISO-8859-1").GetString(bdata);
MessageBox.Show(result);
}
// ...[/code]
30.05.2018
rk 11 1
0
Lese ich da etwas falsch oder fehlt da in diesem Code hier:
for (int i = 0; i < 8; i++)
{
text = (byte)(text + text[(i+1)%8] + Sbox[(key) % 256]);


Nicht eher so etwas?
for (int i = 0; i < 8; i++)
{
text[i+1] = (byte)(text + text[(i+1)%8] + Sbox[(key) % 256]);
23.02.2014
Jens Duczmal 2,6k 1 3 9
@Jens Duczmal: Das ist richtig - wenn die beiden Zeilen (s. o.) eingebaut sind. Das hatte ich auch schon ohne Erfolg probiert. Der Versuch sah so aus:

internal byte[] treyfer_encrypt(byte[] t, byte[] key)
{
byte[] text = new byte[9];
Buffer.BlockCopy(t, 0, text, 0, 8);

for (int r = 0; r < NUMROUNDS; r++)
{
text[8] = text[0];
unchecked{
for (int i = 0; i < 8; i++)
{
text[i+1] = (byte)(text[i+1] + text[i] + Sbox[(key[i]) % 256]);
text[i+1] = (byte)((text[i+1] << 1) | (text[i+1] >> 7));
}
}
text[0] = text[8];
}
return text;
}
Falkner 23.02.2014
@Jens Duczmal: Ach so, die Decryption hatte ich so gemacht (passte nicht mehr ins Feld):

internal byte[] treyfer_decrypt(byte[] t, byte[] key)
{
byte[] text = new byte[9];
Buffer.BlockCopy(t, 0, text, 0, 8);

for (int r = 0; r < NUMROUNDS; r++)
{
text[8] = text[0];
unchecked{
for (int i = 7; i > -1; i--)
{
text[i+1] = (byte)((text[i+1] << 7) | (text[i+1] >> 1));
text[i+1] = (byte)((text[i+1] + 512) - text[i] - Sbox[(key[i]) % 256]);
}
}
text[0] = text[8];

}
return text;
}
Falkner 23.02.2014
Ich glaube wir meinen verschiedene Dinge.
Du schreibst oben, dass der PC bei text[8] = text[0]; nicht mitmacht. Okay. Wahrgenommen. Das ist eine Sache.

Eine andere Sache ist m.E. nach, dass Du im Beispielcode oben überhaupt nicht in text[i+1] schreibst, sondern direkt nur in text, was an für sich ja nicht gehen dürfte, da es ein Array ist und Du den Index nicht mit angibst.

Was kann man sich denn unter "läufts nicht mehr richtig" denn vorstellen?
Jens Duczmal 23.02.2014
@Jens Duczmal: Sorry, falls ich mich unklar ausdrückte! Gemeint ist: Jede Vers. v. mir läuft. Wie im Titel schon zu lesen ist, werden bei d. Decryption falsche Werte entschlüsselt. Und darum geht es - um richtige Werte. Anmerkung: die Arrays t und key sind 64 byte gross.
Falkner 23.02.2014
@Jens Duczmal: Korrektur: Hab mich verschrieben, die Grössen sind 64 Bit - nicht Byte! Also 8 Byte.
Falkner 23.02.2014
@Jens Duczmal: Hab das gerade noch mal kontrolliert, im von mir angegebenen Quellcode (s. o.) sind die [i+1] angegeben, allerdings werden die irgendwie nicht dargestellt. Im Edit-Modus sieht man diese.
Falkner 24.02.2014
Da mir keine Lösung für Treyfer eingefallen ist und von euch auch keine in Sicht zu sein scheint, beende ich die Nachfrage hiermit. Ich bedanke mich für bei Jens Duczmal.
Falkner 25.02.2014
Da mir keine Lösung für Treyfer eingefallen ist und von euch auch keine in Sicht zu sein scheint, beende ich die Nachfrage hiermit. Ich bedanke mich für bei Jens Duczmal.
Falkner 25.02.2014
Da mir keine Lösung für Treyfer eingefallen ist und von euch auch keine in Sicht zu sein scheint, beende ich die Nachfrage hiermit. Ich bedanke mich für bei Jens Duczmal.
Falkner 25.02.2014

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH