C# и Powershell Encrypt Rijndael Pass на тот же выход - PullRequest
1 голос
/ 17 февраля 2020

У меня есть 3 проекта, и я хочу, чтобы во всех 3 проектах использовались одинаковые методы шифрования и дешифрования. он работает для получения одинакового зашифрованного вывода для c# и php. Но в powershell я получаю небольшой разный вывод. Может кто-нибудь РЕДАКТИРОВАТЬ мой сценарий powershell, чтобы я получал одинаковый вывод во всех 3?

Привет, у меня есть 3 проекта, и я хочу, чтобы во всех 3 проектах использовались одинаковые методы шифрования и дешифрования. он работает для получения одинакового зашифрованного вывода для c# и php. Но в powershell я получаю небольшой разный вывод. Может кто-нибудь РЕДАКТИРОВАТЬ мой сценарий powershell, чтобы я получал одинаковый вывод во всех 3?

c# код:

    public class rijndael
    {
        /*
         * Encrypt method
         * Both Keys and IVs need to be 16 characters encoded in base64. 
         */
        public String AES_encrypt(String Input, String AES_Key, String AES_IV)
        {
            // Create encryptor
            var aes = new System.Security.Cryptography.RijndaelManaged();
            aes.KeySize = 128;
            aes.BlockSize = 128;
            aes.Padding = System.Security.Cryptography.PaddingMode.PKCS7;
            aes.Key = Convert.FromBase64String(AES_Key);
            aes.IV = Convert.FromBase64String(AES_IV);
            var encrypt = aes.CreateEncryptor(aes.Key, aes.IV);

            // Encrypt Input
            byte[] xBuff = null;
            using (var ms = new System.IO.MemoryStream())
            {
                // Convert from UTF-8 String to byte array, write to memory stream and encrypt, then convert to byte array
                using (var cs = new System.Security.Cryptography.CryptoStream(ms, encrypt, System.Security.Cryptography.CryptoStreamMode.Write))
                {
                    byte[] xXml = Encoding.UTF8.GetBytes(Input);
                    cs.Write(xXml, 0, xXml.Length);
                }
                xBuff = ms.ToArray();
            }

            // Convert from byte array to base64 string then return
            String Output = Convert.ToBase64String(xBuff);
            return Output;
        }

        /*
         * Decrypt method
         * Both Keys and IVs need to be 16 characters encoded in base64. 
         */
        public String AES_decrypt(String Input, String AES_Key, String AES_IV)
        {
            // Create decryptor
            System.Security.Cryptography.RijndaelManaged aes = new System.Security.Cryptography.RijndaelManaged();
            aes.KeySize = 128;
            aes.BlockSize = 128;
            aes.Mode = CipherMode.CBC;
            aes.Padding = PaddingMode.PKCS7;
            aes.Key = Convert.FromBase64String(AES_Key);
            aes.IV = Convert.FromBase64String(AES_IV);
            var decrypt = aes.CreateDecryptor();

            // Decrypt Input
            byte[] xBuff = null;
            using (var ms = new MemoryStream())
            {
                // Convert from base64 string to byte array, write to memory stream and decrypt, then convert to byte array.
                using (var cs = new CryptoStream(ms, decrypt, CryptoStreamMode.Write))
                {
                    byte[] xXml = Convert.FromBase64String(Input);
                    cs.Write(xXml, 0, xXml.Length);
                }
                xBuff = ms.ToArray();
            }

            // Convert from byte array to UTF-8 string then return
            String Output = Encoding.UTF8.GetString(xBuff);
            return Output;
        }
    }

            rijndael rijndael_crypt = new rijndael();
            string pass = rijndael_crypt.AES_encrypt("saltkeytesting@ken.vanhuffel@password", Base64Encode("1234567891123456"), Base64Encode("1234567891123456"));

код powershell:

Clear-Host

[Reflection.Assembly]::LoadWithPartialName("System.Security") | Out-Null

