AES-шифрование файлов с помощью PowerShell - PullRequest
0 голосов
/ 25 октября 2018

Мне удалось AES успешно зашифровать файлы, используя этот скрипт здесь , используя Windows 10, PowerShell версии 5.1.

Когда я пытался запустить его в Windows 7, PowerShell v2.0, я получаю сообщение об ошибке:

New-CryptographyKey : You cannot call a method on a null-valued expression.
At C:\Users\IEUser\Desktop\enc.ps1:399 char:27
+ $key = New-CryptographyKey <<<<  -AsPlainText
    + CategoryInfo          : NotSpecified: (:) [Write-Error], WriteErrorException
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,New-CryptographyKey

Protect-File : Cannot bind argument to parameter 'KeyAsPlainText' because
it is an empty string.
At C:\Users\IEUser\Desktop\enc.ps1:401 char:77
+ Protect-File -FileName "$env:userprofile/Desktop/secret.txt" -KeyAsPlainText <<<<  $key
    + CategoryInfo          : InvalidData: (:) [Protect-File], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationErrorEmptyStringNotAllowed,Protect-File

Как мне заставить его работать?Или есть другое кросс-совместимое решение для шифрования файлов AES с использованием Powershell?

EDIT:

Возможно, я нашел решение с openSSL, но я все еще пробовал решение @Mike Twc, получил этовывод:

PS C:\Users\IEUser\Desktop> .\bouncy.ps1

TEST:

message: Some secret message
key: 9JODwRWWHp6+uACUiydFXNXPmWDHbcObhgqR/cvZ9zg=
IV (base64): U29tZV9QYXNzd29yZA==
IV (utf8): Some_Password
message bytes: 83 111 109 101 32 115 101 99 114 101 116 32 109 101 115 115 97 10
3 101
encrypted message bytes: 178 172 14 98 228 38 129 136 217 25 129 96 46 177 75 62
 50 5 190 46 51 108 81 38 90 74 197 166 44 96 120 252
encrypted message: sqwOYuQmgYjZGYFgLrFLPjIFvi4zbFEmWkrFpixgePw=
decrypted bytes: 83 111 109 101 32 115 101 99 114 101 116 32 109 101 115 115 97
103 101 0 0 0 0 0 0 0 0 0 0 0 0 0
decrypted message: Some secret message

Ответы [ 3 ]

0 голосов
/ 25 октября 2018

Исходя из информации об исходном коде, с которым вы связываетесь, и который, как вы говорите, используете, он не был разработан с учетом PowerShell v2.Таким образом, тот факт, что это происходит с ошибкой, следует ожидать, потому что, если память служит, Export-ModuleMember не был представлен до PowerShellv3.

Get-Command -Name Export-moduleMember

CommandType     Name                  Version    Source
-----------     ----                  -------    ------
Cmdlet          Export-ModuleMember   3.0.0.0    Microsoft.PowerShell.Core

У меня нет ни одного PowerShellv2 где-либо в моей среде, чтобы святой проверить, хотя.

Итак, что касается этого ..

Как мне заставить это работать?

.. обновить версию PowerShell до 3 - 5x.

Что касается этого ...

другое кросс-совместимое решение для шифрования файлов AES с использованием Powershell?

Единственная кроссплатформенная версия даже PowerShell - этоPowerShell Core (PowerShell v6).Если вы имеете в виду кроссплатформенную версию этого модуля, то автор должен доставить или написать ее.

Если вы запрашиваете универсальный кроссплатформенный инструмент AES (даже ссылка, на которую вы указываете,Только для Windows - так что, если вам нужна кроссплатформенная Win / OSX / Linux, это не сработает в любом случае), это на самом деле не вопрос PowerShell, а рекомендация программного обеспечения, и для этих вопросов есть отдельная доска. Рекомендации по программному обеспечению StackExchange , но вы можете использовать PGP при использовании PowerShell.

Если вы говорите о версии шифрования файлов AES, которая работает во всех версиях Windows PowerShell, вам необходимо использоватьпространство имен .Net для этого.В частности, классы NET FileStream и CryptoStream для шифрования всего файла с помощью AES в качестве демонстрации с помощью этой загрузки скрипта.

Примеры шифрования PowerShell 5 примеров различных методов, которые можно использовать для обеспечения безопасностишифровать (и в большинстве случаев обмениваться) секретные данные с помощью PowerShell.

Конкретно Пример 3

Или с помощью этого модуля.

Обмен зашифрованными данными между пользователями и компьютерамис PowerShell

Прикрепленный zip-файл содержит модуль, который позволяет легко шифровать данные с помощью PowerShell таким образом, чтобы его могли расшифровать другие авторизованные пользователи на любом компьютере.Это достигается за счет использования цифровых сертификатов.

0 голосов
/ 25 октября 2018

Вы можете попробовать использовать библиотеку BouncyCastle.Ниже приведена реализация шифрования / дешифрования AES с этой библиотекой.Он работал на моем конце в режиме версии 2.

