Also das ist kein Standard DES Algorithmus.
Ich habe den Source mit dem Testvector aus der "Original" Source verglichen, da kommt was ganz anderes raus. Der obige C Source muß geändert worden sein, und die darin enthaltenen Testvektoren stimmen nicht mehr mit dem überein was der Source jetzt berechnen würde.
Die Änderung ist:
ByteBit : array[0..7] of Word = (1, 2, 4, 8, 16, 32, 64, 128);
richtig für Original DES ist
ByteBit : array[0..7] of Word = (128, 64, 32, 16, 8, 4, 2, 1);
Diese Änderung ist sehr gefährlich, ja höchst gefährlich.
DES ist ein 64Bit Cipher der auf Grund der internen SBOX Struktur aber nur 56 Bits des Passwortes benutzen kann. Dazu werden 8 Bits im Passwort während des KeySetups ausmaskiert. Bentzt man eine andere Ausmaskierung so reduziert sich die Sicheherit nochmals um 8 Bits, denn die im original Ausmaskierten Bits würden sowieso keinen Einfluß haben durch die DES-SBOX Struktur. Maskiert man aber andere Bits aus so entfernt man zusätzliche Passwort-Informationen. Man reduziert die real verwnedete Anzahl der Passwortbits von 56 Bit auf 48 Bit.
Möchtest du mit
DEC arbeiten dann öffne
Unit DECCipher.pas und ändere in
Delphi-Quellcode:
procedure TCipher_1DES.DoInitKey(const Data: array of Byte; Key: PLongArray; Reverse: Boolean);
const
ROT: array[0..15] of Byte = (1,2,4,6,8,10,12,14,15,17,19,21,23,25,27,28);
var
I,J,L,M,N: LongWord;
PC_M,PC_R: array[0..55] of Byte;
K: array[0..31] of LongWord;
begin
FillChar(K, SizeOf(K), 0);
for I := 0 to 55 do
// if Data[DES_PC1[I] shr 3] and ($80 shr (DES_PC1[I] and $07)) <> 0 then PC_M[I] := 1
// else PC_M[I] := 0;
if Data[DES_PC1[I] shr 3] and ($01 shl (DES_PC1[I] and $07)) <> 0 then PC_M[I] := 1
else PC_M[I] := 0;
Dann bekommst du mit obigen Source die deine gewünschten Ausgaben.
Gruß hagen