目录

简介

函数

1.pem公钥内容转xml

2.pem私钥内容转xml

3.使用公钥对数据进行加密

4.使用私匙对待签名内容进行签名

示例


简介

在调用Java后端接口,需要使用后端提供的pem私钥,在Unity中使用RSA算法对参数进行签名时,需要先将pem文件中的私钥内容转换为c#支持的xml格式再进行签名,该工具提供了转换及签名的函数,已上传至我的开发框架SKFramework中的开发工具包中,如图所示:

依赖第三方库:BouncyCastle.Crypto.dll

SKFramework开源地址:

https://github.com/136512892/SKFramework

函数

1.pem公钥内容转xml

/// <summary>
/// pem公钥内容转xml
/// </summary>
/// <param name="publicKey"></param>
/// <returns></returns>
public static string Convert2XMLPublicKey(string pem)
{RsaKeyParameters publicKeyParam = (RsaKeyParameters)PublicKeyFactory.CreateKey(Convert.FromBase64String(pem));string XML = string.Format("<RSAKeyValue><Modulus>{0}</Modulus><Exponent>{1}</Exponent></RSAKeyValue>",Convert.ToBase64String(publicKeyParam.Modulus.ToByteArrayUnsigned()),Convert.ToBase64String(publicKeyParam.Exponent.ToByteArrayUnsigned()));return XML;
}

2.pem私钥内容转xml

/// <summary>
/// pem私钥内容转xml
/// </summary>
/// <param name="pem">pem私钥内容</param>
/// <returns></returns>
public static string Convert2XMLPrivateKey(string pem)
{RsaPrivateCrtKeyParameters privateKeyParam = (RsaPrivateCrtKeyParameters)PrivateKeyFactory.CreateKey(Convert.FromBase64String(pem));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()));
}

3.使用公钥对数据进行加密

/// <summary>
/// RSA使用公钥对数据加密
/// </summary>
/// <param name="content">待加密内容</param>
/// <param name="publicKeyXml">公钥</param>
/// <returns></returns>
public static string EncryptWithPublicKey(string content, string publicKeyXml)
{RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();byte[] cipherbytes;rsa.FromXmlString(publicKeyXml);cipherbytes = rsa.Encrypt(Encoding.UTF8.GetBytes(content), false);return Convert.ToBase64String(cipherbytes);
}

4.使用私匙对待签名内容进行签名

/// <summary>
/// RSA使用私匙对签名内容加签名
/// </summary>
/// <param name="sign">代签名内容</param>
/// <param name="privateKeyXml">私钥</param>
/// <param name="hashAlgorithm">哈希算法 默认为SHA256</param>
/// <returns></returns>
public static byte[] SignWithPrivateKey(string sign, string privateKeyXml, string hashAlgorithm = "SHA256")
{RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();rsa.FromXmlString(privateKeyXml);byte[] dataBytes = Encoding.UTF8.GetBytes(sign);byte[] hashbyteSignature = rsa.SignData(dataBytes, hashAlgorithm);return hashbyteSignature;
}

示例

要求:

将pem文件中的私钥内容Copy下来,需要去除首行和尾行的内容,即“-----BEGIN PRIVATE KEY-----”和“-----END PRIVATE KEY-----”:

