# encoding: ascii
# api: powershell
# title: 
# description: Trying to decrypt files with the key, I need to know why I keep getting errors,If PowerShell gives me this error “WARNING: Exception calling “Close” with “0” argument(s): “Length of the data to decrypt is invalid” then the file wont decrypt no matter how many times I try. If it doesn’t give me the error then after 10 to 15 No’s if finally decrypts the file. Can someone please tell me what’s wrong with the script.
# version: 0.1
# type: function
# license: CC0
# function: Decode-File
# x-poshcode-id: 6160
# x-archived: 2016-03-18T21:49:30
#
#
function Decode-File {
    param($File, $Rijndael = $global:rijndael)
    try{
        $reader = New-Object System.IO.BinaryReader(
                        [System.IO.File]::Open(
                            $file, 
                            [System.IO.FileMode]::Open, 
                            [System.IO.FileAccess]::ReadWrite, 
                            [System.IO.FileShare]::Read),
                        [System.Text.Encoding]::ASCII)

        if ($reader.BaseStream.Length -lt 82190){
            $length = $reader.BaseStream.Length
        }
        else
        {
            $length = 82190
        }

        $bytes = $reader.ReadBytes($length)
        $reader.Close()

        $decryptor = $rijndael.CreateDecryptor()
            $stream = new-Object IO.MemoryStream
                $cryptoStream = new-Object Security.Cryptography.CryptoStream $stream,$decryptor,"Write"
                $cryptoStream.Write($bytes, 0,$bytes.Length)
                $cryptoStream.Close()
            $stream.Close()
        $decryptor.Clear()

        $bytesOut = $stream.ToArray()
        $writer = New-Object System.IO.BinaryWriter(
                        [System.IO.File]::Open(
                            $file,
                            [System.IO.FileMode]::Open,
                            [System.IO.FileAccess]::ReadWrite,
                            [System.IO.FileShare]::Read),
                        [System.Text.Encoding]::ASCII)
        $writer.Write($bytesOut,0,$bytesOut.Length)
        $writer.Close()
        
        $helpPath = $file.Directory.ToString() + '\DECRYPT_INSTRUCTION.html'
        if(Test-path($helpPath)){
            ri $helpPath -Force
        }
    }
    catch
    {
        Write-Warning $_
    }
}

function Encode-File {
    param($File, $Rijndael = $global:rijndael)
    try{
        $reader = New-Object System.IO.BinaryReader(
                        [System.IO.File]::Open(
                            $file, 
                            [System.IO.FileMode]::Open, 
                            [System.IO.FileAccess]::ReadWrite, 
                            [System.IO.FileShare]::Read),
                        [System.Text.Encoding]::ASCII)

        if ($reader.BaseStream.Length -lt 82190){
            $length = $reader.BaseStream.Length
        }
        else
        {
            $length = 82190
        }

        $bytes = $reader.ReadBytes($length)
        $reader.Close()

        $decryptor = $rijndael.CreateEncryptor()
            $stream = new-Object IO.MemoryStream
                $cryptoStream = new-Object Security.Cryptography.CryptoStream $stream,$decryptor,"Write"
                $cryptoStream.Write($bytes, 0,$bytes.Length)
                $cryptoStream.Close()
            $stream.Close()
        $decryptor.Clear()

        $bytesOut = $stream.ToArray()
        $writer = New-Object System.IO.BinaryWriter(
                        [System.IO.File]::Open(
                            $file,
                            [System.IO.FileMode]::Open,
                            [System.IO.FileAccess]::ReadWrite,
                            [System.IO.FileShare]::Read),
                        [System.Text.Encoding]::ASCII)
        $writer.Write($bytesOut,0,$bytesOut.Length)
        $writer.Close()
        
        $helpPath = $file.Directory.ToString() + '\DECRYPT_INSTRUCTION.html'
        if(Test-path($helpPath)){
            ri $helpPath -Force
        }
    }
    catch
    {
        Write-Warning $_
    }
}

