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.

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), "\0");
  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. }

C#/PHP Compatible Encryption (AES256) ZZ的更多相关文章

  1. 提供openssl -aes-256-cbc兼容加密/解密的简单python函数

    原文链接:http://joelinoff.com/blog/?p=885 这里的示例显示了如何使用python以与openssl aes-256-cbc完全兼容的方式加密和解密数据.它是基于我在本网 ...

  2. [转载] TLS协议分析 与 现代加密通信协议设计

    https://blog.helong.info/blog/2015/09/06/tls-protocol-analysis-and-crypto-protocol-design/?from=time ...

  3. Lync 2013安装中遇到的关于SQL Mirroring的一次报错的解决

    Problem Description ================= Following the Lync Deployment Wizard to setup Database Mirrori ...

  4. vyos User Guide

    vyos User Guide 来源 https://wiki.vyos.net/wiki/User_Guide The VyOS User Guide is focused on providing ...

  5. TLS协议分析

    TLS协议分析 本文目标: 学习鉴赏TLS协议的设计,透彻理解原理和重点细节 跟进一下密码学应用领域的历史和进展 整理现代加密通信协议设计的一般思路 本文有门槛,读者需要对现代密码学有清晰而系统的理解 ...

  6. Corosync 配置描述

    NAME corosync.conf - corosync executive configuration file SYNOPSIS /etc/corosync/corosync.conf DESC ...

  7. Cisco asa组建IPSEC for ikev1

    IPSec的实现主要由两个阶段来完成:--第一阶段,双方协商安全连接,建立一个已通过身份鉴别和安全保护的通道.--第二阶段,安全协议用于保护数据的和信息的交换. IPSec有两个安全协议:AH和ESP ...

  8. 设置 cipher suite

    https://man.openbsd.org/SSL_CTX_set_cipher_list.3#ECDHE SSL_CTX_set_cipher_list() sets the list of a ...

  9. 【原创】大叔经验分享(41)hdfs开启kerberos之后报错Encryption type AES256 CTS mode with HMAC SHA1-96 is not supported/enabled

    hdfs开启kerberos之后,namenode报错,连不上journalnode 2019-03-15 18:54:46,504 WARN org.apache.hadoop.security.U ...

随机推荐

  1. cocoaPods的安装和使用之详细介绍

    一,在Mac OS X上安装Ruby运行环境 步骤1------安装RVM $ curl -L https://get.rvm.io | bash -s stable 然后载入RVM环境 $ sour ...

  2. mac最常用终端命令

    1分钟,快速复习下: pwd (显示当前所在路径) ls -l  (列出文件的详细信息,如创建者,创建时间,文件的读写权限列表等等) touch `filename`(创建文件) open `file ...

  3. Codevs 3990 中国余数定理 2

    3990 中国余数定理 2 时间限制: 1 s 空间限制: 1000 KB 题目等级 : 白银 Silver 传送门 题目描述 Description Skytree神犇最近在研究中国博大精深的数学. ...

  4. .NET 中String类功能分类概述

    一.比较功能 String.Compare: 成员函数 返回值 功能 String.Compare 小于零.零.大于零. 1.比较两个字符串的大小(按照一定规则) 2.比较两个字符串中子字符串的大小. ...

  5. 《JavaScript高级程序设计》 阅读计划

    第一周       第1章 JavaScript简介   1 第2章 在Html中使用JavaScript 1 第3章 基本概念   3         第二周       第4章 变量.作用域和内存 ...

  6. mysql 主从一致性检查

    我上一次遇到MySQL主从服务器数据一致性问题,想想是几年前的事情了,还依稀记得当时惊慌失措的情景,好在最后借助Maatkit解决了问题.几年后,当我再次面对同样的问题时,Maatkit已经不复存在, ...

  7. ci 多个文件同时上传

    // 单个文件请手册,这里多个文件中,参数设置可参考手册 view 视图 <form...> <input type="file" name="user ...

  8. 【python】分片copy和等号的区别

    例一 >>> list1=[1,2,3,4]>>> list2=list1>>> list3=list1[:]>>> list1 ...

  9. visual studio 生成后事件 Post-Build Event

    提出问题:我们的解决方案中有两个可执行程序,主程序运行后,会通过process.start()打开多个子程序.调用process.start的时候,需要指定子程序的可执行路径,把子程序的可执行程序放到 ...

  10. easyUI:ComboTree and comselector使用实例解析

    ComboTree 使用场景:故名思意,ComboTree是combox和Tree的结合体,在需要通过选择得到某一个node值的时候触发. 栗子: 定义: 使用标签创建树形下拉框. Comselect ...