Php 解密.net中laravel生成错误生成的AES。填充无效,无法删除
我在php中使用AES加密,并将数据发送到.netPhp 解密.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
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));
}
}
}