using System;
using System.Text;
using System.Collections;
using System.Security.Cryptography;
using System.Runtime.InteropServices;using BestHTTP.WebSocket;
using BestHTTP.SecureProtocol.Org.BouncyCastle.Security;
using BestHTTP.SecureProtocol.Org.BouncyCastle.Crypto.Parameters;using UnityEngine;
using Newtonsoft.Json;
using SK.Framework.Crypto;/// <summary>
/// 灵犀云会议字幕流接口Demo
/// </summary>
public class SubtitleExample : MonoBehaviour
{//wsprivate WebSocket webSocket;//地址[SerializeField] private string host;//业务码ID 由字幕系统提供[SerializeField] private string buCode;//秘钥 与buCode同时提供[SerializeField] private string secret;//固定值 目前为1.0[SerializeField] private string signVersion = "1.0";//约定的appid 校验用[SerializeField] private string appid;//私钥 用于根据RSA签名算法得到签名字符串[SerializeField, TextArea]private string privateKey;//会话IDprivate string sid;#region >> WebSocket回调//ws建立连接回调private void OnOpen(WebSocket ws){Debug.Log("WebSocket Open.");}//ws接收数据回调private void OnMessageReceived(WebSocket ws, string message){Debug.Log(string.Format("WebSocket Received: {0}.", message));}//ws关闭连接回调private void OnClosed(WebSocket ws, UInt16 code, string message){Debug.Log(string.Format("WebSocket Closed. Code:{0}  Message:{1}.", code, message));webSocket = null;}//ws发生错误回调private void OnError(WebSocket ws, string error){Debug.LogError(string.Format("WebSocket Error: {0}.", error));}#endregion//十六进制private string ByteToHex(byte[] data){string hs = string.Empty;for (int i = 0; i < data.Length; i++){string temp = Convert.ToString(data[i], 16);hs = temp.Length == 1 ? (hs + "0" + temp) : (hs + temp);}return hs.ToUpper();}private void OnGUI(){GUI.enabled = webSocket == null;if (GUILayout.Button("Open", GUILayout.Width(200f), GUILayout.Height(50f))){//请求urlstring url = string.Format("{0}/subtitle/ws/connect", host);//时间戳TimeSpan ts = DateTime.Now.ToUniversalTime() - new DateTime(1970, 1, 1, 0, 0, 0, 0);long timestamp = Convert.ToInt64(ts.TotalMilliseconds);//Int32随机数string signNonce = UnityEngine.Random.Range(Int32.MinValue, Int32.MaxValue).ToString();//待签名内容string signContent = string.Format("buCode={0}&secret={1}&timestamp={2}&signNonce={3}&signVersion={4}&appid={5}",buCode, secret, timestamp, signNonce, signVersion, appid);Debug.Log(string.Format("待签名内容:{0}", signContent));//签名string sign = ByteToHex(RSACrypto.SignWithPrivateKey(signContent, RSACrypto.Convert2XMLPrivateKey(privateKey)));Debug.Log(string.Format("签名: {0}", sign));//最终请求地址string address = string.Format("{0}?lang={1}&codec={2}&appid={3}&extend={4}&buCode={5}&timestamp={6}&signNonce={7}&signVersion={8}&sign={9}&appid={10}",url, "cn", "speex", appid, "", buCode, timestamp, signNonce, signVersion, sign, appid);Debug.Log(string.Format("Uri: {0}", address));webSocket = new WebSocket(new Uri(address));webSocket.OnOpen += OnOpen;webSocket.OnMessage += OnMessageReceived;webSocket.OnClosed += OnClosed;webSocket.OnError += OnError;webSocket.Open();} }
}

