Encrypt.ps1

[string]$global:UnencryptedMark = 'Unencrypted'
[string]$global:EncryptedMark = 'Encrypted'

function New-Credential($username, [SecureString] $password) {
    $credPassword   = ConvertTo-SecureString $PASSWORD -AsPlainText -Force
    $cred = New-Object System.Management.Automation.PSCredential ($username, $credPassword )
    return $cred
}


function Get-SecureKey_Plain {
    param( 
        [Parameter(ValueFromPipeline=$true)]
        $secureKey
    )
    if ($secureKey -is [string]) {
        return $secureKey
    }
    $Ptr = [System.Runtime.InteropServices.Marshal]::SecureStringToCoTaskMemUnicode($secureKey)
    $plainValue = [System.Runtime.InteropServices.Marshal]::PtrToStringUni($Ptr)
    [System.Runtime.InteropServices.Marshal]::ZeroFreeCoTaskMemUnicode($Ptr)
    return $plainValue
}

function Set-SecureKey($environmentVariable, $secureKey ){
        if ($secureKey -is [string]) {
            $secureKey = ConvertTo-SecureString -String $secureKey -AsPlainText -Force
        }
        $storedKey = ConvertFrom-SecureString -SecureString $secureKey
        [Environment]::SetEnvironmentVariable($environmentVariable, $storedKey, [System.EnvironmentVariableTarget]::User)
        [Environment]::SetEnvironmentVariable($environmentVariable, $storedKey, [System.EnvironmentVariableTarget]::Process)
}
function Set-SecureKey:::Test{
    $testKey = 'TestSet-SecureKey'
    $secret = 'AnySecret'
    Set-SecureKey -environmentVariable $testKey -secureKey $secret
    $result = Get-SecureKey -environmentVariable $testKey
    $result | Get-SecureKey_Plain | assert -eq $secret
}
function Set-SecureKey:::Example{
    Set-SecureKey -environmentVariable Corp_Deploy_Key_Standalone -secureKey 'XXXXXXXXXXXXXX'
}


function Get-SecureKey{
    param ( 
        [string]$environmentVariable,
        [string]$prompt
    )

    [string]$storedKey = [Environment]::GetEnvironmentVariable($environmentVariable)

    if ($storedKey -and ( $storedKey.Length -lt 50) ) {
        return $storedKey
    }
    if ($storedKey) {
        try {
            $secureKey = $storedKey | ConvertTo-SecureString
        }
        catch [System.Security.Cryptography.CryptographicException] {
            throw " '$environmentVariable' Environment Variable does not contain a valid encryption key for user '$env:USERDOMAIN\$env:USERName' "
        }
    }
    else {
        if ( -not ( Test-Powershell_ISE ) ) {
            throw "Secure String not found in `$env:$environmentVariable`nRun the script in ISE to specify one or use Set-SecureKey"
        }
        $secureKey = Read-Host -Prompt $prompt -AsSecureString
        Set-SecureKey -environmentVariable $environmentVariable -secureKey $secureKey
    }
    return $secureKey
}


function Set-Content_Encrypt {
   [CmdletBinding()]
    Param(
        [Parameter(ValueFromPipeline=$true)]
        $path,
        [validateLength(5,20)]
        [SecureString]$password,
        [string]$EncryptedMark = $EncryptedMark,
        [string]$UnencryptedMark = $UnencryptedMark
    )
    process {
        $path = Get-Path -path $path
        $filelist = Get-ChildItem -path $path -Filter "*.$UnencryptedMark.*" -re | Get-Path
    
        foreach($file in $filelist) {
            $outFileName = $file -replace $UnencryptedMark, $EncryptedMark
            $outFileName = "$outFileName.zip" | Update-String_Enclose '"'
            if ( test-path $outFileName ) {
                Remove-Item $outFileName -Force
            }
            $file = $file | Update-String_Enclose '"'
            Invoke-Exe 7z a $outFileName "$file" "-p$password" -y | Out-Null #nooutput
        }
    }
}

function Get-Unzip_Path {
    $unzip = (Get-Command unzip -ErrorAction SilentlyContinue).Source
    if (-not $unzip) {
        $unzip = 'C:\Program Files\Git\usr\bin\unzip.exe'
        if(-not (Test-Path $unzip)) {
            throw 'Unzip.exe not found'
        }
    }
    return $unzip
}

function Set-Content_UnEncrypt {
   [CmdletBinding()]
    Param(
        [Parameter(ValueFromPipeline=$true)]
        $path,
        [validateLength(5,20)]
        [SecureString]$password
    )
    begin {
        $unzip = Get-Unzip_Path
    }
    process {
        $path = Get-Path -path $path
        $outFolder = Split-Path $path -Parent
        $path = $path | Update-String_Enclose '"'
        $outFolder = $outFolder | Update-String_Enclose '"'
        #Invoke-Exe 7z x $path "-o$outFolder" "-p$password" -y -NoEcho | Out-Null
        Invoke-Exe $unzip -o -q -P $password $path -d $outFolder | Out-Null
    }
}

function Remove-UnEncrypted {
   [CmdletBinding()]
    Param(
        [Parameter(ValueFromPipeline=$true)]
        $path,
        $EncryptedMark = $EncryptedMark,
        $UnencryptedMark = $UnencryptedMark
    )
    process {
        $toRemove = Get-ChildItem -Path $path -Filter "*.$UnencryptedMark.*" -Recurse
        $toRemove | Remove-Item -Force -Verbose
    }
}

function Set-Content_Encrypt:::Example {
    $EncryptPassword = '1234567890'
    Set-Content_Encrypt -path $src -password $EncryptPassword
    Set-Content_UnEncrypt -path $src -password $EncryptPassword
}