C# 拉维尔';使用C语言进行加密和解密#

C# 拉维尔';使用C语言进行加密和解密#,c#,laravel,encryption,C#,Laravel,Encryption,我试图用C语言对来自和到Laravel的数据进行加密和解密# 我试过使用。我已经修改了它,在拉威尔更新后可以正常工作。 然而,当我试图解密Laravel中的C#字符串时,我收到了“MAC无效”异常 我不知道C端MAC的计算有什么问题 关于如何解决这个问题有什么想法吗 C#代码: 使用系统; 使用系统文本; 使用System.Security.Cryptography; 使用System.Web.Script.Serialization; 使用System.Collections.Generic;

我试图用C语言对来自和到Laravel的数据进行加密和解密#

我试过使用。我已经修改了它,在拉威尔更新后可以正常工作。 然而,当我试图解密Laravel中的C#字符串时,我收到了“MAC无效”异常

我不知道C端MAC的计算有什么问题

关于如何解决这个问题有什么想法吗

C#代码:

使用系统;
使用系统文本;
使用System.Security.Cryptography;
使用System.Web.Script.Serialization;
使用System.Collections.Generic;
命名空间Aes256CbcEncrypterApp
{
类主类
{
公共静态void Main(字符串[]args)
{
控制台.WriteLine(“你好,世界!”);
//示例加密密钥。
byte[]Key=Convert.FromBase64String(“My44CharKeyBase64”);
//要加密和解密的示例文本。
string Text=“这里有一些要加密的文本!”;
//通过Aes256CbcEncrypter类对示例文本进行加密和解密。
字符串加密=Aes256CbcEncrypter.Encrypt(文本,密钥);
解密字符串=Aes256CbcEncrypter.Decrypt(加密,密钥);
//显示加密和解密的数据以及使用的密钥。
WriteLine(“原件:{0}”,文本);
WriteLine(“Key:{0}”,Convert.ToBase64String(Key));
WriteLine(“加密:{0}”,加密);
WriteLine(“已解密:{0}”,已解密);
Console.ReadKey();
}
}
/**
*使用密码AES-256-CBC加密和解密字符串的类。
*/
AES256CBC类密码器
{
私有静态只读编码编码=Encoding.UTF8;
公共静态字符串加密(字符串明文,字节[]密钥)
{
尝试
{
RijndaelManaged aes=新的RijndaelManaged();
aes.KeySize=256;
aes.BlockSize=128;
aes.Padding=PaddingMode.PKCS7;
aes.Mode=CipherMode.CBC;
aes.Key=Key;
aes.GenerateIV();
ICryptoTransform AESEncrypt=aes.CreateEncryptor(aes.Key,aes.IV);
byte[]buffer=encoding.GetBytes(纯文本);
string encryptedText=Convert.ToBase64String(AESEncrypt.TransformFinalBlock(buffer,0,buffer.Length));
字符串mac=“”;
mac=BitConverter.ToString(HmacSHA256(Convert.ToBase64String(aes.IV)+encryptedText,key)).Replace(“-”,”).ToLower();
var keyValues=新字典
{
{“iv”,Convert.ToBase64String(aes.iv)},
{“值”,encryptedText},
{“mac”,mac},
};
JavaScriptSerializer serializer=新的JavaScriptSerializer();
返回Convert.ToBase64String(encoding.GetBytes(serializer.Serialize(keyValues));
}
捕获(例外e)
{
抛出新异常(“加密错误:+e.Message”);
}
}
公共静态字符串解密(字符串明文,字节[]密钥)
{
尝试
{
RijndaelManaged aes=新的RijndaelManaged();
aes.KeySize=256;
aes.BlockSize=128;
aes.Padding=PaddingMode.PKCS7;
aes.Mode=CipherMode.CBC;
aes.Key=Key;
//基64解码
字节[]base64Decoded=Convert.FromBase64String(纯文本);
string base64DecodedStr=encoding.GetString(base64Decoded);
//JSON解码base64Str
JavaScriptSerializer serializer=新的JavaScriptSerializer();
var payload=serializer.Deserialize(base64DecodedStr);
aes.IV=转换.FromBase64String(有效负载[“IV”]);
ICryptoTransform aesdepcrypt=aes.CreateDecryptor(aes.Key,aes.IV);
字节[]缓冲区=Convert.FromBase64String(有效负载[“值”]);
返回encoding.GetString(AESDefcrypt.TransformFinalBlock(buffer,0,buffer.Length));
}
捕获(例外e)
{
抛出新异常(“解密错误:+e.Message”);
}
}
静态字节[]HmacSHA256(字符串数据,字节[]键)
{
使用(HMACSHA256 hmac=新的HMACSHA256(键))
{
返回hmac.ComputeHash(encoding.GetBytes(data));
}
}
}
}

在挖掘、调试、查找Laravel所做的任何更新并将其与上面的C代码进行比较后,没有任何重大差异,但问题在Laravel方面,通过输入解决了

请记住在加密和解密以获取原始有效负载而非序列化有效负载时禁用有效负载序列化,因为默认情况下已启用序列化

echo encrypt("test", false);
echo decrypt("base64EncryptedString", false)

如果encrypt()或decrypt()引发更多异常,请尝试以匿名模式打开浏览器或删除浏览器缓存。

您是否准确复制了链接中的代码?因为它通过调用
encoding.GetBytes
来获取密钥的字节。在本例中,
encoding
System.Text.encoding.UTF8
。这对我来说真的很奇怪。通常,我希望您在这种情况下使用
Convert.FromBase64String
获取密钥。特别是因为传入的字符串是Base64编码的……是的,我使用您提到的内容对其进行了修改,使其能够正常工作。但即使在那之后,我仍然收到MAC无效消息。@JoshuaRobinson我在修改代码后编辑了这个问题。
php artisan config:clear
php artisan cache:clear
php artisan view:clear
php artisan route:clear
composer dump-autoload
echo encrypt("test", false);
echo decrypt("base64EncryptedString", false)