M
hallo!
ich möchte gerne in einer client application die in c/c++ geschrieben ist einen textstring verschlüsseln ,diesen an einen webserver übertragen und dort mittels eines php scripts wieder entschlüsseln.
ich habe mich für rc4 entschieden,da es für meine zwecke ausreichend (sicher) ist.
die übertragung vom client zum server funktioniert tadellos(sowohl raw data als auch base64 encoded) und die verschlüsselung an sich funktioniert auch(ich kann clientside decrypten,was clientside encrypted wurde.gleiches gilt für den server)
sobald ich allerdings versuche etwas serverside zu decrypten,was clientside encrypted wurde erhalte ich kein verwertbares ergebnis mehr.
da ich mich leider nicht besonders gut mit php auskenne vermute ich einfach mal,dass eine gewisse diskrepanz zwischen dem handling der daten in c und php besteht oder dass ich die php funktion falsch benutze/aufrufe.
die funktionen die ich verwende:
#define SWAP(a, b) ((a) ^= (b), (b) ^= (a), (a) ^= (b))
char *RC4(char *pszText,const char *pszKey)
{
unsigned char sbox[256]; /* Encryption array */
unsigned char key[256],k; /* Numeric key values */
int m, n, i, j, ilen; /* Ambiguously named counters */
i = 0, j = 0,n = 0;
memset(sbox,0,256);
memset(key,0,256);
ilen = (int)strlen(pszKey);
for(m = 0; m < 256; m++) /* Initialize the key sequence */
{
*(key + m)= *(pszKey + (m % ilen));
*(sbox + m) = m;
}
for(m = 0; m < 256; m++)
{
n = (n + *(sbox+m) + *(key + m)) &0xff;
SWAP(*(sbox + m),*(sbox + n));
}
ilen = (int)strlen(pszText);
for(m = 0; m < ilen; m++)
{
i = (i + 1) &0xff;
j = (j + *(sbox + i)) &0xff;
SWAP(*(sbox+i),*(sbox + j)); /* randomly Initialize the key sequence */
k = *(sbox + ((*(sbox + i) + *(sbox + j)) &0xff ));
*(pszText + m) ^= k;
}
return pszText;
}
<?php
$secretkey = "1234";
function RC4($key, $data) { //encrypt and decrypt $data with the key in $keyfile with an rc4 algorithm
$pwd = $key;
$pwd_length = strlen($pwd);
$key = array();
//Key auffüllen
for ($i = 0; $i < 256; $i++) {
$key[$i] = ord($pwd{$i % $pwd_length});
$sub[$i] = $i;
}
//Substituion-Box vorbereiten
for ($i = $x = 0; $i < 256; $i++) {
$x = ($x + $sub[$i] + $key[$i]) % 256;
//$sub[$i] swap $sub[$x]
$temp_swap = $sub[$i];
$sub[$i] = $sub[$x];
$sub[$x] = $temp_swap;
}
//Text verschlüsseln
for ($a = $j = $i = 0; $i < strlen($data); $i++) {
$a = ($a + 1) % 256;
$j = ($j + $sub[$a]) % 256;
//$sub[$a] swap $sub[$j]
$temp = $sub[$a];
$sub[$a] = $sub[$j];
$sub[$j] = $temp;
$k = $sub[(($sub[$a] + $sub[$j]) % 256)];
$Zcipher = ord($data{$i}) ^ $k;
$Zcrypt .= chr($Zcipher);
}
return $Zcrypt;
}
?>
aufrufen tu ich das ganze folgendermassen:
im client:
char szKey[128] = "1234";
char *rc4 = new char [Length];
rc4 = RC4(Buffer, szKey);
serverside so:
$secretkey = "1234";
$String = RC4($secretkey, $_POST['data']);
eventl. kennt jemand dieses problem oder erkennt anhand des codes wo das problem liegen könnte.
vielen dank im vorraus!
max