Verschlüsselung von GML zu PHP

  • PHP

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Verschlüsselung von GML zu PHP

    Hallo zusammen,

    ich habe da ein kleines Problem mit einer Verschlüsselung von GML zu PHP und umgedreht. Ich würde die Übertragungen gerne vorher verschlüsseln, damit man die Nachricht die an PHP (oder umgedreht) gesendet wurde nicht erspähen kann (z.B. für online Highscores!)
    Das Problem dabei ist nur, das zunächst wirklich keine Verschlüsselung mit PHP gut funktioniert hat. Bei der AES Extension für den GM klappt das schon mal überhaupt nicht ordentlich. Anscheinend wird hier das ganze etwas anders berechnet, zumindest stimmt das Ergebnis nicht. Nun ja, nachdem ich auch Blowfish und andere Verschlüsselungs-Algorithmen durchprobiert habe, funktionierte nun endlich einigermaßen ein Algorithmus, und zwar RC4.

    Allerdings funktioniert dieser nicht immer in PHP und entschlüsselt gelegentlich das ganze total falsch, und zwar dann, wenn bestimmte Sonderzeichen zum Einsatz kommen wie z.B. @ Zeichen. Hier mal der Code:

    PHP-Quellcode

    1. <?php
    2. function rc4($text,$hiddenkey) {
    3. $str = $text;
    4. $key = $hiddenkey;
    5. $out = "";
    6. $len = strlen($key);
    7. for ($i=0; $i<256; $i+=1) {$S[$i] = $i;}
    8. $j = 0;
    9. for ($i=0; $i<256; $i+=1) {
    10. $j = ($j + $S[$i] + ord(substr($key,($i % $len),1))) % 256;
    11. $temp = $S[$i];
    12. $S[$i] = $S[$j];
    13. $S[$j] = $temp;
    14. }
    15. $i = 0;
    16. $j = 0;
    17. for ($pos=0; $pos<strlen($str); $pos+=1) {
    18. $i = ($i + 1) % 256;
    19. $j = ($j + $S[$i]) % 256;
    20. $temp = $S[$i];
    21. $S[$i] = $S[$j];
    22. $S[$j] = $temp;
    23. $t = ($S[$i] + $S[$j]) % 256;
    24. $addpos = $pos;
    25. $out .= chr(ord(substr($str,$addpos,1)) ^ $S[$t]);
    26. }
    27. return $out;
    28. }
    29. ?>
    Alles anzeigen


    Und hier der GML-Code (Gamemaker 8.1):

    GML-Quellcode

    1. {
    2. var str,key,out,len,i,S,j,temp,pos,t;
    3. str = argument0;
    4. key = argument1;
    5. out = "";
    6. len = string_byte_length(key);
    7. for (i=0; i<256; i+=1) S[i] = i;
    8. j = 0;
    9. for (i=0; i<256; i+=1) {
    10. j = (j + S[i] + string_byte_at(key,(i mod len)+1)) mod 256;
    11. temp = S[i];
    12. S[i] = S[j];
    13. S[j] = temp;
    14. }
    15. i = 0;
    16. j = 0;
    17. for (pos=0; pos < string_byte_length(str); pos+=1) {
    18. i = (i + 1) mod 256;
    19. j = (j + S[i]) mod 256;
    20. temp = S[i];
    21. S[i] = S[j];
    22. S[j] = temp;
    23. t = (S[i] + S[j]) mod 256;
    24. out += ansi_char(string_byte_at(str,pos+1) ^ S[t]);
    25. }
    26. return out;
    27. }
    Alles anzeigen


    Irgendwo ist da der Wurm drin. Vielleicht hat da jemand eine Lösung für das Problem? Oder evtl. sogar eine bessere Idee die Übertragung effektiv zu verschlüsseln?

    Würde mir jedenfalls sehr helfen :)
  • Hab keine Ahnung ob dies der Grund ist, aber hast du mal versucht statt:

    GML-Quellcode

    1. out += ansi_char(string_byte_at(str,pos+1) ^ S[t]);

    Das hier zu schreiben?

    GML-Quellcode

    1. out += chr(ord(string_char_at(str,pos+1)) ^ S[t]);

    Willst du auf diese Drachen und -eier klicken?
    Sie werden sich freuen ;)
  • Es könnte auch daran liegen, dass du versuchst, die verschlüsselten Daten als String an die Extension zu übergeben, z.B. mittels

    GML-Quellcode

    1. http_request_add_post_string

    Wenn man Strings vom GM an eine DLL übergibt, dann darf darin kein Nullbyte auftauchen, da dieses dazu verwendet wird, das Ende des Strings festzustellen. Kommt dennoch ein Nullbyte vor, so wird das Ende also zu früh erkannt und es wird nur ein Teil des Strings übertragen. Und in den durch RC4 verschlüsselten Daten können durchaus Nullbytes vorkommen.

    Falls es wirklich daran liegt, könntest du stattdessen die zu sendenden Daten in eine Datei schreiben und dann statt obiger Funktion

    GML-Quellcode

    1. http_request_add_post_file

    verwenden. Oder du kodierst die Daten nochmals, sodass kein Nullbyte vorkommen kann.