base64 в библиотеке PHP Otp

Я пытаюсь создать простую библиотеку для шифрования файлов в PHP методом OTP. Моя проблема в том, что некоторые символы в расшифрованном коде отличаются от оригинала. Я работал над этим почти одну неделю, но безрезультатно. Есть ли проблема с символами 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);

0

Решение

Проблема, кажется, происходит только тогда, когда $poziciaaktualneho равно $poziciasifrovana и так, добавив еще один оператор if в строке 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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]