Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vue.js/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 解密.net中laravel生成错误生成的AES。填充无效,无法删除_Php_.net_Laravel_Encryption_Aes - Fatal编程技术网

Php 解密.net中laravel生成错误生成的AES。填充无效,无法删除

Php 解密.net中laravel生成错误生成的AES。填充无效,无法删除,php,.net,laravel,encryption,aes,Php,.net,Laravel,Encryption,Aes,我在php中使用AES加密,并将数据发送到.net Padding is invalid and cannot be removed 当我在php进行解密时,它提供了完美的输出。我确信解密时存在一些配置问题。我已经尝试过填充模式。零 我的php代码类如下所示: $inputKey = env('SALT_KEY', ''); $blockSize = 256; $aes = new AES($inputText, $inputKey, $blockSize); $enc

我在php中使用AES加密,并将数据发送到.net

Padding is invalid and cannot be removed
当我在php进行解密时,它提供了完美的输出。我确信解密时存在一些配置问题。我已经尝试过填充模式。零

我的php代码类如下所示:

$inputKey = env('SALT_KEY', '');
    $blockSize = 256;
    $aes = new AES($inputText, $inputKey, $blockSize);
    $enc = $aes->encrypt();
    $aes->setData($enc);
    $dec=$aes->decrypt();
    echo "After encryption: ".$enc."<br/>";
    echo "After decryption: ".$dec."<br/>";
<?php
/**
Aes encryption
*/
namespace App;

class AES {
   
    protected $key;
    protected $data;
    protected $method;
    /**
     * Available OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING
     *
     * @var type $options
     */
    protected $options = 0;
    /**
     * 
     * @param type $data
     * @param type $key
     * @param type $blockSize
     * @param type $mode
     */
    function __construct($data = null, $key = null, $blockSize = null, $mode = 'CBC') {
        $this->setData($data);
        $this->setKey($key);
        $this->setMethode($blockSize, $mode);
    }
    /**
     * 
     * @param type $data
     */
    public function setData($data) {
        $this->data = $data;
    }
    /**
     * 
     * @param type $key
     */
    public function setKey($key) {
        $this->key = $key;
    }
    /**
     * CBC 128 192 256 
      CBC-HMAC-SHA1 128 256
      CBC-HMAC-SHA256 128 256
      CFB 128 192 256
      CFB1 128 192 256
      CFB8 128 192 256
      CTR 128 192 256
      ECB 128 192 256
      OFB 128 192 256
      XTS 128 256
     * @param type $blockSize
     * @param type $mode
     */
    public function setMethode($blockSize, $mode = 'CBC') {
        if($blockSize==192 && in_array($mode, array('CBC-HMAC-SHA1','CBC-HMAC-SHA256','XTS'))){
            $this->method=null;
             throw new Exception('Invlid block size and mode combination!');
        }
        $this->method = 'AES-' . $blockSize . '-' . $mode;
    }
    /**
     * 
     * @return boolean
     */
    public function validateParams() {
        if ($this->data != null &&
                $this->method != null ) {
            return true;
        } else {
            return FALSE;
        }
    }
//it must be the same when you encrypt and decrypt
     protected function getIV() {
        return '1234567890123456';
         //return mcrypt_create_iv(mcrypt_get_iv_size($this->cipher, $this->mode), MCRYPT_RAND);
        // return openssl_random_pseudo_bytes(openssl_cipher_iv_length($this->method));
     }
    /**
     * @return type
     * @throws Exception
     */
    public function encrypt() {
        if ($this->validateParams()) { 
            
            return trim(openssl_encrypt($this->data, $this->method, $this->key, $this->options,$this->getIV()));
        } else {
            throw new Exception('Invlid params!');
        }
    }
    /**
     * 
     * @return type
     * @throws Exception
     */
    public function decrypt() {
        if ($this->validateParams()) {
           $ret=openssl_decrypt($this->data, $this->method, $this->key, $this->options,$this->getIV());
          
           return   trim($ret); 
        } else {
            throw new Exception('Invlid params!');
        }
    }
}
我的.net代码是:

