需要帮助将laravel Crypt转换为C#

前端之家收集整理的这篇文章主要介绍了需要帮助将laravel Crypt转换为C#前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
  1. public static string Encrypt(this string plainText)
  2. {
  3. RijndaelManaged aes = new RijndaelManaged();
  4. aes.KeySize = 256;
  5. aes.BlockSize = 128;
  6. aes.Padding = PaddingMode.Zeros;
  7. aes.Mode = CipherMode.CBC;
  8.  
  9. aes.Key = Encoding.Default.GetBytes(key);
  10. aes.GenerateIV();
  11.  
  12. ICryptoTransform AESEncrypt = aes.CreateEncryptor(aes.Key,aes.IV);
  13. byte[] buffer = Encoding.ASCII.GetBytes(plainText);
  14.  
  15. String encryptedText = Convert.ToBase64String(Encoding.Default.GetBytes(Encoding.Default.GetString(AESEncrypt.TransformFinalBlock(buffer,buffer.Length))));
  16.  
  17. String mac = "";
  18. using (var hmacsha256 = new HMACSHA256(Encoding.Default.GetBytes(key)))
  19. {
  20. hmacsha256.ComputeHash(Encoding.Default.GetBytes(Convert.ToBase64String(aes.IV) + encryptedText));
  21.  
  22. mac = ByteArrToString(hmacsha256.Hash);
  23. }
  24.  
  25. var keyValues = new Dictionary<string,object>
  26. {
  27. { "iv",Convert.ToBase64String(aes.IV) },{ "value",encryptedText },{ "mac",mac },};
  28. JavaScriptSerializer serializer = new JavaScriptSerializer();
  29. //return serializer.Serialize(keyValues);
  30. return Convert.ToBase64String(Encoding.ASCII.GetBytes(serializer.Serialize(keyValues)));
  31. }
  32.  
  33.  
  34.  
  35. public static string Decrypt(this string cipherText)
  36. {
  37. RijndaelManaged aes = new RijndaelManaged();
  38. aes.KeySize = 256;
  39. aes.BlockSize = 128;
  40. aes.Padding = PaddingMode.Zeros;
  41. aes.Mode = CipherMode.CBC;
  42.  
  43. aes.Key = Encoding.Default.GetBytes(key);
  44.  
  45. dynamic payload = GetJsonPayload(cipherText);
  46.  
  47. //return Encoding.Default.GetString(Convert.FromBase64String(cipherText));
  48.  
  49. //cipherText = Convert.ToBase64String(Encoding.Default.GetBytes(payload["value"]));
  50. aes.IV = Convert.FromBase64String(payload["iv"]);
  51.  
  52. ICryptoTransform AESDecrypt = aes.CreateDecryptor(aes.Key,aes.IV);
  53. byte[] buffer = Convert.FromBase64String(payload["value"]);
  54.  
  55. return (Encoding.Default.GetString(AESDecrypt.TransformFinalBlock(buffer,buffer.Length))).ToString();
  56. }

https://github.com/laravel/framework/blob/5.1/src/Illuminate/Encryption/Encrypter.php

我正在使用上面的代码,当我从Laravel解密任何东西时,它都有效.问题是当我从c#加密一个字符串时,我无法在PHP中解密它.

有时在解密文本后面有“值”.加密输出,并在PHP中解密它.

解决方法

将填充更改为PaddingMode.PKCS7可以正常工作!如果其他人仍然需要这个,完整的代码发布在下面.
  1. public static string Encrypt(this string plainText)
  2. {
  3. RijndaelManaged aes = new RijndaelManaged();
  4. aes.KeySize = 256;
  5. aes.BlockSize = 128;
  6. aes.Padding = PaddingMode.PKCS7;
  7. aes.Mode = CipherMode.CBC;
  8.  
  9. aes.Key = Encoding.Default.GetBytes(key);
  10. aes.GenerateIV();
  11.  
  12. ICryptoTransform AESEncrypt = aes.CreateEncryptor(aes.Key,};
  13. JavaScriptSerializer serializer = new JavaScriptSerializer();
  14. //return serializer.Serialize(keyValues);
  15. return Convert.ToBase64String(Encoding.ASCII.GetBytes(serializer.Serialize(keyValues)));
  16. }
  17.  
  18.  
  19.  
  20. public static string Decrypt(this string cipherText)
  21. {
  22. RijndaelManaged aes = new RijndaelManaged();
  23. aes.KeySize = 256;
  24. aes.BlockSize = 128;
  25. aes.Padding = PaddingMode.PKCS7;
  26. aes.Mode = CipherMode.CBC;
  27.  
  28. aes.Key = Encoding.Default.GetBytes(key);
  29.  
  30. dynamic payload = GetJsonPayload(cipherText);
  31.  
  32. //return Encoding.Default.GetString(Convert.FromBase64String(cipherText));
  33.  
  34. //cipherText = Convert.ToBase64String(Encoding.Default.GetBytes(payload["value"]));
  35. aes.IV = Convert.FromBase64String(payload["iv"]);
  36.  
  37. ICryptoTransform AESDecrypt = aes.CreateDecryptor(aes.Key,buffer.Length))).ToString();
  38. }

猜你在找的C#相关文章