rn-crypto-js 前端aes加密 ,C# 后端AES CBC解密

前端用的加密包react-native-crypto-js
import C from 'react-native-crypto-js'
如果npm 下载不了,切换yarn

1.前端数据加密处理及提交:

   var dataz = JSON.stringify({
username: _this.state.username,
password: _this.state.password,
});
var srcs = C.enc.Utf8.parse(dataz);
var key = C.enc.Utf8.parse("1234567890123456");//16位。密钥,密码,(密钥长度)
var iv = C.enc.Utf8.parse("1234567890000000");//16位
var cipher = C.AES.encrypt(srcs, key, {
  mode: C.mode.CBC,   //加密模式
  padding: C.pad.Pkcs7, //填充方式
  iv: iv      //向量
}).toString();

  fetch(url, {
  method: 'POST',
  mode: 'no-cors',
  cache: 'default',
  credentials: "include",
  headers: {
    Accept: 'application/json',
    'Content-Type': 'application/json',
  },
  body:cipher,
})
  .then((response) => response.text())
  .then(function (res) {
    var res = JSON.parse(res);
    if (res.code === 200) {

2.后端C# AES解密:
新建一个AES3的类,引入decrypt 方法

          public static string Decrypt(string toDecrypt, string key, string iv)
    {
        byte[] keyArray = UTF8Encoding.UTF8.GetBytes(key);
        byte[] ivArray = UTF8Encoding.UTF8.GetBytes(iv);
        byte[] toEncryptArray = Convert.FromBase64String(toDecrypt);
        RijndaelManaged rDel = new RijndaelManaged();
        rDel.Key = keyArray;
        rDel.IV = ivArray;
        rDel.Mode = CipherMode.CBC;
        rDel.Padding = PaddingMode.PKCS7;
        ICryptoTransform cTransform = rDel.CreateDecryptor();
        byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
        return UTF8Encoding.UTF8.GetString(resultArray);
    }

在业务中引入

        context.Response.ContentType = "application/json";
        context.Response.ContentEncoding = Encoding.UTF8;
        Stream inputStream = context.Request.InputStream;
        Encoding encoding = context.Request.ContentEncoding;
        StreamReader streamReader = new StreamReader(inputStream, encoding);
        strJson = streamReader.ReadToEnd().Replace(" ", "");

        strJson = AES3.Decrypt(strJson, "1234567890123456", "1234567890000000"); 

        string host = ConfigurationManager.AppSettings["host"];
        var listz = Request.Post(strJson, host+"/Mobile/Login.ashx");//192.168.11.55:6969
        JObject o = (JObject)JsonConvert.DeserializeObject(listz);
      if (o["code"].ToString() == "200")
        {context.Session["loginState"] = "true";

end*
注意:key 和 iv 都需要为16位字符串:

C# AES CBC Pkcs7 iv加密解密实现:

  public static string Encrypt(string toEncrypt, string key, string iv)
    {
        byte[] keyArray = UTF8Encoding.UTF8.GetBytes(key);
        byte[] ivArray = UTF8Encoding.UTF8.GetBytes(iv);
        byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toEncrypt);

        RijndaelManaged rDel = new RijndaelManaged();
        rDel.Key = keyArray;
        rDel.IV = ivArray;
        rDel.Mode = CipherMode.CBC;
        rDel.Padding = PaddingMode.PKCS7;

        ICryptoTransform cTransform = rDel.CreateEncryptor();
        byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);

        return Convert.ToBase64String(resultArray, 0, resultArray.Length);
    }

    public static string Decrypt(string toDecrypt, string key, string iv)
    {
        byte[] keyArray = UTF8Encoding.UTF8.GetBytes(key);
        byte[] ivArray = UTF8Encoding.UTF8.GetBytes(iv);
        byte[] toEncryptArray = Convert.FromBase64String(toDecrypt);

        RijndaelManaged rDel = new RijndaelManaged();
        rDel.Key = keyArray;
        rDel.IV = ivArray;
        rDel.Mode = CipherMode.CBC;
        rDel.Padding = PaddingMode.PKCS7;

        ICryptoTransform cTransform = rDel.CreateDecryptor();
        byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);

        return UTF8Encoding.UTF8.GetString(resultArray);
    }

你可能感兴趣的:(rn-crypto-js 前端aes加密 ,C# 后端AES CBC解密)