首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Unity SKFramework框架(二十五)、RSA算法加密、签名工具 RSA Crypto

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

作者头像
CoderZ
发布于 2022-08-29 09:19:23
发布于 2022-08-29 09:19:23
97500
代码可运行
举报
运行总次数:0
代码可运行

简介

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

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

SKFramework开源地址:

https://github.com/136512892/SKFramework

函数

1.pem公钥内容转xml

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/// <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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/// <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.使用公钥对数据进行加密

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/// <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.使用私匙对待签名内容进行签名

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/// <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-----”:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
{
    //ws
    private 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;
    //会话ID
    private 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)))
        {
            //请求url
            string 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();
        } 
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-07-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 当代野生程序猿 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
[C#]C#实现RSA加密解密
RSA公钥加密算法是1977年由Ron Rivest、Adi Shamirh和LenAdleman在(美国麻省理工学院)开发的。RSA取名来自开发他们三者的名字。
云未归来
2025/07/20
1120
[C#]C#实现RSA加密解密
.NET Core 使用RSA算法 加密/解密/签名/验证签名
前言 前不久移植了支付宝官方的SDK,以适用ASP.NET Core使用支付宝支付,但是最近有好几位用户反应在Linux下使用会出错,调试发现是RSA加密的错误,下面具体讲一讲。 RSA在.NET Core的改动 以前我们使用RSA加密主要是使用RSACryptoServiceProvider这个类,在.NET Core中也有这个类,但是这个类并不支持跨平台,所以如果你是用这个类来进行加/解密在windows上运行是完全没有错误的,但是只要你一放到Linux下就会出现异常。 查阅资料得知,要解决这个问题,需
晓晨
2018/06/22
4.1K0
C# RSA 加密,解密与签名,验证签名
https://gist.github.com/JasonGrass/b773dd4fca392abe86f582876b6f470c
jgrass
2024/12/25
5240
string字符串扩展
/// <summary> /// /// </summary> public static class StringExtentions { /// <summary> /// 转换为MD5加密后的字符串(默认加密为32位) /// </summary> /// <param name="str"></param> /// <returns></returns> public
跟着阿笨一起玩NET
2022/12/09
9630
ASP.NET Core 打造一个"最安全"的API接口
链接:cnblogs.com/xuejiaming/p/15384015.html
郑子铭
2021/10/26
1.7K0
ASP.NET Core 打造一个"最安全"的API接口
RSA签名和验证数据
1 private const string PubKey = "BgIAAACkAABSU0ExAAQAAAEAAQAxg/L6l3AyA+Zd7Hm7ESCcS4CcgY8PvwE2arRvTbfI4+z6zPJaDkOyho9X6owIwceN9zXH5XNsAmEVYBkgmwdX5r5g8iymKywYSaVpt1FDUHRkGY39NuDVsbVJ/1DW15TTVeYLalbtOOb0h61pnaW9FgQNaYMMZSWPO8UZ9hPepw=="; 2 3
用户6362579
2019/09/29
1.1K0
Unity SKFramework框架(十四)、Extension 扩展函数
该部分是框架中使用this关键字给一些类型做的拓展函数,为了支持链式编程或记录、封装一些功能,内容会持续补充,本文给出其中部分示例。
CoderZ
2022/08/29
6830
Unity SKFramework框架(十四)、Extension 扩展函数
Silverlight中非对称加密及数字签名RSA算法的实现
RSA算法是第一个既能用于数据加密也能用于数字签名的算法。它易于理解和操作,也很流行。它的安全性是基于大整数素因子分解的困难性,而大整数因子分解问题是数学上的著名难题,至今没有有效的方法予以解决,因此可以确保RSA算法的安全性。     到目前Silverlight4 Beta发布为止,Silverlight中仍然没有提供非对称加密及数字签名相关的算法。而.NET Framework中提供的RSA等算法,都是通过操作系统提供的相关API实现的,没法移植到Silverlight中使用。因此很难实现一个健壮点的
葡萄城控件
2018/01/10
1.1K0
那些常用的加密算法
MD5加密是最常见的加密方式,因为MD5是不可逆的,所以很多系统的密码都是用MD5加密保存的。
Kiba518
2020/11/26
1.3K0
那些常用的加密算法
非对称加密
加密模式只有一种实现,即RSACryptoServiceProvider,采用的是RSA算法。DSACryptoServiceProvider只能进行认证模式,即数字签名,不能进行加密模式。
小蜜蜂
2019/07/24
9240
非对称加密
c#RSA加密字符串
立羽
2023/08/24
2820
C#创建数字证书并导出为pfx,并使用pfx进行非对称加解密
本文源程序下载:http://download.csdn.net/source/2444494 我的项目当中,考虑到安全性,需要为每个客户端分发一个数字证书,同时使用数字证书中的公私钥来进行数据的加解密。为了完成这个安全模块,特写了如下一个DEMO程序,该DEMO程序包含的功能有: 1:调用.NET2.0的MAKECERT创建含有私钥的数字证书,并存储到个人证书区; 2:将该证书导出为pfx文件,并为其指定一个用来打开pfx文件的password; 3:读取pfx文件,导出pfx中公钥和私钥; 4:用pfx
庞小明
2018/03/07
2.5K0
C#创建数字证书并导出为pfx,并使用pfx进行非对称加解密
利用RSA加密实现的简易离线验证功能(C#,含代码)
许多软件都有正版验证功能,它们通常需要联网验证,验证的本质则是加密与解密,本文将使用RSA加密算法实现简易的离线验证功能
DearXuan
2022/01/19
6170
利用RSA加密实现的简易离线验证功能(C#,含代码)
WinForm加密技术全解析
在当今数字化时代,数据安全至关重要。对于WinForm应用程序而言,保护敏感数据不被窃取或篡改是开发者必须重视的问题。加密技术作为数据安全的重要防线,能够将原始数据转换为密文,只有通过特定的密钥和算法才能还原为原始数据。本文将深入探讨WinForm中的加密技术,包括常见的加密算法及其实现方式。
郑子铭
2025/03/24
1380
WinForm加密技术全解析
Unity SKFramework框架(八)、Scene Loader 场景加载器
其中sceneActivationDelay参数表示当场景在内存中加载完成时,需要延迟该时长才允许场景激活,原理是首先将异步操作AsyncOperation中的allowSceneActivation设为false,在场景加载完成并延迟后再将其设为true,该参数默认值为3。
CoderZ
2022/08/29
6100
Unity SKFramework框架(八)、Scene Loader 场景加载器
C#中CA加密与DES加密的混合使用
这段时间搞了个接口加密的重写,感觉信息的加密在数据传输中还是比较重要的,小小的研究了下,做点笔记,以备查阅。
code2roc
2023/07/19
3550
C#使用RSA证书文件加密和解密示例
修改MSDN上的示例,使之可以通过RSA证书文件加密和解密,中间遇到一个小问题。 Q:执行ExportParameters()方法时,回报CryptographicException:该项不适于在指定状态下使用(Key not valid for use in specified state)。 A:导入带有私钥的证书时,需要使用"X509KeyStorageFlags"参数标记"私钥可导出"。 X509Certificate2 prvcrt = new X509Certificate2(@"X:\path
庞小明
2018/03/07
2.3K0
Unity 接入有道智云AI - 文档翻译
文档翻译API接口提供有道的文档翻译服务,只需要通过调用文档翻译API,传入文档的Base64编码,指定源语言与目标语言,通过POST请求方式,就可以将文档中的文字内容进行翻译。
CoderZ
2022/08/29
1.3K0
Unity 接入有道智云AI - 文档翻译
用Portable.BouncyCastle来进行加解密的代码demo
这里对之前对接的公司中的代码demo做一个总结,原本为清一色的java,哈哈。这里都转成C#。用到的库是Portable.BouncyCastle。官网。之前也是准备用.net core 内置的类,方法,但实际在用的时候比如因为desKey并不是特定长度的,导致抛了一些异常,于是就改用了这个库。
_淡定_
2019/03/06
1.5K0
C#加解密
加密解密在开发中经常用到,比如登录密码加密解密、消息传输加密解密等。但是很多人只会使用不理解其中的原理,这篇文章就带领大家快速学习加密解密的原理和使用。
喵叔
2020/09/08
1.1K0
相关推荐
[C#]C#实现RSA加密解密
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档