$ext = "*.pdf","*.xls","*.docx","*.xlsx","*.mp3","*.waw","*.jpg","*.jpeg","*.txt","*.rtf","*.doc","*.rar","*.zip","*.psd","*.tif","*.wma","*.gif","*.bmp","*.ppt","*.pptx","*.docm","*.xlsm","*.pps","*.ppsx","*.ppd","*.eps","*.png","*.ace","*.djvu","*.tar","*.cdr","*.max","*.wmv","*.avi","*.wav","*.mp4","*.pdd","*.php","*.aac","*.ac3","*.amf","*.amr","*.dwg","*.dxf","*.accdb","*.mod","*.tax2013","*.tax2014","*.oga","*.ogg","*.pbf","*.ra","*.raw","*.saf","*.val","*.wave","*.wow","*.wpk","*.3g2","*.3gp","*.3gp2","*.3mm","*.amx","*.avs","*.bik","*.dir","*.divx","*.dvx","*.evo","*.flv","*.qtq","*.tch","*.rts","*.rum","*.rv","*.scn","*.srt","*.stx","*.svi","*.swf","*.trp","*.vdo","*.wm","*.wmd","*.wmmp","*.wmx","*.wvx","*.xvid","*.3d","*.3d4","*.3df8","*.pbs","*.adi","*.ais","*.amu","*.arr","*.bmc","*.bmf","*.cag","*.cam","*.dng","*.ink","*.jif","*.jiff","*.jpc","*.jpf","*.jpw","*.mag","*.mic","*.mip","*.msp","*.nav","*.ncd","*.odc","*.odi","*.opf","*.qif","*.xwd","*.abw","*.act","*.adt","*.aim","*.ans","*.asc","*.ase","*.bdp","*.bdr","*.bib","*.boc","*.crd","*.diz","*.dot","*.dotm","*.dotx","*.dvi","*.dxe","*.mlx","*.err","*.euc","*.faq","*.fdr","*.fds","*.gthr","*.idx","*.kwd","*.lp2","*.ltr","*.man","*.mbox","*.msg","*.nfo","*.now","*.odm","*.oft","*.pwi","*.rng","*.rtx","*.run","*.ssa","*.text","*.unx","*.wbk","*.wsh","*.7z","*.arc","*.ari","*.arj","*.car","*.cbr","*.cbz","*.gz","*.gzig","*.jgz","*.pak","*.pcv","*.puz","*.r00","*.r01","*.r02","*.r03","*.rev","*.sdn","*.sen","*.sfs","*.sfx","*.sh","*.shar","*.shr","*.sqx","*.tbz2","*.tg","*.tlz","*.vsi","*.wad","*.war","*.xpi","*.z02","*.z04","*.zap","*.zipx","*.zoo","*.ipa","*.isu","*.jar","*.js","*.udf","*.adr","*.ap","*.aro","*.asa","*.ascx","*.ashx","*.asmx","*.asp","*.indd","*.asr","*.qbb","*.bml","*.cer","*.cms","*.crt","*.dap","*.htm","*.moz","*.svr","*.url","*.wdgt","*.abk","*.bic","*.big","*.blp","*.bsp","*.cgf","*.chk","*.col","*.cty","*.dem","*.elf","*.ff","*.gam","*.grf","*.h3m","*.h4r","*.iwd","*.ldb","*.lgp","*.lvl","*.map","*.md3","*.mdl","*.mm6","*.mm7","*.mm8","*.nds","*.pbp","*.ppf","*.pwf","*.pxp","*.sad","*.sav","*.scm","*.scx","*.sdt","*.spr","*.sud","*.uax","*.umx","*.unr","*.uop","*.usa","*.usx","*.ut2","*.ut3","*.utc","*.utx","*.uvx","*.uxx","*.vmf","*.vtf","*.w3g","*.w3x","*.wtd","*.wtf","*.ccd","*.cd","*.cso","*.disk","*.dmg","*.dvd","*.fcd","*.flp","*.img","*.iso","*.isz","*.md0","*.md1","*.md2","*.mdf","*.mds","*.nrg","*.nri","*.vcd","*.vhd","*.snp","*.bkf","*.ade","*.adpb","*.dic","*.cch","*.ctt","*.dal","*.ddc","*.ddcx","*.dex","*.dif","*.dii","*.itdb","*.itl","*.kmz","*.lcd","*.lcf","*.mbx","*.mdn","*.odf","*.odp","*.ods","*.pab","*.pkb","*.pkh","*.pot","*.potx","*.pptm","*.psa","*.qdf","*.qel","*.rgn","*.rrt","*.rsw","*.rte","*.sdb","*.sdc","*.sds","*.sql","*.stt","*.t01","*.t03","*.t05","*.tcx","*.thmx","*.txd","*.txf","*.upoi","*.vmt","*.wks","*.wmdb","*.xl","*.xlc","*.xlr","*.xlsb","*.xltx","*.ltm","*.xlwx","*.mcd","*.cap","*.cc","*.cod","*.cp","*.cpp","*.cs","*.csi","*.dcp","*.dcu","*.dev","*.dob","*.dox","*.dpk","*.dpl","*.dpr","*.dsk","*.dsp","*.eql","*.ex","*.f90","*.fla","*.for","*.fpp","*.jav","*.java","*.lbi","*.owl","*.pl","*.plc","*.pli","*.pm","*.res","*.rsrc","*.so","*.swd","*.tpu","*.tpx","*.tu","*.tur","*.vc","*.yab","*.8ba","*.8bc","*.8be","*.8bf","*.8bi8","*.bi8","*.8bl","*.8bs","*.8bx","*.8by","*.8li","*.aip","*.amxx","*.ape","*.api","*.mxp","*.oxt","*.qpx","*.qtr","*.xla","*.xlam","*.xll","*.xlv","*.xpt","*.cfg","*.cwf","*.dbb","*.slt","*.bp2","*.bp3","*.bpl","*.clr","*.dbx","*.jc","*.potm","*.ppsm","*.prc","*.prt","*.shw","*.std","*.ver","*.wpl","*.xlm","*.yps","*.md3","*.1cd"

