zoukankan      html  css  js  c++  java
  • C#/PHP Compatible Encryption (AES256) ZZ

    Finding a way to encrypt messages in C# and decrypting them in PHP or vice versa seems to be a "challenge" for many users. I wrote this tutorial to provide some help with this: below, you can find how to encrypt / decrypt messages in C# / PHP using AES256 with CBC mode.

     

    1.Basic Information



    AES 256 with CBC mode requires 3 values: the message, a key (32 bytes long) and an initialization vector (IV). Note that you must use the same IV when encrypting / decrypting a message: otherwise the message is lost. Sending the IV with the message is perfectly safe but it always has to be a random value. Since it has a fixed size, I always place the IV at the end of the encrypted text.

    The encrypted messages should be encoded using base64 before being sent.

    structure

    Encryption steps:

    • encrypt the text
    • add the IV at the end
    • encode everything (base64)



    Decryption steps:

    • decode the message
    • get & remove the IV
    • proceed to decypt


    Ok, enough talking, let's see some code...

    2.PHP Encryption/Decryption Code



    PHP accepts keys that are not 32 bytes long and simply extends them to the correct length. Well...C# doesn't, so you'll have to use a key that is 32 bytes long.

    Encryption

    1. function encrypt($text, $pkey)
    2. {
    3. $key = $pkey;
    4. $IV = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC), MCRYPT_RAND);
    5. return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $text, MCRYPT_MODE_CBC, $IV)."-[--IV-[-".$IV);
    6. }



    Decryption

    1. function decrypt($text, $pkey)
    2. {
    3. $key = $pkey;
    4. $text = base64_decode($text);
    5. $IV = substr($text, strrpos($text, "-[--IV-[-") + 9);
    6. $text = str_replace("-[--IV-[-".$IV, "", $text);
    7. return rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $text, MCRYPT_MODE_CBC, $IV), "");
    8. }



    3.C# Encryption/Decryption Code



    As I said before, C# doesn't accept keys that aren't 32 bytes long - it will throw an error. Also, many people get tricked here because of the encoding (most of the times you have to use Encoding.Default).

    Encryption

    1. public static string EncryptMessage(byte[] text, string key)
    2. {
    3. RijndaelManaged aes = new RijndaelManaged();
    4. aes.KeySize = 256;
    5. aes.BlockSize = 256;
    6. aes.Padding = PaddingMode.Zeros;
    7. aes.Mode = CipherMode.CBC;
    8. aes.Key = Encoding.Default.GetBytes(key);
    9. aes.GenerateIV();
    10. string IV = ("-[--IV-[-" + Encoding.Default.GetString(aes.IV));
    11. ICryptoTransform AESEncrypt = aes.CreateEncryptor(aes.Key, aes.IV);
    12. byte[] buffer = text;
    13. return
    14. Convert.ToBase64String(Encoding.Default.GetBytes(Encoding.Default.GetString(AESEncrypt.TransformFinalBlock(buffer, 0, buffer.Length)) + IV));
    15. }


     

    Decryption

      1. public static string DecryptMessage(string text, string key)
      2. {
      3. RijndaelManaged aes = new RijndaelManaged();
      4. aes.KeySize = 256;
      5. aes.BlockSize = 256;
      6. aes.Padding = PaddingMode.Zeros;
      7. aes.Mode = CipherMode.CBC;
      8. aes.Key = Encoding.Default.GetBytes(key);
      9. text = Encoding.Default.GetString(Convert.FromBase64String(text));
      10. string IV = text;
      11. IV = IV.Substring(IV.IndexOf("-[--IV-[-") + 9);
      12. text = text.Replace("-[--IV-[-" + IV, "");
      13. text = Convert.ToBase64String(Encoding.Default.GetBytes(text));
      14. aes.IV = Encoding.Default.GetBytes(IV);
      15. ICryptoTransform AESDecrypt = aes.CreateDecryptor(aes.Key, aes.IV);
      16. byte[] buffer = Convert.FromBase64String(text);
      17. return Encoding.Default.GetString(AESDecrypt.TransformFinalBlock(buffer, 0, buffer.Length));
      18. }
  • 相关阅读:
    华为超大云数据中心落地贵州,这些硬核技术有利支撑“东数西算”
    在高并发环境下该如何构建应用级缓存
    使用 Python Poetry 进行依赖管理
    AI新手语音入门:认识词错率WER与字错率CER
    一文带你了解什么是GitOps
    需求蔓延,常见但不正常,教你如何破
    云图说|初识ModelArts开发者生态社区——AI Gallery
    XML学习笔记:关于字符编码的理解~
    Python中单引号、双引号和三双引号的区别:
    LBFGS算法的使用~
  • 原文地址:https://www.cnblogs.com/zeroone/p/3378782.html
Copyright © 2011-2022 走看看