簡體   English   中英

用PHP解密C#RIJNDAEL編碼的文本

[英]Decrypt C# RIJNDAEL encoded text in PHP

作為授權過程的一部分,我需要解密字符串。

該文檔指定使用以下設置對授權字符串進行加密:

  • 輸入數據的填充: PKCS*7
  • 密碼字節數組的長度為32個字節。 密碼字符串將轉換為UTF-16編碼的字節數組,然后用零填充字節數組,最大長度為32個字節。 較長的密碼將被截斷。

C#示例:

    /// <summary>
    /// Decrypts a string.
    /// </summary>
    /// <param name="content">The string to decrypt.</param>
    /// <param name="password">The password to use.</param>
    /// <returns>The decrypted string.</returns>
    private static string DecryptString(string content, string password)
    {
        Rijndael aes;
        byte[] retVal = null;
        byte[] contentBytes;
        byte[] passwordBytes;
        byte[] ivBytes;

        try
        {
            contentBytes = Convert.FromBase64String(content);

            //Create the password and initial vector bytes
            passwordBytes = new byte[32];
            ivBytes = new byte[16];
            Array.Copy(Encoding.Unicode.GetBytes(password), passwordBytes, Encoding.Unicode.GetBytes(password).Length);
            Array.Copy(passwordBytes, ivBytes, 16);

            //Create the cryptograpy object
            using (aes = Rijndael.Create())
            {
                aes.Key = passwordBytes;
                aes.IV = ivBytes;
                aes.Padding = PaddingMode.PKCS7;

                //Decrypt
                retVal = aes.CreateDecryptor().TransformFinalBlock(contentBytes, 0, contentBytes.Length);
            }
        }
        catch
        {
        }

        return Encoding.Unicode.GetString(retVal);
    }

這里討論了相同的功能,但對於JAVA: 解密C#RIJNDAEL編碼的文本

我嘗試使用以下功能對其進行解密,但結果與預期的不同:

function decrypt($string, $pass){
    $iv = substr($pass, 0, 16);
    $data =  mcrypt_decrypt(MCRYPT_RIJNDAEL_256,
                        $pass,
                        base64_decode($string),
                        MCRYPT_MODE_CBC,
                        $iv);
    $pad = ord($data[strlen($data) - 1]);
    return substr($data, 0, -$pad);
}

加密的字符串"7iTdZnp0DtGnIfwwqY4W/glbLLVZ0+asVLAuz13PzrW0wM6HC7rNuQvcG8JDSehyYeBJARdXHgLo9hRL9sBz3fN5LJ8cro3o0kFnAao2YRU="

應該解密為

"ldYWMFlSbcki6LMl3rkNfGavnt8VqmZd" 

使用密碼"GAT"

我認為這與密碼/ iv /編碼有關

function decrypt($string, $pass)
{
    $encodedPass = mb_convert_encoding($pass, 'utf-16le');
    $encodedPass = substr($encodedPass, 0, 32);
    $encodedPass = str_pad($encodedPass, 32, "\0", STR_PAD_RIGHT);
    $iv = substr($encodedPass, 0, 16);

    $data = mcrypt_decrypt(MCRYPT_RIJNDAEL_128,
                        $encodedPass,
                        base64_decode($string),
                        MCRYPT_MODE_CBC,
                        $iv);
    $pad = ord($data[strlen($data) - 1]);
    return substr($data, 0, -$pad);
}

在PHP中, MCRYPT_RIJNDAEL_128 / MCRYPT_RIJNDAEL_256不是密鑰的大小,而是塊的大小(請參閱https://www.chilkatsoft.com/p/php_aes.asp )。 C#通常使用16個字節的塊,因此MCRYPT_RIJNDAEL_128 密鑰的大小是自動檢測的。 請注意,我已經在方法內部移動了密碼的編碼/大小調整。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM