| 

.NET C# Java Javascript Exception

7
Hallo,

ich möchte den folgenden C-Code nach C# übersetzen.

http://ru.wikipedia.org/wiki/FNAm2

Die Encrypt-Methode habe ich nach C# übersetzt, allerdings habe ich jetzt Array-Unterläufe, wo sie eigentlich nicht sein sollten. Hat die Sprache C ev. Besonderheiten, die solche Unterläufe automatisch beheben? Wie mache ich den Code so lauffähig, daß dieser mit C und C# die gleichen Ergebnisse produziert?

Wäre nett, wenn ich etwas Hilfe bekommen würde. Vielen Dank schon mal.

Mein Ansatz:

private uint[] key = new uint[16];
private uint Num;

internal void setup(uint[] b)
{
for (uint r = 0; r < 16; r++)
{
key[r] = b[r];
}
Num = 0;
}

internal void crypt(ref uint[] b)
{
int subkey, i, ip, im;

uint b1 = b[0];
uint b2 = b[1];
uint b3 = b[2];
uint b4 = b[3];


for (int r = 0; r != 64; r++)
{
/*Selecting the part of key for a concrete stage*/
i = (int)(r % 16);
if (i == 16)
{
ip = 1;
im = 15;
}
if (i == 1)
{
ip = 2;
im = 16;
}
else
{
ip = i + 1;
im = i - 1;
}

/*Generating the subkey on the basis of nmber part of a key,
number of the block in a file and number of a round*/
unchecked{
subkey = (int)(key * r + (key[im] * Num + key[ip]));

/*F - function*/

b1 += (uint)((((b2 >> 16) ^ ((b2 << 25) + subkey)) + (subkey * (~(b2 << 7)))));
}
b1 = ~b1;
r++;

i = (int)(r % 16);
if (i == 16)
{
ip = 1;
im = 15;
}
if (i == 1)
{
ip = 2;
im = 16;
}
else
{
ip = i + 1;
im = i - 1;
}
unchecked{
subkey = (int)(key * r + (key[im] * Num + key[ip]));
b2 += (uint)((((b3 >> 16) ^ ((b3 << 25) + subkey)) + (subkey * (~(b3 << 7)))));
}
b2 = ~b2;
r++;

i = (int)(r % 16);
if (i == 16)
{
ip = 1;
im = 15;
}
if (i == 1)
{
ip = 2;
im = 16;
}
else
{
ip = i + 1;
im = i - 1;
}
unchecked{
subkey = (int)(key * r + (key[im] * Num + key[ip]));
b3 += (uint)((((b4 >> 16) ^ ((b4 << 25) + subkey)) + (subkey * (~(b4 << 7)))));
}

b3 = ~b3;
r++;

i = (int)(r % 16);
if (i == 16)
{
ip = 1;
im = 15;
}
if (i == 1)
{
ip = 2;
im = 16;
}
else
{
ip = i + 1;
im = i - 1;
}
unchecked{
subkey = (int)(key * r + (key[im] * Num + key[ip]));
b4 += (uint)((((b1 >> 16) ^ ((b1 << 25) + subkey)) + (subkey * (~(b1 << 7)))));
}
b4 = ~b4;
}
Num++;

b[0] = b1; b[1] = b2; b[2] = b3; b[3] = b4;
}
[/code]
News:
18.02.2014
Falkner 795 3 9
1
Wenn ich mich nicht irre, arbeitet "C" mit Eins basierten Indexen und "C#" mit Null basierten Indexen... (Hatten wir bei VB6 zu VB.net) was bedeutet, dass die schleifen ein "-1" brauchen. Also : "for (uint r = 0; r < 16 -1; r++)"
DerPunk 19.02.2014
@DerPunk: Danke, das werde ich probieren! Ich hab bis jetzt die folgenden Zeilen so geändert:

subkey = (int)(key[i] * r + (key[(im + 16) % 16] * Num + key[(ip + 16) % 16]));

Input u. Output sind nun identisch u. es läuft - aber ist das nun richtig? Also identisch m. d. C-Tool?
Falkner 19.02.2014
Dass kann ich dir leider nicht sagen... Ich hab leider keine Ahnung von "C" sprachen... Hatten halt nur mal was ähnliches mit VB ;-)
DerPunk 19.02.2014
Ich habe noch eine Änderung vorgenommen:

subkey = (int)(key[i] * r + (key[(im + 16) & 15] * Num + key[(ip + 16) & 15]));

Falls jemand das Tool probieren möchte, die angeebene Zeile muss bei der Ver- und Entschlüsselung geändert werden, dann läuft es!

Ich bedanke mich bei "DerPunk" und sehe das Problem als gelöst an, hab aber keine Ahnung, wie ich den Haken setzen soll.

Schönen Tag

Falkner
Falkner 19.02.2014
Ich schreib mein Kommentar nochmal als Lösung rein, denn kannst es abhaken ;-)
DerPunk 19.02.2014
1 Antwort
1
Aus Kommentar:
Wenn ich mich nicht irre, arbeitet "C" mit Eins basierten Indexen und "C#" mit Null basierten Indexen... (Hatten wir bei VB6 zu VB.net) was bedeutet, dass die schleifen ein "-1" brauchen. Also : "for (uint r = 0; r < 16 -1; r++)"
19.02.2014
DerPunk 1,2k 1 7
2
@DerPunk: Mich beschleicht das Gefühl, dass alle Wikipedias voneinander abgeschrieben haben. Wobei alle einen Code irgendwo her haben, der so nicht wirklich logisch lauffähig ist.

Die Zeile:

subkey = (int)(key[i] * r + (key[im] * Num + key[ip]));

muss nicht geändert werden, jedoch der if-Block:

i = r % 16;
if (i == 15)
{ ip = 0; im = 14; }
else if (i == 0)
{ ip = 1; im = 15; }
else
{ ip = i + 1; im = i - 1; }

Falkner 19.02.2014

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