Autor Beitrag
hallo
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 450

WIN XP, SuSE 9.3
D3 Prof, D6 Pers, 2005 Pers
BeitragVerfasst: Fr 03.03.06 18:19 
Hi,

also z.Z. will ich eine Blowfish-Verschlüsselung vom PHP-Code zu Delphi umprogrammieren. Einige Funktionen gibts da zwar nicht, aber die hat man schnell nachprogrammiert!
Als Ursprungscode nehm ich den Code von www.php-einfach.de/s...nerator_blowfish.php her. Dieses lautet:

ausblenden volle Höhe Quelltext
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:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
250:
251:
252:
253:
254:
255:
256:
257:
258:
259:
260:
261:
262:
263:
264:
265:
266:
267:
268:
269:
270:
271:
272:
273:
274:
275:
276:
277:
278:
279:
280:
281:
282:
283:
284:
<?php
$key = $_POST['key'];
?>

<form action="" method="post" target="">
Key: <br>
<input type="Text" name="key" value="<?php echo $key; ?>" size="" maxlength="12"><br><br>

Text: <br>
<textarea name="text" cols="50" rows="6"></textarea><br>

   <input type="Submit" name="crypt" value="Verschlüsseln">   
<input type="Submit" name="decrypt" value="Entschlüsseln">
</form>

<?php
include("blowfish.box.php"); //P-Box and S-Box

$text = trim($_POST['text']);
if(isset($_POST['key'])) keys($_POST['key']);

//Verschlüsselungsmodus / Encryptionmode:
//EBC: 0
//CBC: 1
define("CBC",1);

//Einen Text in Longzahlen umwandeln
//Covert a string into longinteger
function _str2long($data)
    {
    $n = strlen($data);
    $tmp = unpack('N*', $data);
    $data_long = array();
    $j = 0;

    foreach ($tmp as $value) $data_long[$j++] = $value;
    return $data_long;
    }

//Longzahlen in Text umwandeln
//Convert a longinteger into a string
function _long2str($l)
   {
   return pack('N', $l);
   }

//Key-Algorithmen
function keys($key)
    {
    global $pbox,$sbox0,$sbox1,$sbox2,$sbox3;
    $key_md5 = md5($key);

    //Füllt den $key auf 16 Stellen auf
    //Convert the $key into a 16Byte key
    $key = _str2long(substr(str_pad($key, 16, $key_md5),0,16));


    # XOR Pbox1 with the first 32 bits of the key, XOR P2 with the second 32-bits of the key,
    for($i=0;$i<count($pbox);$i++)
       {
       $pbox[$i] ^= $key[$i%4];
       }

    $v[0] = 0x00000000;
    $v[1] = 0x00000000;

    //P-Box durch verschlüsselte Nullbit Blöcke ersetzen. In der nächsten Runde das Resultat erneut verschlüsseln
    //Encrypt Nullbit Blocks and replace the Pbox with the Chiffre. Next round, encrypt the result
    for($i=0;$i<count($pbox);$i+=2)
        {
        $v = block_encrypt(array($v[0],$v[1]));
        $pbox[$i] = $v[0];
        $pbox[$i+1] = $v[1];
        }

    //S-Box [0 bis 3] durch verschlüsselte Blöcke ersetzen
    //Replace S-Box [0 to 3] entries with encrypted blocks
    for($i=0;$i<count($sbox0);$i+=2)
        {
        $v = block_encrypt(array($v[0],$v[1]));
        $sbox0[$i] = $v[0];
        $sbox0[$i+1] = $v[1];
        }

    //S-Box1
    for($i=0;$i<count($sbox1);$i+=2)
        {
        $v = block_encrypt(array($v[0],$v[1]));
        $sbox1[$i] = $v[0];
        $sbox1[$i+1] = $v[1];
        }

    //S-Box2
    for($i=0;$i<count($sbox2);$i+=2)
        {
        $v = block_encrypt(array($v[0],$v[1]));
        $sbox2[$i] = $v[0];
        $sbox2[$i+1] = $v[1];
        }

    //S-Box3
    for($i=0;$i<count($sbox3);$i+=2)
        {
        $v = block_encrypt(array($v[0],$v[1]));
        $sbox3[$i] = $v[0];
        $sbox3[$i+1] = $v[1];
        }

    return $key;
    }




