| 

.NET C# Java Javascript Exception

4
Hallo,

ich versuche einen String in PHP zu verschlüsseln und diesen in C wieder zun entschlüsseln. Dazu wird der String in einer MySQL Datenbank gespeichert. Leider bekomme ich bei C nur wirre Zeichen heraus.

PHP Code (ver- und entschlüssen funktioniert problemlos):
function encrypt($data){
$iv = "\0";
return trim(mcrypt_encrypt("rijndael-256", "atestkey123456", $data, "ofb", $iv));
}

function decrypt($data){
$iv = "\0";
return trim(mcrypt_decrypt("rijndael-256", "atestkey123456", $data, "ofb", $iv));
}

mysql_connect("****", "****", "****");
mysql_select_db("****");

mysql_query("UPDATE test SET value = '".encrypt("TestString")."' WHERE id = 1");

echo "Plain: TestString\n";
echo "Encrypted: ".strlen(encrypt("TestString"))." Stellen\n";
echo "Decrypted: ".decrypt(encrypt("TestString"))."\n";


C Code:
int decrypt(void* buffer, int buffer_len, char* IV, char* key, int key_len){

MCRYPT td = mcrypt_module_open("rijndael-256", NULL, "ofb", NULL);
int blocksize = mcrypt_enc_get_block_size(td);
if( buffer_len % blocksize != 0 ){return 1;}

mcrypt_generic_init(td, key, key_len, IV);
mdecrypt_generic(td, buffer, buffer_len);
mcrypt_generic_deinit (td);
mcrypt_module_close(td);

return 0;
}

int main(){

char pwd[100], sql[100];
MCRYPT td, td2;
char * IV = "\0";
char *key = "atestkey123456";
int keysize = 32; /* 256 bits */
char * buffer;
int buffer_len = 32;
conn = mysql_init(NULL);
if(conn == NULL){printf("Error %u: %s\n", mysql_errno(conn), mysql_error(conn)); exit(1);}

if(mysql_real_connect(conn, "*****", "*****", "*****", "*****", 0, NULL, 0) == NULL){printf("Error %u: %s\n", mysql_errno(conn), mysql_error(conn)); exit(1);}

if(mysql_query(conn, "SELECT value FROM test WHERE id=1")){
printf("%s", mysql_error(conn));
} else{
res = mysql_use_result(conn);
while((row = mysql_fetch_row(res)) != NULL) {
strcpy(pwd, row[0]);
}
mysql_free_result(res);
}

buffer = calloc(1, buffer_len);
memcpy(buffer, pwd, buffer_len);

printf("Encrypted: %d\n", strlen(buffer));
decrypt(buffer, buffer_len, IV, key, keysize);
printf("Decrypted: %s\n", buffer);

return 0;

}


Ich speichere das Verschlüsselte als VARCHAR, ich bin mir nicht sicher ob das damit auch funktioniert, sollte es nicht als BINARY gespeichert werden?

Ich würde mich sehr freuen falls jemand mit weiterhelfen kann.
13.01.2013
skiller 90 1 5
2
Ich hab das eben mal nur überflogen und so auf den ersten Blick würde ich statt VARCHAR ein BINARY-Feld verwenden oder die Ausgabe mit Base64 codieren.
Alternativ kannst Du mal versuchen direkt in eine (Binär)-Datei zu schreiben und von der zu lesen. Ich denke das Problem ist wirklich MySQL...
phg 15.01.2013
1
Der Tipp mit base64 ist sicherlich nicht schlecht, siehe auch der Kommentar bei der PHP Funktion:
http://php.net/manual/en/function.mcrypt-encrypt.php#78531
Xantiva 16.01.2013
Danke für die Tipps! Ich werde es jetzt erst mal mit BINARY probieren, um Base64 unter C zu decodieren hab ich bisher noch keine libary gefunden mit der das einfach möglich werden.
skiller 16.01.2013
1
Bzgl. Base64 und C: Ich hab mal nur so aus Neugier gegoogelt und bin recht schnell bei http://libb64.sourceforge.net/ gelandet. Macht auf mich eigentlich keinen schlechten Eindruck, aber es ist auch schon ein paar Jahre her, dass ich was in C gecoded habe...
phg 19.01.2013
1 Antwort
0
Danke für alle Tipps, mit Base64 hat es nun funktioniert!
26.01.2013
skiller 90 1 5

Stelle deine Php-Frage jetzt!