PHP Otp Library中的base64

问题描述 投票:0回答:1

我试图用OTP方法制作一些简单的库来加密PHP中的文件。我的问题是解密代码中的一些字符与原始字符不同。我工作了差不多一个星期但没有结果。 base64字符或编码/解码机制有问题吗?

非常感谢答案。

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);
php base64 otp
1个回答
0
投票

问题似乎只发生在$poziciaaktualneho等于$poziciasifrovana时,所以通过在第78行添加另一个if语句来检查这一点,而是将$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);

警告:我不建议在企业设置中使用我的解决方案,因为我不知道为什么这会修复你的脚本或者它最初的错误并且它很可能不是紧密的。

© www.soinside.com 2019 - 2024. All rights reserved.