Шифрование Powershell и PHP расшифровка строки - PullRequest
0 голосов
/ 21 апреля 2020

Попытка отправить информацию из PowerShell на PHP. Приведенный здесь код не для производства, а просто для иллюстрации моей проблемы и обращения за помощью.

При шифровании текста в PowerShell и расшифровке его в PHP я получаю правильный текст обратно, но он отформатирован неправильно , Вот конечный результат:

TestString wrong format

Я полагаю, что это связано с кодированием, но я знаю, что не уверен, и поэтому понятия не имею, как исправить это. Любая подсказка или решение высоко ценится.

Вот два упрощенных теста сценариев.

PowerShell - Шифрование

Function EncryptString {
    Param ([string]$inputStr)

    $inputBytes = [System.Text.Encoding]::UTF8.GetBytes($inputStr)
    $enc = [System.Text.Encoding]::UTF8

    $AES = New-Object System.Security.Cryptography.AESManaged
    $iv = "&9*zS7LY%ZN1thfI"
    $AES.Mode = [System.Security.Cryptography.CipherMode]::CBC
    #$AES.Padding = [System.Security.Cryptography.PaddingMode]::Zeros
    $AES.BlockSize = 128
    $AES.KeySize = 256
    $AES.IV = $enc.GetBytes($iv)
    $AES.Key = $enc.GetBytes($script:passKey)

    $encryptor = $AES.CreateEncryptor()

    $encryptedBytes = $encryptor.TransformFinalBlock($inputBytes, 0, $inputBytes.length)
    $output = [Convert]::ToBase64String($encryptedBytes)

    return $output
}



$passkey = "12345678901234567890123456789012"

$txtTemp = EncryptString "TestString"
Write-host $txtTemp

PHP - Расшифровка

<?php

$iv = "&9*zS7LY%ZN1thfI";
$passKey = "12345678901234567890123456789012";

$txtTemp ="N/l69qyZqPyWRTDWLCQBtA==";

$cipher = "aes-256-cbc";
$returnStr = openssl_decrypt($txtTemp, $cipher, $passKey, $options=OPENSSL_ZERO_PADDING, $iv);
echo $returnStr."<br/>";

?>

Ответы [ 2 ]

0 голосов
/ 21 апреля 2020

То, что вы видите, это байты заполнения из заполнения PKCS7, применяемые классом AesManaged. Это по умолчанию. Это также значение по умолчанию для PHP openssl_encrypt и openssl_decrypt. Так что придерживайтесь значений по умолчанию.

0 голосов
/ 21 апреля 2020

Вы видите байты заполнения, которые используются для того, чтобы сделать входную длину AES кратной размеру блока.

Опция OPENSSL_ZERO_PADDING (с неверным названием) означает «нет заполнения вообще», т.е. добавить нет заполнение перед шифрованием и удаление без заполнения после расшифровки.

Удалите параметр, чтобы openssl_decrypt удалял байты заполнения PKCS # 5/7.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...