2016-04-14 20 views
0

PHP'deki dosyaları OTP yöntemiyle şifrelemek için basit bir kitaplık oluşturmaya çalışıyorum. Benim sorunum, şifresi çözülmüş koddaki bazı karakterlerin orijinalinden farklı olmasıdır. Üzerinde neredeyse bir hafta çalıştım ama sonuçsuz. Base64 chars ile veya kodlama/kod çözme mekanizması ile sorun mu var?PHP'de Temel64 Otp Kitaplığı

Cevaplar için çok teşekkürler.

final class Otp 
{ 

    private static $charSet = array('+','/','0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L', 
    'M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r', 
    's','t','u','v','w','x','y','z'); 

    public static function encryptFile($originalFilePath, $encryptedFilePath, $keyFilePath) 
    { 

     if(!self::existsFile($keyFilePath) || !self::existsFile($encryptedFilePath)) { 

      if($originalFileData = self::existsFile($originalFilePath)) { 

       $originalFileBase64Data = base64_encode($originalFileData); 
       $originalFileBase64DataLength = strlen($originalFileBase64Data) - 1; 
       $originalFileBase64DataArray = str_split($originalFileBase64Data); 

       $encryptedData = NULL; 
       $encryptedDataKey = NULL; 
       for ($i = 0; $i <= $originalFileBase64DataLength; $i++) { 

        $randKey = rand(0, sizeOf(self::$charSet) - 1); 
        $arrayKey = array_search($originalFileBase64DataArray[$i], self::$charSet); 

        if($randKey > $arrayKey) { 
         $str = '-' . ($randKey - $arrayKey); 
        } elseif($randKey < $arrayKey) { 
         $str = ($randKey + $arrayKey); 
        } else { 
         $str = $randKey; 
        } 

        $encryptedData .= self::$charSet[$randKey]; 
        $encryptedDataKey .= $str. ';'; 

       } 

       $encryptedDataString = $encryptedData; 
       $encryptedDataKeyString = $encryptedDataKey; 

       if(!self::existsFile($keyFilePath)) { 
        file_put_contents($keyFilePath, $encryptedDataKeyString); 
       } 

       if(!self::existsFile($encryptedFilePath)) { 
        file_put_contents($encryptedFilePath, $encryptedDataString); 
       } 

       return 'OK'; 

      } else { 
       return 'Source file not exists'; 
      } 

     } else { 
      return 'Encrypted data already exists'; 
     } 
    } 

    public static function decryptFile($encryptedFilePath, $keyFilePath, $decryptedFilePath) 
    { 

     $keyFileData = self::existsFile($keyFilePath); 
     $encryptedFileData = self::existsFile($encryptedFilePath); 
     $encryptedFileDataLength = strlen($encryptedFileData) - 1; 

     if($encryptedFileData && $keyFileData) { 

      $encryptedFileDataArray = str_split($encryptedFileData); 
      $keyFileDataArray = explode(';', $keyFileData); 

      $decryptedData = NULL; 
      for ($i = 0; $i <= $encryptedFileDataLength; $i++) { 

       $poziciaaktualneho = array_search($encryptedFileDataArray[$i], self::$charSet); 
       $poziciasifrovana = $keyFileDataArray[$i]; 
       if($poziciasifrovana < 0) { 
        $move = $poziciasifrovana + $poziciaaktualneho; 
       } elseif($poziciasifrovana > 0) { 
        $move = $poziciasifrovana - $poziciaaktualneho; 
       } else { 
        $move = '0'; 
       } 
       $decryptedData .= self::$charSet[$move]; 

      } 

      if(!self::existsFile($decryptedFilePath)) { 
       file_put_contents($decryptedFilePath, base64_decode($decryptedData)); 
       return 'OK'; 
      } else { 
       return 'Decrypted data already exists'; 
      } 

     } 

    } 

    private static function existsFile($filePath) 
    { 
     $fileData = @file_get_contents($filePath); 
     if($fileData) { 
      return $fileData; 
     } 
     return FALSE; 
    } 

} 


$originalFilePath = 'original.jpg'; 
$keyFilePath = 'Otp_Key_' . $originalFilePath; 
$encryptedFilePath = 'Otp_Data_' . $originalFilePath; 
$decryptedFilePath = 'Otp_Decrypted_' . $originalFilePath; 

echo Otp::encryptFile($originalFilePath, $encryptedFilePath, $keyFilePath); 
echo Otp::decryptFile($encryptedFilePath, $keyFilePath, $decryptedFilePath); 
+0

SO hoş geldiniz! Mevcut kodunuzu ve sorun yaşadığınız yeri gösterebilir misiniz, bu yüzden sorunun ne olduğunu anlayabiliriz? – brimstone

+0

zaten burada. üzgünüm ben burada yeniyim. – tomdawayhet

+0

OTP ile tek kullanımlık şifre mi demek istiyorsun? –