using System;
using System.IO;
using System.Text;
using System.Security.Cryptography;
namespace RijndaelManaged_Example
{
    class RijndaelExample
    {
        public static void Main()
        {
            try
            {
// Create a new instance of the RijndaelManaged
                // class.  This generates a new key and initialization
                // vector (IV).
                using (RijndaelManaged myRijndael = new RijndaelManaged())
                {
                    // Decrypt the bytes to a string.
                    //string encrpted = Encrypt(original, "2B4**************9", "1234567890123456");
                    //Display the original data and the decrypted data.
                    //Console.WriteLine("Original:   {0}", encrpted);
                    string roundtrip = DecryptStringFromBytes("6vRnKJXRD8eSJEK2************", "2B*******************", "1234567890123456");
                    Console.WriteLine("Round Trip: {0}", roundtrip);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("Error: {0}", e.Message);
            }
        }
        public static string Encrypt(string prm_text_to_encrypt, string prm_key, string prm_iv)
        {
            var sToEncrypt = prm_text_to_encrypt;
            var rj = new RijndaelManaged()
            {
                //Padding = PaddingMode.PKCS7,
                //Mode = CipherMode.CBC,
               // KeySize = 128,
                //BlockSize = 128,
                //FeedbackSize = 256
            };
            var key = Encoding.ASCII.GetBytes(prm_key);
            var IV = Encoding.ASCII.GetBytes(prm_iv);
            //var key = Convert.FromBase64String(prm_key);
            //var IV = Convert.FromBase64String(prm_iv);
            var encryptor = rj.CreateEncryptor(key, IV);
            var msEncrypt = new MemoryStream();
            var csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write);
            var toEncrypt = Encoding.ASCII.GetBytes(sToEncrypt);
            csEncrypt.Write(toEncrypt, 0, toEncrypt.Length);
            csEncrypt.FlushFinalBlock();
            var encrypted = msEncrypt.ToArray();
            return (Convert.ToBase64String(encrypted));
        }
        static string DecryptStringFromBytes(string TextToDecrypt, string prm_key, string prm_iv)
        {
            var sEncryptedString = TextToDecrypt;
            var rj = new RijndaelManaged()
            {
                //Padding = PaddingMode.Zeros,
               // Mode = CipherMode.CBC,
               // KeySize = 128,
              //  BlockSize = 128,
              //  FeedbackSize = 128
            };
            var key = Encoding.ASCII.GetBytes(prm_key);
            var IV = Encoding.ASCII.GetBytes(prm_iv);
            //var key = Convert.FromBase64String(prm_key);
            //var IV = Convert.FromBase64String(prm_iv);
            var decryptor = rj.CreateDecryptor(key, IV);
            var sEncrypted = Convert.FromBase64String(sEncryptedString);
            var fromEncrypt = new byte[sEncrypted.Length];
            var msDecrypt = new MemoryStream(sEncrypted);
            var csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read);
            csDecrypt.Read(fromEncrypt, 0, fromEncrypt.Length);
            return (Encoding.ASCII.GetString(fromEncrypt));
        }
    }
}

我需要与.net中的laravel/php中生成的数据相同的数据。

我无法重现该问题。因此,您应该发布完整的示例数据:两个代码的明文、密钥、IV和密文。在任何情况下都需要优化,例如,使用哪种机制将随机生成的IV传递给接收者(我假设静态IV仅用于测试目的)?在PHP代码中,
$blockSize
显然表示密钥大小(因为
$this->method='AES-'.$blockSize.-'.$mode
),这非常容易混淆(AES的块大小始终为128位)。等
using System;
using System.IO;
using System.Text;
using System.Security.Cryptography;
namespace RijndaelManaged_Example
{
    class RijndaelExample
    {
        public static void Main()
        {
            try
            {
// Create a new instance of the RijndaelManaged
                // class.  This generates a new key and initialization
                // vector (IV).
                using (RijndaelManaged myRijndael = new RijndaelManaged())
                {
                    // Decrypt the bytes to a string.
                    //string encrpted = Encrypt(original, "2B4**************9", "1234567890123456");
                    //Display the original data and the decrypted data.
                    //Console.WriteLine("Original:   {0}", encrpted);
                    string roundtrip = DecryptStringFromBytes("6vRnKJXRD8eSJEK2************", "2B*******************", "1234567890123456");
                    Console.WriteLine("Round Trip: {0}", roundtrip);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("Error: {0}", e.Message);
            }
        }
        public static string Encrypt(string prm_text_to_encrypt, string prm_key, string prm_iv)
        {
            var sToEncrypt = prm_text_to_encrypt;
            var rj = new RijndaelManaged()
            {
                //Padding = PaddingMode.PKCS7,
                //Mode = CipherMode.CBC,
               // KeySize = 128,
                //BlockSize = 128,
                //FeedbackSize = 256
            };
            var key = Encoding.ASCII.GetBytes(prm_key);
            var IV = Encoding.ASCII.GetBytes(prm_iv);
            //var key = Convert.FromBase64String(prm_key);
            //var IV = Convert.FromBase64String(prm_iv);
            var encryptor = rj.CreateEncryptor(key, IV);
            var msEncrypt = new MemoryStream();
            var csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write);
            var toEncrypt = Encoding.ASCII.GetBytes(sToEncrypt);
            csEncrypt.Write(toEncrypt, 0, toEncrypt.Length);
            csEncrypt.FlushFinalBlock();
            var encrypted = msEncrypt.ToArray();
            return (Convert.ToBase64String(encrypted));
        }
        static string DecryptStringFromBytes(string TextToDecrypt, string prm_key, string prm_iv)
        {
            var sEncryptedString = TextToDecrypt;
            var rj = new RijndaelManaged()
            {
                //Padding = PaddingMode.Zeros,
               // Mode = CipherMode.CBC,
               // KeySize = 128,
              //  BlockSize = 128,
              //  FeedbackSize = 128
            };
            var key = Encoding.ASCII.GetBytes(prm_key);
            var IV = Encoding.ASCII.GetBytes(prm_iv);
            //var key = Convert.FromBase64String(prm_key);
            //var IV = Convert.FromBase64String(prm_iv);
            var decryptor = rj.CreateDecryptor(key, IV);
            var sEncrypted = Convert.FromBase64String(sEncryptedString);
            var fromEncrypt = new byte[sEncrypted.Length];
            var msDecrypt = new MemoryStream(sEncrypted);
            var csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read);
            csDecrypt.Read(fromEncrypt, 0, fromEncrypt.Length);
            return (Encoding.ASCII.GetString(fromEncrypt));
        }
    }
}