Unity SKFramework框架(二十五)、RSA算法加密、签名工具 RSA Crypto相关推荐

  1. Unity SKFramework框架(十九)、POI 兴趣点/信息点

    目录 一.简介 二.使用说明 1.二维与三维的匹配 2.移除 3.UI分辨率 4.Camera相机 三.Example 示例 一.简介 POI可以理解为场景中的一些有意义的点,例如车站.商场.医院.监 ...

  2. Unity 六边形地图系列(二十五) :水循环

    原文地址:https://catlikecoding.com/unity/tutorials/hex-map/part-25/ 机翻+个人润色 显示原始地图数据 演化细胞气候 创建部分水循环模拟 这是 ...

  3. PTA(二十五) 算法设计与分析 第七章 贪心法 7-1 装箱问题 (20 point(s))

    7-1 装箱问题 (20 point(s)) 假设有N项物品,大小分别为s1.s2.-.sN,其中s​i为满足1≤s​i​​ ≤100的整数.要把这些物品装入到容量为100的一批箱子(序号1-N)中. ...

  4. 二十五个深度学习相关公开数据集

    转 [干货]二十五个深度学习相关公开数据集 2018年04月18日 13:42:53 阅读数:758 (选自Analytics Vidhya:作者:Pranav Dar:磐石编译) 目录 介绍 图像处 ...

  5. 2021年大数据Hadoop(二十五):YARN通俗介绍和基本架构

    全网最详细的Hadoop文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 本系列历史文章 前言 YARN通俗介绍和基本架构 Yarn通俗介绍 Yarn基本 ...

  6. 未处理异常和C++异常——Windows核心编程学习手札之二十五

    未处理异常和C++异常 --Windows核心编程学习手札之二十五 当一个异常过滤器返回EXCEPTION_CONTINUE_SEARCH标识符时是告诉系统继续上溯调用树,寻找另外的异常过滤器,但当每 ...

  7. linux exec 二程序,二十五、Linux 进程与信号---exec函数

    25.1 介绍 在用 fork 函数创建子进程后,子进程往往要调用一种 exec 函数以执行另一个程序 当进程调用一种 exec 函数时,该进程完全由新程序代换,替换原有进程的正文,而新程序则从其 m ...

  8. 二十五、求单点的最短路径

    二十五.求单点的最短路径 文章目录 二十五.求单点的最短路径 题目描述 解题思路 上机代码 题目描述 求从指定源点出发到各个顶点的最短路径. **假设:**图中结点名均为单个互不相同的字母,权值均&g ...

  9. OpenCV学习(二十) :分水岭算法:watershed()

    OpenCV学习(二十) :分水岭算法:watershed() 参考博客: OpenCV-分水岭算法 图像处理--分水岭算法 OpenCV学习(7) 分水岭算法(1) Opencv分水岭算法--wat ...

  10. PyTorch框架学习十五——可视化工具TensorBoard

    PyTorch框架学习十五--可视化工具TensorBoard 一.TensorBoard简介 二.TensorBoard安装及测试 三.TensorBoard的使用 1.add_scalar() 2 ...

最新文章

  1. PHP 获取当前类名、方法名、URL地址
  2. movsb和movsw
  3. Delphi String的散漫记录,真是知识无数,陷阱无数(转)
  4. BigPipe 大的页面分割成一个一个管道
  5. golang开发效率神器汇总
  6. 二级计算机vf题型,2010计算机等级考试二级VF考试题型与解题技巧
  7. IS-IS认证原理(华为设备)
  8. ki51单片机流水灯c语言程序,STC89C51单片机流水灯程序
  9. HDAO去中心化社区自治平台,助力明星项目启航
  10. axure命令行_axure怎么计算器
  11. 《王二丫的甜品店》用户隐私政策
  12. 计算机所有以太网适配的ip,Win10电脑以太网没有有效的ip配置怎么解决?附上具体解决方法...
  13. 未完成的IT路停在回车键 2014年末总结篇
  14. Linux上wifi找不到网络的解决
  15. UnicodeEncodeError: 'gbk' codec can't encode character '\xa9' in position 314810: illegal multibyte
  16. SQLite 数据库操作
  17. VR垃圾分类游戏的“入门”场景|广州华锐互动
  18. c语言read有什么作用,c语言read函数读到什么结束
  19. jQueryRotate实现 幸运转盘 Demo
  20. 关于Mysql查询时间粒度DATA_FORMAT使用说明

热门文章

  1. 如何解释准确率、精确率与召回率?
  2. 2018年最新PHP面试题
  3. 《再别康桥》(徐志摩)
  4. [xueqi]ISCC 2019 writeup 信息安全与对抗-解题思路xueqi
  5. html点击出现对勾,html , 对勾,警告,错误 三种情况
  6. 简单聊一下Android音频通路的切换
  7. php如何设置随机数字和字母,PHP获取随机数字和字母的方法大全
  8. jenkins的企业微信通知报错:No appropriate protocol
  9. Java parallel Bucket Sort
  10. 第二个显示器、副屏 显示错位、模糊、有源信号分辨率 不匹配