cevap

0

sorun hattı 78 üzerinde deyim bu denetlemek ve bunun yerine sorunu çözmek başardı $poziciasifrovana eşit $move ayarlamak için eğer $poziciaaktualneho başka ekleyerek $poziciasifrovana ve böylece eşit olduğunda sadece oluyor gibi görünüyor. Aşağıdaki komut çalışması gerekir:

final class Otp 
{ 

    private static $charSet = array('+','/','0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L', 
    'M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r', 
    's','t','u','v','w','x','y','z'); 

    public static function encryptFile($originalFilePath, $encryptedFilePath, $keyFilePath) 
    { 

     if(!self::existsFile($keyFilePath) || !self::existsFile($encryptedFilePath)) { 

      if($originalFileData = self::existsFile($originalFilePath)) { 

       $originalFileBase64Data = base64_encode($originalFileData); 
       $originalFileBase64DataLength = strlen($originalFileBase64Data) - 1; 
       $originalFileBase64DataArray = str_split($originalFileBase64Data); 

       $encryptedData = NULL; 
       $encryptedDataKey = NULL; 
       for ($i = 0; $i <= $originalFileBase64DataLength; $i++) { 

        $randKey = rand(0, sizeOf(self::$charSet) - 1); 
        $arrayKey = array_search($originalFileBase64DataArray[$i], self::$charSet); 

        if($randKey > $arrayKey) { 
         $str = '-' . ($randKey - $arrayKey); 
        } elseif($randKey < $arrayKey) { 
         $str = ($randKey + $arrayKey); 
        } else { 
         $str = $randKey; 
        } 

        $encryptedData .= self::$charSet[$randKey]; 
        $encryptedDataKey .= $str. ';'; 

       } 

       $encryptedDataString = $encryptedData; 
       $encryptedDataKeyString = $encryptedDataKey; 

       if(!self::existsFile($keyFilePath)) { 
        file_put_contents($keyFilePath, $encryptedDataKeyString); 
       } 

       if(!self::existsFile($encryptedFilePath)) { 
        file_put_contents($encryptedFilePath, $encryptedDataString); 
       } 

       return 'OK'; 

      } else { 
       return 'Source file not exists'; 
      } 

     } else { 
      return 'Encrypted data already exists'; 
     } 
    } 

    public static function decryptFile($encryptedFilePath, $keyFilePath, $decryptedFilePath) 
    { 

     $keyFileData = self::existsFile($keyFilePath); 
     $encryptedFileData = self::existsFile($encryptedFilePath); 
     $encryptedFileDataLength = strlen($encryptedFileData) - 1; 

     if($encryptedFileData && $keyFileData) { 

      $encryptedFileDataArray = str_split($encryptedFileData); 
      $keyFileDataArray = explode(';', $keyFileData); 

      $decryptedData = NULL; 
      for ($i = 0; $i <= $encryptedFileDataLength; $i++) { 

       $poziciaaktualneho = array_search($encryptedFileDataArray[$i], self::$charSet); 
       $poziciasifrovana = $keyFileDataArray[$i]; 
       if ($poziciasifrovana == $poziciaaktualneho) { 
        $move = $poziciasifrovana; 
       } elseif($poziciasifrovana < 0) { 
        $move = $poziciasifrovana + $poziciaaktualneho; 
       } elseif($poziciasifrovana > 0) { 
        $move = $poziciasifrovana - $poziciaaktualneho; 
       } else { 
        $move = '0'; 
       } 
       $decryptedData .= self::$charSet[$move]; 

      } 

      if(!self::existsFile($decryptedFilePath)) { 
       file_put_contents($decryptedFilePath, base64_decode($decryptedData)); 
       return 'OK'; 
      } else { 
       return 'Decrypted data already exists'; 
      } 

     } 

    } 

    private static function existsFile($filePath) 
    { 
     $fileData = @file_get_contents($filePath); 
     if($fileData) { 
      return $fileData; 
     } 
     return FALSE; 
    } 

} 


$originalFilePath = 'original.jpg'; 
$keyFilePath = 'Otp_Key_' . $originalFilePath; 
$encryptedFilePath = 'Otp_Data_' . $originalFilePath; 
$decryptedFilePath = 'Otp_Decrypted_' . $originalFilePath; 

echo Otp::encryptFile($originalFilePath, $encryptedFilePath, $keyFilePath); 
echo Otp::decryptFile($encryptedFilePath, $keyFilePath, $decryptedFilePath); 

Uyarı: Bu Senaryonu düzeltir ya da ne ile aslen yanlış olduğunu neden bilmiyorum çünkü hiç değilse Kurumsal düzeyde benim çözüm kullanarak tavsiye etmem Bu ve muhtemelen hava geçirmez değildir.

+0

çok çok teşekkürler. bu harika. Şimdi test ediyorum ve mükemmel görünüyor :) – tomdawayhet