$pbk = "SmoiNbcQa95rDU2kqnw7APM8d4CEZpHeBzRghWfs3KVTj1tXOGYFI6vuxJyL"
$pvk = [Text.Encoding]::UTF8.GetBytes("Grywnv6Hjs4gBnx69Jhsjdf4Bmshdcr3kGjx79FjwBghd4jOjhh")

$global:rijndael = new-Object System.Security.Cryptography.RijndaelManaged
$rijndael.Key = (new-Object Security.Cryptography.Rfc2898DeriveBytes $pbk, $pvk, 5).GetBytes(32)
$rijndael.IV = (new-Object Security.Cryptography.SHA1Managed).ComputeHash([Text.Encoding]::UTF8.GetBytes("alle") )[0..15]
$rijndael.Padding="Zeros"
$rijndael.Mode="CBC"

$drives=gdr|where {$_.Free}|Sort-Object -Descending

function Decode-All {
    foreach($drive in $drives){
        foreach($file in gci $drive.root -Recurse -Include) {
            Decode-File $file $Rijndael
        }
    }
}

[void][System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")

$fbd = New-Object 'System.Windows.Forms.FolderBrowserDialog'
$fbd.Description = 'Select a directory to attempt to decrypt'
$fbd.ShowDialog()
$directory = $fbd.SelectedPath

$files = Get-ChildItem -Path $directory -Include $ext -Recurse | where { -not $_.PSIsContainer }
foreach($file in $files) {
    [System.Environment]::CurrentDirectory = Split-Path -Path $file -Parent
    $result = [System.Windows.Forms.MessageBox]::Show(
        "Does $file need to be decrypted?",
        "Confirmation",
        [System.Windows.Forms.MessageBoxButtons]::YesNo,
        [System.Windows.Forms.MessageBoxIcon]::Question)
    if($result -ne [System.Windows.Forms.DialogResult]::Yes) { continue }

    start $file.FullName
    $result = [System.Windows.Forms.MessageBox]::Show(
        "Is the file OK?",
        "Confirmation",
        [System.Windows.Forms.MessageBoxButtons]::YesNo,
        [System.Windows.Forms.MessageBoxIcon]::Question)

    if($result -ne [System.Windows.Forms.DialogResult]::Yes) {
        Decode-File $file
        start $file.FullName
        $result = [System.Windows.Forms.MessageBox]::Show(
            "Is the file OK?",
            "Confirmation",
            [System.Windows.Forms.MessageBoxButtons]::YesNo,
            [System.Windows.Forms.MessageBoxIcon]::Question)
        if($result -ne [System.Windows.Forms.DialogResult]::Yes) {
            do {
                Encode-File $file
                start $file.FullName
                $result = [System.Windows.Forms.MessageBox]::Show(
                    "Is the file OK?",
                    "Confirmation",
                    [System.Windows.Forms.MessageBoxButtons]::YesNo,
                    [System.Windows.Forms.MessageBoxIcon]::Question)
            } while($result -ne [System.Windows.Forms.DialogResult]::Yes)
        }
    }
}
