c#RSA的SHA1加密与AES加密、解密
前言:公司项目对接了一个对数据保密性要求较高的java公司。api接口逻辑是这样的:他们提供 SHA1私钥 与 AES的秘钥。我们需要将 传递查询参数 通过SHA1 私钥加密再转换成 十六进制 字符串。传递查询参数 再通过 AES秘钥 加密转换成十六进制 字符串。
查询结果 也是一个十六进制字符串 需要转换成 byte 数组 再通过AES秘钥解密成 返回数据。
后面转换接口都需要十六进制字符串与byte数组 相互转换。这个具体得看开发者自己的接口要求了。我这边的项目要求 就是数据传递用十六进制字符串比较多。
1.十六进制字符串转换成byte数组
/// <summary>
/// 十六进制字符串换成byte数组转
/// </summary>
/// <param name="byteArray"></param>
/// <returns></returns>
private static byte[] HexStringToByteArray(string s)
{
s = s.Replace(" ", "");
byte[] buffer = new byte[s.Length / 2];
for (int i = 0; i < s.Length; i += 2)
{
buffer[i / 2] = (byte)Convert.ToByte(s.Substring(i, 2), 16);
}
return buffer;
}
2.byte数组转换成十六进制字符串
/// <summary>
/// byte数组转换成十六进制字符串
/// </summary>
/// <param name="byteArray"></param>
/// <returns></returns>
private string bytesToHexStr(byte[] byteArray)
{
StringBuilder sb = new StringBuilder();
foreach (byte b in byteArray)
{
sb.Append(b.ToString("X2"));
}
return sb.ToString();
}
一、privateKey私钥转换成xml
.net的RSA仅仅支持 xml格式。第一步需要将java那边提供的SHA1私钥转换成xml格式
/// <summary>
/// 私钥=>十六进制字符串转换成xml
/// </summary>
/// <param name="privateKey"></param>
/// <returns></returns>
private static string RSAPrivateKeyJava2DotNet(string privateKey)
{
RsaPrivateCrtKeyParameters privateKeyParam = (RsaPrivateCrtKeyParameters)PrivateKeyFactory.CreateKey(HexStringToByteArray(privateKey));
return string.Format("<RSAKeyValue><Modulus>{0}</Modulus><Exponent>{1}</Exponent><P>{2}</P><Q>{3}</Q><DP>{4}</DP><DQ>{5}</DQ><InverseQ>{6}</InverseQ><D>{7}</D></RSAKeyValue>",
Convert.ToBase64String(privateKeyParam.Modulus.ToByteArrayUnsigned()),
Convert.ToBase64String(privateKeyParam.PublicExponent.ToByteArrayUnsigned()),
Convert.ToBase64String(privateKeyParam.P.ToByteArrayUnsigned()),
Convert.ToBase64String(privateKeyParam.Q.ToByteArrayUnsigned()),
Convert.ToBase64String(privateKeyParam.DP.ToByteArrayUnsigned()),
Convert.ToBase64String(privateKeyParam.DQ.ToByteArrayUnsigned()),
Convert.ToBase64String(privateKeyParam.QInv.ToByteArrayUnsigned()),
Convert.ToBase64String(privateKeyParam.Exponent.ToByteArrayUnsigned()));
}
二、c#SHA1加密
数据转换过程中 套有一个md5加密MD5Encrypt(都是按照乙方java的加密规则写的 我也觉得很繁琐)
/// <summary>
/// ASYMMETRY_ALGORITHM 加密类 SHA1
/// </summary>
/// <param name="signaturePrivateKey"></param>
/// <param name="signatureData">请求参数</param>
/// <returns></returns>
private string signature(string signaturePrivateKey, string signatureData)
{
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
var privateJavaKey = signaturePrivateKey;
var privateCSharpKey = RSAPrivateKeyJava2DotNet(privateJavaKey);
rsa.FromXmlString(privateCSharpKey);
var md5 = MD5Encrypt(signatureData);
byte[] signatureBytes = rsa.SignData(Encoding.UTF8.GetBytes(md5), "SHA1");
var hexStr = bytesToHexStr(signatureBytes);
return hexStr;
}
MD5Encrypt
/// <summary>
/// 用MD5加密字符串
/// </summary>
/// <param name="jsonData">待加密的字符串</param>
/// <returns></returns>
public string MD5Encrypt(string jsonData)
{
MD5CryptoServiceProvider md5Hasher = new MD5CryptoServiceProvider();
byte[] hashedDataBytes;
hashedDataBytes = md5Hasher.ComputeHash(Encoding.GetEncoding("gb2312").GetBytes(jsonData));
StringBuilder tmp = new StringBuilder();
foreach (byte i in hashedDataBytes)
{
tmp.Append(i.ToString("x2"));
}
return tmp.ToString();
}
三、AES加密
/// <summary>
/// AES解密
/// </summary>
/// <param name="signaturePrivateKey"></param>
/// <param name="signatureData"></param>
/// <returns></returns>
private string decrypt(string key, string str)
{
if (string.IsNullOrEmpty(str)) return null;
Byte[] toEncryptArray = HexStringToByteArray(str); RijndaelManaged rm = new RijndaelManaged
{
Key = HexStringToByteArray(key),
Mode = CipherMode.ECB,
Padding = PaddingMode.PKCS7
}; ICryptoTransform cTransform = rm.CreateDecryptor();
Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length); return Encoding.UTF8.GetString(resultArray);
}
四、请求接口获取返回数据
public objcet callIntegrateService()
{
var date = DateTime.Now;
var startTime = Convert.ToDateTime(date.ToString("yyyy-MM-dd") + " 00:00:00");
var endTime = date;
var logstart = ConvertDateTimeInt(startTime);//datetime转换成时间戳Unix
var logend = ConvertDateTimeInt(endTime);
//var jsonData = "{}";
var jsonData ="{ startTime: \"" + logstart + "\",endTime:\"" + logend + "\" }";
var url = base_url + "/getProjectAttendanceDetail";
string signature = getSignatrue(jsonData);
string encryptData = encrypt(secretKey, jsonData);
var param = "{ clientSerial:\""+ clientSerial + "\",projectId:\"" + projectId + "\",jsonData:\"" + encryptData + "\",signature:\"" + signature + "\" }";
var result= webPost(url, param);
var objresult = JsonConvert.DeserializeObject<request>(result);
var response = objresult.response;
var data = decrypt(secretKey, response);
var objdata = JsonConvert.DeserializeObject(data);
return objdata;
}
五、解密返回数据
AES解密
/// <summary>
/// AES解密
/// </summary>
/// <param name="signaturePrivateKey"></param>
/// <param name="signatureData"></param>
/// <returns></returns>
private string decrypt(string key, string str)
{
if (string.IsNullOrEmpty(str)) return null;
Byte[] toEncryptArray = HexStringToByteArray(str); RijndaelManaged rm = new RijndaelManaged
{
Key = HexStringToByteArray(key),
Mode = CipherMode.ECB,
Padding = PaddingMode.PKCS7
}; ICryptoTransform cTransform = rm.CreateDecryptor();
Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length); return Encoding.UTF8.GetString(resultArray);
}
c#RSA的SHA1加密与AES加密、解密的更多相关文章
- 信息安全-加密:AES 加密
ylbtech-信息安全-加密:AES 加密 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一 ...
- 对称加密之---AES加密
工作中常会需要让数据传输前进行加密处理.这次用到的是AES加密.AES加密中,需要注意到坑还是挺多的.对AES也进行了一番了解,发现里面的东西真的是注意的太多了.今天只是整理了一种简单的加密格式,工作 ...
- 关于CryptoJS中md5加密以及aes加密的随笔
最近项目中用到了各种加密,其中就包括从没有接触过得aes加密,因此从网上各种查,官方的一种说法: 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学 ...
- 【Android工具】DES终结者加密时报——AES加密演算法
转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992 在前面的两篇文章中.我们介绍了DES算法,3DES算法以及他们的Android程序实现,并研究了怎样才干实现 ...
- 对称加密之AES加密详解
最近有人问我AES对称加密是啥,我回答了个大概,发现自己不能清晰的讲出来,特此记录,以供学习 一.对称加密 对称加密是最快速.最简单的一种加密方式,加密(encryption)与解密(decrypti ...
- C#对称加密(AES加密)每次生成的密文结果不同思路代码分享
思路:使用随机向量,把随机向量放入密文中,每次解密时从密文中截取前16位,其实就是我们之前加密的随机向量. 代码 public static string Encrypt(string plainTe ...
- Asp.Net Core 2.0 项目实战(7)MD5加密、AES&DES对称加解密
本文目录 1. 摘要 2. MD5加密封装 3. AES的加密.解密 4. DES加密/解密 5. 总结 1. 摘要 C#中常用的一些加密和解密方案,如:md5加密.RSA加密与解密和DES加密等, ...
- AES加密原理和AOE工程实践
在AI业务的开发的过程中,我们常常需要对模型文件进行加密.我们从以下几个方面来说一说AES的加密原理以及AOE里的工程实践. 常见的加密算法 AOE对模型加密需求的思考 AES的加密原理 AOE工程实 ...
- AES加密和Base64混合加密
/// <summary> /// AES加密方法(AES加密和Base64混合加密) /// </summary> /// <param name="toEn ...
随机推荐
- CODING DevOps 代码质量实战系列第二课: PHP 版
讲师介绍 杨周 CODING DevOps 架构师 CODING 布道师 连续创业者.DIY/Linux 玩家.知乎小 V,曾在创新工场.百度担任后端开发.十余年一线研发和带队经验,经历了 ToB.T ...
- 02.RDB持久化配置与工作流程
一.如何配置RDB持久化机制 配置文件redis.conf save 60 1000 表示每隔60s,检查如果有超过1000个key发生了变更,那么就生成一个新的dump.rdb文件,就是当前redi ...
- vue路由守卫+cookie实现页面跳转时验证用户是否登录----(二)设置路由守卫
上一篇我们已经封装好了cookie方法,登录成功之后也可以吧用户信息存到cookie中,接下来需要在router/index.js中引入一下cookie.js文件 然后继续添加以下代码 /* * be ...
- Vue开源项目使用探索
前言 本文记录一次使用Vue开源项目的过程. 寻找Vue开源项目 要使用Vue开源项目就必须先找到一个,我们去Github上搜索[后台],然后使用Vue分类进行检索,找到排名第一的开源框架进行下载—v ...
- 从后端到前端之Vue(六)表单组件
表单组件 做项目的时候会遇到一个比较头疼的问题,一个大表单里面有好多控件,一个一个做设置太麻烦,更头疼的是,需求还总在变化,一会多选.一会单选.一会下拉的,变来变去的烦死宝宝了. 那么怎么解决这个问题 ...
- Toast 响应点击事件
import java.lang.reflect.Field; import android.content.Context; import android.util.Log; import andr ...
- java的方法详解和总结
一.什么是方法 在日常生活中,我们所说的方法就是为了解决某件事情,而采取的解决办法 java中的方法可以理解为语句的集合,用来完成解决某件事情或实现某个功能的办法 方法的优点: 程序变得更加简短而清晰 ...
- css实现导航栏下划线跟随效果
话不多说先附上代码 <style> ul li { float: left; display: block; list-style: none; margin-left: 20px; bo ...
- linux 常用目录的作用
. / 根目录 . /bin 命令保存目录(普通用户就可以读取的命令) . /boot 启动目录,启动相关文件 . /dev 设备文件保存目录 . /etc 配置文件保 ...
- Spring 框架(持续完善中)
目录标题 一.Spring 框架 Spring 是什么? Spring Framework 核心概念 了解Spring 框架的架构图 二.Spring Framework 之 IOC 开发的步骤流程 ...