2016-04-14 40 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