Что такое соответствующий модуль Powershell для библиотеки шифрования PHP с использованием MCRYPT_RIJNDAEL_256?

PHP-код:

mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $to_encrypt, MCRYPT_MODE_ECB);

Мне нужен соответствующий код powershell, который может дать тот же результат.

Я уже пробовал ConvertTo-SecureString/ ConvertFrom-SecureString.

Код Powershell (не создает правильное шифрование):

$api_code = "214e3854a1ec5433ae986d1e5d40c436"
$params = @{"controller" = $controller; "action"= $action;  "all"= $TRUE; }
[Byte[]] $key = $api_code[0..$api_code.length]
$param_object = $params | ConvertTo-SecureString -AsPlainText -Force
$param_aes = $param_object | ConvertFrom-SecureString -key $key

Зашифрованная строка выходит другой. Есть ли параметр, который мне не хватает? Или есть другой модуль?


person kira_111    schedule 23.06.2015    source источник
comment
SecureString не имеет ничего общего с Rijndael/AES. Это вещь Windows, которая использует DPAPI. Вместо этого вам следует рассмотреть использование класса .NET AesManaged.   -  person vcsjones    schedule 23.06.2015
comment
Я вообще ничего не знаю о PowerShell, но, судя по используемой вами переменной $param_aes, вы, кажется, предполагаете, что вам нужно шифрование AES... Однако (и это распространенная ошибка) MCRYPT_RIJNDAEL_256 НЕ AES, только MCRYPT_RIJNDAEL_128.   -  person Narf    schedule 23.06.2015
comment
@Narf Итак ... 256 в MCRYPT_RIJNDAEL_256 относится к размеру блока, а не к длине ключа?   -  person Mathias R. Jessen    schedule 23.06.2015
comment
@MathiasR.Jessen Да, точно. :) Если вам нужен AES-256, просто используйте 256-битный ключ с Rijndael-128.   -  person Narf    schedule 23.06.2015
comment
Спасибо за дискуссию ребята! Очень полезно. Я попробую работать с классом AesManaged. Если у кого-то есть хороший ресурс для реализации MCRYPT_RIJNDAEL_256 с использованием AesManaged, опубликуйте его здесь. На самом деле я нашел это здесь: stackoverflow.com/a/14258619/2970271   -  person kira_111    schedule 23.06.2015
comment
На самом деле приведенная выше ссылка выполняет то же шифрование, что и ConvertTo-SecureString/ ConvertFrom-SecureString. Любая помощь в этом?   -  person kira_111    schedule 23.06.2015
comment
@kira_111 адаптировал эквивалент PowerShell из документации RijndaelManaged в MSDN, опубликовал ответ   -  person Mathias R. Jessen    schedule 23.06.2015
comment
Спасибо большое Матиас!   -  person kira_111    schedule 24.06.2015


Ответы (1)


Как указано в комментариях, SecureString не имеет ничего общего со спецификацией Rijndael, а MCRYPT_RIJNDAEL_256 не совпадает с AES256 (который относится к Rijndael-128 с 256-битным ключом).

Итак, чтобы решить вашу проблему, нам просто нужна функция для шифрования открытого текста в режиме шифрования ECB с использованием Rijndael с размером блока 256.

Для этого очевидным выбором является RijndaelManaged. К счастью, документация MSDN предоставляет базовый, но полностью функциональный пример использования класса RijndaelManaged и CryptoStream для шифрования и расшифровки строк — все, что нам нужно сделать, это переписать его в PowerShell и изменить размер блока и режим шифрования:

function Encrypt-Rijndael256ECB {
    param(
        [byte[]]$Key,
        [string]$Plaintext
    )

    $RijndaelProvider = New-Object -TypeName System.Security.Cryptography.RijndaelManaged

    # Set block size to 256 to imitate MCRYPT_RIJNDAEL_256
    $RijndaelProvider.BlockSize = 256
    # Make sure we use ECB mode, or the generated IV will fuck up the first block upon decryption
    $RijndaelProvider.Mode      = [System.Security.Cryptography.CipherMode]::ECB
    $RijndaelProvider.Key       = $key

    # This object will take care of the actual cryptographic transformation
    $Encryptor = $RijndaelProvider.CreateEncryptor()

    # Set up a memorystream that we can write encrypted data back to
    $EncMemoryStream = New-Object System.IO.MemoryStream
    $EncCryptoStream = New-Object System.Security.Cryptography.CryptoStream -ArgumentList $EncMemoryStream,$Encryptor,"Write"
    $EncStreamWriter = New-Object System.IO.StreamWriter -ArgumentList $EncCryptoStream

    # When we write data back to the CryptoStream, it'll get encrypted and written back to the MemoryStream
    $EncStreamWriter.Write($Plaintext)

    # Close the writer
    $EncStreamWriter.Close()
    # Close the CryptoStream (pads and flushes any data still left in the buffer)
    $EncCryptoStream.Close()
    $EncMemoryStream.Close()

    # Read the encrypted message from the memory stream
    $Cipher     = $EncMemoryStream.ToArray() -as [byte[]]
    $CipherText = [convert]::ToBase64String($Cipher)

    # return base64 encoded encrypted string
    return $CipherText
}

Процесс расшифровки почти такой же, хотя на этот раз нам нужно будет обратить его и прочитать зашифрованный текст обратно через CryptoStream из MemoryStream:

function Decrypt-Rijndael256ECB {
    param(
        [byte[]]$Key,
        [string]$CipherText
    )

    $RijndaelProvider = New-Object -TypeName System.Security.Cryptography.RijndaelManaged

    $RijndaelProvider.BlockSize = 256
    $RijndaelProvider.Mode      = [System.Security.Cryptography.CipherMode]::ECB
    $RijndaelProvider.Key       = $key

    $Decryptor = $RijndaelProvider.CreateDecryptor()

    # Reverse process: Base64Decode first, then populate memory stream with ciphertext and lastly read decrypted data through cryptostream
    $Cipher = [convert]::FromBase64String($CipherText) -as [byte[]]

    $DecMemoryStream = New-Object System.IO.MemoryStream -ArgumentList @(,$Cipher)
    $DecCryptoStream = New-Object System.Security.Cryptography.CryptoStream -ArgumentList $DecMemoryStream,$Decryptor,$([System.Security.Cryptography.CryptoStreamMode]::Read)
    $DecStreamWriter = New-Object System.IO.StreamReader -ArgumentList $DecCryptoStream

    $NewPlainText = $DecStreamWriter.ReadToEnd()

    $DecStreamWriter.Close()
    $DecCryptoStream.Close()
    $DecMemoryStream.Close()

    return $NewPlainText
}

Rijndael256 в действии

person Mathias R. Jessen    schedule 23.06.2015
comment
Большое спасибо, очень ценю ваши усилия! Это абсолютно работает. - person kira_111; 24.06.2015