function Encrypt-String($stringToEncrypt, $AES_Key, $AES_IV)
{
    # Create a COM Object for RijndaelManaged Cryptography
    $aes = new-Object System.Security.Cryptography.RijndaelManaged
    $aes.KeySize = 128;
    $aes.BlockSize = 128;
    #$aes.Mode = [System.Security.Cryptography.CipherMode]::CBC;
    $aes.Padding = [System.Security.Cryptography.PaddingMode]::PKCS7;
    $aes.Key = [System.Convert]::FromBase64String($AES_Key);
    $aes.IV = [System.Convert]::FromBase64String($AES_IV);
    $encrypt = $aes.CreateEncryptor($aes.Key,$aes.IV);

    [byte[]] $xBuff = $null;
    $ms = new-Object IO.MemoryStream;
    $cs = new-Object Security.Cryptography.CryptoStream $ms,$encrypt,"Write";

    [byte[]]$xXml = [Text.Encoding]::UTF8.GetBytes($stringToEncrypt);

    $cs.Write($xXml, 0, $xXml.Length);
    $xBuff = $ms.ToArray();

    return [Convert]::ToBase64String($xBuff); 
}

$exampleString = "saltkeytesting@ken.vanhuffel@password";


$key_passphrase = "1234567891123456"
$key_bytes = [Text.Encoding]::UTF8.GetBytes($key_passphrase);
$AES_Key =[Convert]::ToBase64String($key_bytes);

$iv = "1234567891123456";
$iv_bytes = [Text.Encoding]::UTF8.GetBytes($iv);
$AES_IV =[Convert]::ToBase64String($iv_bytes);

write-host "String to encrypt is: $exampleString"
$stringToDecrypt = Encrypt-String  $exampleString $AES_Key $AES_IV
write-host "Encrypted is: $stringToDecrypt"

php код:

class Rijndael128Encryptor
{
    /*
     * Adds PKCS7 padding
     */
    private function addpadding($inputstring)
    {
        $blocksize = 16;
        $len = strlen($inputstring);
        $pad = $blocksize - ($len % $blocksize);
        $inputstring .= str_repeat(chr($pad), $pad);
        return $inputstring;
    }

    /*
     * Strips PKCS7 padding
     */
    private function strippadding($inputstring)
    {
        $slast = ord(substr($inputstring, -1));
        $slastc = chr($slast);
        if(preg_match("/$slastc{".$slast."}/", $inputstring)){
            $inputstring = substr($inputstring, 0, strlen($inputstring)-$slast);
            return $inputstring;
        } else {
            return false;
        }
    }

    /*
     * Encrypt method
     * Both Keys and IVs need to be 16 characters encoded in base64. 
     */ 
    public function encrypt($inputstring, $inputkey, $inputiv)
    {
            $key = base64_decode($inputkey);
            $iv = base64_decode($inputiv);
            // Pad text and encrypt
            $padded_string = $this->addpadding($inputstring);
            $encrypted_string = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $padded_string, MCRYPT_MODE_CBC, $iv);
            // Encode to base64 and return
            return base64_encode($encrypted_string);
    }

    /*
     * Decrypt method
     * Both Keys and IVs need to be 16 characters encoded in base64. 
     */ 
    public function decrypt($inputstring, $inputkey, $inputiv)
    {
            $key = base64_decode($inputkey);
            $iv = base64_decode($inputiv);
            // Decode from base64 and decrypt
            $decoded_string = base64_decode($inputstring);
            $decrypted_string = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $decoded_string, MCRYPT_MODE_CBC, $iv);
            // Unpad text and return
            return $this->strippadding($decrypted_string);
    }
}

$encrypter = new Rijndael128Encryptor;
$encrypt_me = $encrypter->encrypt("saltkeytesting@ken.vanhuffel@password", base64_encode("1234567891123456"), base64_encode("1234567891123456"));

echo $encrypt_me;
...