//Verschlüsselung ($text = text/string)
//Encrytion
function blowfish_crypt($text)
    {
    $n = strlen($text);
    if($n%8 != 0) $lng = ($n+(8-($n%8)));
    else $lng = 0;

    $text = str_pad($text, $lng, ' ');
    $text = _str2long($text);

    //Initialization vector: IV
    if(CBC == 1)
       {
       $cipher[0][0] = time();
       $cipher[0][1] = (double)microtime()*1000000;
       }

    $a = 1;
    for($i = 0; $i<count($text); $i+=2)
        {
        if(CBC == 1)
           {
           //$text mit letztem Geheimtext XOR Verknüpfen
           //$text is XORed with the previous ciphertext
           $text[$i] ^= $cipher[$a-1][0];
           $text[$i+1] ^= $cipher[$a-1][1];
           }

        $cipher[] = block_encrypt(array($text[$i],$text[$i+1]));
        $a++;
        }

    $output = "";
    for($i = 0; $i<count($cipher); $i++)
       {
       $output .= _long2str($cipher[$i][0]);
       $output .= _long2str($cipher[$i][1]);
       }

    return base64_encode($output);
    }




//Entschlüsseln
//Decryption
function blowfish_decrypt($text)
    {
    $plain = array();
    $cipher = _str2long(base64_decode($text));

    if(CBC == 1) $i = 2; //Message start at second block
    else $i = 0; //Message start at first block

    for($i; $i<count($cipher); $i+=2)
       {
       $return = block_decrypt(array($cipher[$i],$cipher[$i+1]));

       if(CBC == 1)
          {
          //Xor Verknüpfung von $return und Geheimtext aus von den letzten beiden Blöcken
          //XORed $return with the previous ciphertext
          $plain[] = array($return[0]^$cipher[$i-2],$return[1]^$cipher[$i-1]);
          }
       else          //EBC Mode
          {
          $plain[] = $return;
          }
       }

    for($i = 0; $i<count($plain); $i++)
       {
       $output .= _long2str($plain[$i][0]);
       $output .= _long2str($plain[$i][1]);
       }
    return $output;
    }


if(isset($_POST["crypt"]))
    {
    $output = blowfish_crypt($text);
    echo "<br><b>Verschlüsselt</b> sieht der Text so aus:<br>
    <textarea name=\"ausgabe\" cols=\"45\" rows=\"9\">".
    $output."</textarea>";
    }

else if(isset($_POST["decrypt"]))
    {
    $output = blowfish_decrypt($text);
    echo  "<b>Entschlüsselt</b> sieht der Text so aus:<br>".
    nl2br(htmlentities(stripslashes($output)));
    }


function block_encrypt($text)
    {
    global $pbox;
    $vl = $text[0];
    $vr = $text[1];

   for($i=0;$i<16;$i++)
      {
      $vl ^= $pbox[$i];
      $vr ^= sbox_round($vl);

      $v_tmp = $vl;
      $vl = $vr;
      $vr = $v_tmp;
      }

    $v_tmp = $vl;
    $vl = $vr;
    $vr = $v_tmp;

    $vr ^= $pbox[16];
    $vl ^= $pbox[17];


    return array($vl,$vr);
    }

function block_decrypt($text)
    {
    global $pbox;

    $vl = $text[0];
    $vr = $text[1];

   for($i=17;$i>1;$i--)
      {
      $vl ^= $pbox[$i];
      $vr ^= sbox_round($vl);

      $v_tmp = $vl;
      $vl = $vr;
      $vr = $v_tmp;
      }

    $v_tmp = $vl;
    $vl = $vr;
    $vr = $v_tmp;

    $vr ^= $pbox[1];
    $vl ^= $pbox[0];

    return array($vl,$vr);
    }


function sbox_round($integer)
    {
    global $sbox0,$sbox1,$sbox2,$sbox3;

    //$integer in vier 8 Bit Blöcke unterteilen
    //Split $integer into four 8 Bit blocks
    $b0 = $integer<<24 & 0xFF;
    $b1 = $integer<<16 & 0xFF;
    $b2 = $integer<<8 & 0xFF;
    $b3 = $integer & 0xFF;
    

    $return = ($sbox0[$b0] + $sbox1[$b1] % pow(2,32)) ;
    $return = ($return ^ $sbox2[$b2]) + $sbox3[$b3] % pow(2,32);

    return $return;
    }
?>


Größtenteils ist das auch alles klar. Die unpack() funktion hab ich schon programmiert und die läuft. Nur die sbox_round will nicht so ganz hinhaun. Ich glaube aber eher der Fehler liegt im PHP-Code:

