前端用的加密包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);
}