2017-03-10 2 views
0

Ich versuche, einfache Verschlüsselung/Entschlüsselung mit Aes in PowerShell arbeiten, aber ich bekomme immer eine Ausnahme, wenn Sie versuchen, die Ausgabe zu entschlüsseln.Ausnahme beim Aufruf von "ReadToEnd" mit "0" Argument (en): "Padding ist ungültig und kann nicht entfernt werden."

Ich bekomme die Ausnahme:

Exception "ReadToEnd" mit "0" Argument Aufruf (e): "Padding ist ungültig und kann nicht entfernt werden kann."

Irgendwelche Ideen?

Function Aes-Encrypt($plainTextBytes){ 

    $key = "vqMcLYelBxefzIAMpO9Q/Q==" 
    $plainText = [System.Text.Encoding]::UTF8.GetBytes($plainTextBytes) 

    #Use the AES cipher and represent it as an object. 
    $AES = New-Object "System.Security.Cryptography.AesManaged" 
    $AES.Mode = [System.Security.Cryptography.CipherMode]::CBC 
    $AES.Padding = [System.Security.Cryptography.PaddingMode]::PKCS7 
    $AES.BlockSize = 128 
    $AES.KeySize = 128 
    $IV = $AES.IV 
    #$AES.Key = $key 

    # Creates a MemoryStream to do the encryption in 
    $ms = new-Object IO.MemoryStream 

    # Creates the new Cryptology Stream --> Outputs to $MS or Memory Stream 
    $cs = new-Object Security.Cryptography.CryptoStream $ms,$AES.CreateEncryptor(),"Write" 

    #Writes the string in the Cryptology Stream 
    $cs.Write($IV, 0, 16) 
    $cs.Write($plainText, 0, $plainText.Length); 
    $cs.FlushFinalBlock(); 

    # Stops the Cryptology Stream 
    $cs.Close() 

    # Stops writing to Memory 
    $ms.Close() 

    # Clears the IV and HASH from memory to prevent memory read attacks 
    $cs.Clear() 

    # Takes the MemoryStream and puts it to an array 
    [byte[]]$rmesult = $ms.ToArray() 
    # return $ms.ToArray() 
    # Converts the array from Base 64 to a string and returns 
    return [Convert]::ToBase64String($rmesult) 

} 

Function Aes-Decrypt($DecryptData){ 

    $key = "vqMcLYelBxefzIAMpO9Q/Q==" 
    #$plainText = [System.Text.Encoding]::UTF8.GetBytes($plainTextBytes) 

    # Create a COM Object for RijndaelManaged Cryptography 
    #$r = new-Object System.Security.Cryptography.RijndaelManaged 

    #Use the AES cipher and represent it as an object. 
    $AES = New-Object "System.Security.Cryptography.AesManaged" 
    $AES.Mode = [System.Security.Cryptography.CipherMode]::CBC 
    $AES.Padding = [System.Security.Cryptography.PaddingMode]::PKCS7 
    $AES.BlockSize = 128 
    $AES.KeySize = 128 
    $IV = $AES.IV 
    #$AES.Key = $key 

    $cipherTextBytes = [Convert]::FromBase64String($DecryptData) 

    # Creates a MemoryStream to do the encryption in 
    $ms = new-Object IO.MemoryStream @(,$cipherTextBytes) 

    # Creates the new Cryptology Stream --> Outputs to $MS or Memory Stream 
    $cs = new-Object Security.Cryptography.CryptoStream $ms,$AES.CreateDecryptor(),"Read" 

    # Read the new decrypted stream 
    $sr = new-Object IO.StreamReader $cs 

    # Return from the function the stream 
    Write-Output $sr.ReadToEnd() 

    # Stops the stream  
    $sr.Close() 

    # Stops the crypology stream 
    $cs.Close() 

    # Stops writing to Memory 
    $ms.Close() 

    $cs.Clear() 

    # Takes the MemoryStream and puts it to an array 
    return $ms.ToArray() 



} 

Antwort

0

Die Botschaft:

"Padding ist ungültig und kann nicht entfernt werden kann."

ist ein allgemeines Symptom der Verschlüsselung nicht funktioniert und kann auftreten, wenn Sie die nicht verwenden denselben Schlüssel und IV sowohl verschlüsseln & entschlüsseln, oder wenn die verschlüsselte Nachricht irgendwie verändert worden sind.

In Ihrem Code scheinen Sie nicht Ihren Schlüssel zu setzen, und Sie generieren keine zufällige IV. Sie scheinen auch die IV im Krypto-Stream zu verschlüsseln, was nicht die Wirkung bringt, die Sie erwarten.

Sie müssen ein zufälliges IV generieren und zusammen mit Ihren verschlüsselten Daten unverschlüsselt weitergeben (es muss nicht geheim sein). Ihr Decrypter muss dann die IV lesen und die AES-Chiffre initialisieren, bevor er mit der Entschlüsselung beginnt.

Verwandte Themen