2016-04-14 42 views
0

我試圖做一些簡單的庫,用OTP方法在PHP中加密文件。我的問題是解密代碼中的一些字符與原始字符不同。我近乎一週的工作,但沒有結果。 base64字符或編碼/解碼機制有問題嗎?base64在PHP Otp庫

非常感謝您的答覆。

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!您能否顯示您當前的代碼以及您遇到問題的位置,以便我們能夠弄清楚您的問題是什麼? – brimstone

+0

已經在這裏。對不起,我是新來的。 – tomdawayhet

+0

通過OTP你是指一次性密碼? –

回答

0

這個問題似乎當$poziciaaktualneho是通過添加另一個相當於$poziciasifrovana所以如果在線78語句來檢查這一點,而不是設置$move等於$poziciasifrovana我能解決這個問題只發生。下面的腳本應該工作:

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); 

警告:我不建議在企業環境中使用我的解決方案,如果在所有的,因爲我不知道爲什麼這個修復您的腳本或什麼 原來錯它和它很可能不是密封的。

+0

錯誤。太好了。我現在測試它,它看起來很完美:) – tomdawayhet