Sorun şifreleme / kodlama URL değişkeni

1 Cevap php

Ben bu biçimde bir dize alır bir sınıf var:

000067000000000012620060324b38e2cab3353

, Dize daha sonra bir URL bir get değişken olarak ekler şifreler.

Şifreleme yapan sınıfı bu gibi bir işlevi vardır:

private function _code_encryption($enc_type,$a_string){
    $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC); 
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);                          

    if($enc_type == self::ENCRYPT_STRING){
       //encrypt then return base64 encoded
       $encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, self::AUTH_ENCRYPTION_KEY, $a_string, MCRYPT_MODE_CBC, $iv);
       return base64_encode($encrypted);
    }elseif($enc_type == self::DECRYPT_STRING){
       $decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, self::AUTH_ENCRYPTION_KEY, base64_decode($a_string), MCRYPT_MODE_CBC, $iv);
        return trim($decrypted);
    }
}

Dize şifreli olduğunda ben değerini UrlEncode ve url "https://secure.mysite.com/index.php?action=someaction&transfer_code=XXXXX XXXX urlencoded şifreli dize olduğu gibi görünüyor gibi url ekleyin.

Url ayrıştırılır ve işlendiğinde Şimdi, $ _GET ['transfer_code'] değeri yukarıdaki _code_encryption işleve oluyor ancak doğru şekilde deşifre değer döndüren ve yerine benim tarayıcı render değil, bozuk karakter verir değildir. Ben şifreleme / şifre çözme için kullanabileceğiniz anahtar uzunluğu için bir şart var mı? Ben böyle bir şey denedim

$key = hash('sha256',self::AUTH_ENCRYPTION_KEY,true);

ama bu da işe yaramadı ...

Değişkenler olsun php man sayfaları devlet zaten urlencoded çünkü Ayrıca, ben $ _GET ['transfer_code'] değişkeni urlkodlamasig değilim ...

UTF-8 encryption/base64_encoding ÖNCE alfasayısal dize kodlayan, ya da hatta herhangi bir fark yaratacak olmalıdır?

1 Cevap

Sen şifrelemek için rasgele IV, ve a şifresini çözmek için different rasgele IV kullanın. Çözülen dize hiç orijinal maç asla. Düzgün orijinal dize şifresini şifreleme sırasında kullanılan aynı IV kullanmanız gerekir. Genellikle bu şifrelenmiş dize için kullanılan IV prepending ile elde edilir. Çözme anda ilk, değerinden IV ayıklamak gerekir bu değerle anahtarı başlatmak, ardından düzgün başlatılmış anahtarını usign kalanını şifresini.

Ben bu doğrulamak için bir ayrıştırıcı yok ama böyle bir şey olmalı:

private function _code_encryption($enc_type,$a_string){
 $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC); 
 if($enc_type == self::ENCRYPT_STRING){
  //encrypt then return base64 encoded
  $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
  $encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, self::AUTH_ENCRYPTION_KEY, $a_string, MCRYPT_MODE_CBC, $iv);
  return base64_encode($iv.$encrypted);
 } elseif ($enc_type == self::DECRYPT_STRING){
  $decoded = base64_decode($a_string);
  $iv = substr($decoded,0,$iv_size);
  $cipher = substr($decoded,$iv_size);
  $decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, self::AUTH_ENCRYPTION_KEY, $cipher, MCRYPT_MODE_CBC, $iv);
  return trim($decrypted);
 }
}