ausblenden Quelltext
1:
2:
3:
4:
$b0 = $integer<<24 & 0xFF;
    $b1 = $integer<<16 & 0xFF;
    $b2 = $integer<<8 & 0xFF;
    $b3 = $integer & 0xFF;

Wenn ich die Binärzahl (beispiel!): 1100 1110 0100 0101 um 8 stellen nach links verschiebe steht doch nur noch 1100 1110 0100 0101 0000 0000. Wenn ich diese Zahl dann noch mit AND 1111 1111 berechne, MUSS doch 0 rauskommen da die 8 letzten Bits immer 0 sind und 0 AND 1 =0.

Deshalb hab ich jetzt bei Delpi folgendes gemacht:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
b0:=(int AND $FF000000div 16777216
b1:=(int AND $FF0000div 65536
b2:=(int AND $FF00div 256
b3:=(int AND $FF);

Und dieser Code liefert auch ganz anständige Werte!
Der PHP-Code liefert als Encryptet Data oder wie man soetwas nennt, string wie:
Zitat:
RAhlqgAK96KNouK8LSAYFcsKfXFNv+UcTKNB1W7HYbQ/sQL/ude5ekotrXQdd/ZHTKKrMauPnHW

nur eben viel länger je nach datei. Aber ein anderer Sourcecode von Delphi liefert mir auch andere Werte außer normalen Tastaturzeichen. Ist das wirklich Blowfish? Übrigens hat der Code angeblich CBC (Cipher Block Chaining).
Ach ja. Der Verschlüsselt sowohl Dateien (gifs etc.) als auch Texte und kann diese auch wieder 1:1 zurückentschlüsseln.
Der Delphi Code ist noch nicht ganz fertig.

So. Ich hoffe ihr konntet meine paar Unklarheiten verstehen.
Danke

_________________
Der beste je Programmierte Trojaner: Windows XP
Wäre es nicht adequat, den Usus heterogener Termini zu minimieren?
hallo Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 450

WIN XP, SuSE 9.3
D3 Prof, D6 Pers, 2005 Pers
BeitragVerfasst: Sa 04.03.06 20:16 
So. Ich hoffe dass schiebepostings noch erlaubt sind wie es in der Ankündigung steht.
DAHER: *push*
Probleme in Funktion sbox_round;
Also ich hab jetzt diesen Code weiter durchgeschaut und noch einige Fehler gefunden.
pow(2,32) funktioniert nicht! Das geht irgendwie aus dem bereich raus glaube ich. Jetzt hab ich es durch 0x100000000 ersetzt was das gleiche sein müsste. Jetzt funktioniert auch das % (modulo).
Jedoch gibts jetzt in der selben funktion einen fehler den ich gar nicht mehr kapiere:
Das $return ^ $sbox2[$b2] will nicht funktionieren! Der liefert etwas negatives! $return ist postiv! Die sbox2 ist auch groß genug und auch positiv. Das ^ ist XOR in Delphi. In Delphi nehme ich Int64 varbiablen her, und mit denen funktioniert das auch.

WARUM? geht das NICHT und was muss ich in PHP machen dass es funktioniert? Hat hier irgendwer wenigstens eine Idee?

_________________
Der beste je Programmierte Trojaner: Windows XP
Wäre es nicht adequat, den Usus heterogener Termini zu minimieren?
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 04.03.06 20:38 
kannst dir mal www.dsdt.info/projekte/mathematik/?id=9 anschauen. vielleicht hilft dies weiter.
hallo Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 450

WIN XP, SuSE 9.3
D3 Prof, D6 Pers, 2005 Pers
BeitragVerfasst: So 05.03.06 00:40 
Erst einmal DANKE für deine Antwort! Also ich schau mir das jetzt mal morgen an. Ich hab schon ein bisschen druchegschaut und es sieht schon mal gut aus.

_________________
Der beste je Programmierte Trojaner: Windows XP
Wäre es nicht adequat, den Usus heterogener Termini zu minimieren?
digi_c
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1905

W98, XP
D7 PE, Lazarus, WinAVR
BeitragVerfasst: So 05.03.06 01:04 
www.cityinthesky.co.uk/cryptography.html
www.manuel-poeter.de...x.php?site=tutorials

Evtl passt auch delphi-jedi.org/api/CryptoAPI2.zip und somit Suche im MSDN CRYPTO API aber ich weiß nicht ob das nciht eher Zertifikate betrifft.