Загрузите последнюю скомпилированную сборку (BouncyCastle.Crypto.dll) отсюда: https://www.bouncycastle.org/csharp/index.html

Извлеките эту dll в любую папку (скажем,C: \ temp), щелкните по нему правой кнопкой мыши и выберите «Разблокировать»

Запустите этот код:

Add-Type -path "C:\stack\BouncyCastle.Crypto.dll"

$secRandom =  new-object Org.BouncyCastle.Security.SecureRandom

$message = "Some secret message"
$messageBytes = [System.Text.Encoding]::UTF8.GetBytes($message)

# if using files do this: 
# $messageBytes = [System.IO.File]::ReadAllBytes("C:\stack\out.txt")

#==== Key generation =====#

$keyBytes = New-Object byte[] 32
$secRandom.NextBytes($keyBytes) 
#$generator = [Org.BouncyCastle.Security.GeneratorUtilities]::GetKeyGenerator("AES")
$generator = New-Object Org.BouncyCastle.Crypto.CipherKeyGenerator 
$keyGenParam = new-object Org.BouncyCastle.Crypto.KeyGenerationParameters $keyBytes, 256
$generator.Init($keyGenParam)
$key = $generator.GenerateKey()
#or retreive from base64 string:
$key = [System.Convert]::FromBase64String("9JODwRWWHp6+uACUiydFXNXPmWDHbcObhgqR/cvZ9zg=")


#==== initialization vector (optional) =====#
#IV is a byte array, should be same as AES block size. By default 128 bit or 16 bytes (or less)

$IV = New-Object byte[] 16  
# below are some random IVs to play around, if IV parameter is not provided by user just keep it is array of 0s
$secRandom.NextBytes($IV) | Out-Null  #random generated 16 bytes
$IV = [System.Text.Encoding]::UTF8.GetBytes("Some_Password") #or use some random phrase


#==== Cipher set up =====#
#specify cipher type (typically CFB or CBC) and padding (use NOPADDING to skip). Check all possible values: 
#https://github.com/neoeinstein/bouncycastle/blob/master/crypto/src/security/CipherUtilities.cs

$cipher = [Org.BouncyCastle.Security.CipherUtilities]::GetCipher("AES/CFB/PKCS7")
$aesKeyParam = [Org.BouncyCastle.Security.ParameterUtilities]::CreateKeyParameter("AES", $key)
$keyAndIVparam = New-Object Org.BouncyCastle.Crypto.Parameters.ParametersWithIV $aesKeyParam, $IV


#==== Encrypt  =====#
#$cipher.Init($true,$aesKeyParam) 
$cipher.Init($true,$keyAndIVparam)
$dataSize = $cipher.GetOutputSize($messageBytes.Length)
$encMessageBytes = New-Object byte[]  $dataSize
$len = $cipher.ProcessBytes($messageBytes , 0, $messageBytes.Length, $encMessageBytes, 0)
$cipher.DoFinal($encMessageBytes, $len) | Out-Null

$encMessage = [System.Convert]::ToBase64String($encMessageBytes)

#if using files
#[System.IO.File]::WriteAllText("C:\stack\out.txt.aes", $encMessage)
#$encMessageBytes = [System.Convert]::FromBase64String([System.IO.File]::ReadAllText("C:\stack\out.txt.aes"))

#==== Decrypt =====#
#$cipher.Init($false,$aesKeyParam)
$cipher.Init($false,$keyAndIVparam)
$dataSize = $cipher.GetOutputSize($encMessageBytes.Length)
$decMessageBytes = New-Object byte[]  $dataSize
$len = $cipher.ProcessBytes($encMessageBytes , 0, $encMessageBytes.Length, $decMessageBytes, 0)
$cipher.DoFinal($decMessageBytes, $len) | Out-Null

$decMessage = [System.Text.Encoding]::UTF8.GetString($decMessageBytes).Trim([char]0)

#==== TEST =====#
Write-Host "`nTEST:`n"
Write-Host "message: $message"
Write-Host "key: $([System.Convert]::ToBase64String($key))"
Write-Host "IV (base64): $([System.Convert]::ToBase64String($IV))"
Write-Host "IV (utf8): $([System.Text.Encoding]::UTF8.GetString($IV))"
Write-Host "message bytes: $messageBytes"
Write-Host "encrypted message bytes: $encMessageBytes"
Write-Host "encrypted message: $encMessage"
Write-Host "decrypted bytes: $decMessageBytes"
Write-Host "decrypted message: $decMessage"
0 голосов
/ 25 октября 2018

Модуль, который вы используете, требует как минимум PowerShell v3, иначе оператор

$Crypto = [System.Security.Cryptography.SymmetricAlgorithm]::Create($Algorithm)

в функции, которую вы пытаетесь вызвать, не создаст объект алгоритма, что, в свою очередь, вызовет

$Crypto.GenerateKey()

завершится ошибкой с обнаруженной вами ошибкой.

Обновите систему Windows 7 до PowerShell v3 или новее.

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