mcrypt stream decode
-
Hallo,
ich habe eine Website, die mit einem Daemon kommunizieren soll.
Die ganze Kommunikation soll verschlüsselt sein (twofish, cfb).
Ich arbeite sowohl auf der Website (PHP) als auch beim C++ Daemon mit mcrypt.Ich sende zum test mehrfach vom PHP-Script einen verschlüsselten Teststring:
./twofish.php 123456789012345678901234567890123456789123456789
Das ganze kommt beim Daemon an und wird entschlüsselt. Da stimmen jeweils immer die ersten Zeichen nicht (die ersten 6-12 Zeichen jeweils / manchmal bricht es komplett):
GET-DEC: '>########{7f(678901234567890123456789123456789'
GET-DEC: 'v###X#######c##N78901234567890123456789123456789'
GET-DEC: 'K%1#XBSR###8##U78901234567890123456789123456789'
GET-DEC: '#v##B###
GET-DEC: '#####2#####U:dҁ78901234567890123456789123456789'Hier der entsprechende Auszug aus dem C++ Daemon:
string cxnrpc::net_crypt_get() { char c_recvbuffer[2]; string str_get = ""; int i_bytes; MCRYPT obj_crypt; int i_ivsize; obj_crypt = mcrypt_module_open((char*) MCRYPT_TWOFISH, NULL, (char*) MCRYPT_CFB, NULL); if(obj_crypt == MCRYPT_FAILED) { printf("Error while open mcrypt\n"); return ""; } i_ivsize = mcrypt_enc_get_iv_size(obj_crypt); char c_iv[(long) i_ivsize]; for(int i = 0; i < i_ivsize; i++) c_iv[i] = rand(); if(mcrypt_generic_init(obj_crypt, (char*) str_passwd.c_str(), str_passwd.length(), c_iv) < 0) { printf("Error while initialize mcrypt\n"); return ""; } while((i_bytes = recv(i_socket, c_recvbuffer, 1, 0))) { string str_bytes = c_recvbuffer; if(str_bytes.find("\n") != string::npos) break; if(mdecrypt_generic(obj_crypt, &c_recvbuffer, 1) != 0) { printf("Error while decrypt\n"); return ""; } str_get += c_recvbuffer[0]; } printf("GET-DEC: '%s'\n", str_get.c_str()); mcrypt_generic_deinit(obj_crypt); mcrypt_module_close(obj_crypt); return str_get; }Mein php test \1:
#!/usr/bin/php <?php $key = "AAAABBBBCCCCDDDD"; $text = $argv[1]; $iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_TWOFISH, MCRYPT_MODE_CFB)); $crypttext = mcrypt_encrypt(MCRYPT_TWOFISH, $key, $text, MCRYPT_MODE_CFB, $iv); echo "SEND SIZE:" . strlen($crypttext) . "\n"; $fp = fsockopen("host", 12345, $errno, $errstr, 3); if(!$fp) die("$errstr ($errno)\n"); fwrite($fp, $crypttext . "\n"); fclose($fp); ?>Der key vom daemon ist natürlich auch entsprechend AAAABBBBCCCCDDDD
Wechsel ich twofish gegen blowfish ist das ergebnis das selbe.
Wechsel ich CFB mit ECB, und verschlüssel-/entschlüssel immer jeweils 16bytes, bricht es auch häufig.Bitte bringt mir ein Licht in die Dunkelheit meiner Verzweiflung

-
PHP ist der schuldige.
Ich war so dumm dem zu vertrauen und den fehler in meinem eigenen COde zu suchen.Wenn ich etwas mit php cfb, twofish encrypte und direkt wieder decrypte, tritt das Problem auch auf. Man kann sich heute auch auf nichts mehr verlassen, außer auf die unzuverlässigkeit von PHP.