当前位置: 首页 > news >正文

.NetRSA签名(调的JAVA的接口)

 公共类:

using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Security;
using System;
using System.IO;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;namespace CommonUtils
{/// <summary>/// 将私钥(PKCS1,PKCS8)、公钥、私钥证书、公钥证书转为.NET RSACryptoServiceProvider 对象/// </summary>public static class RsaUtil{#region 加载私钥/// <summary>/// 转换私钥字符串为RSACryptoServiceProvider/// </summary>/// <param name="privateKeyStr">私钥字符串</param>/// <param name="keyFormat">PKCS8,PKCS1</param>/// <param name="signType">RSA 私钥长度1024 ,RSA2 私钥长度2048</param>/// <returns></returns>public static RSACryptoServiceProvider LoadPrivateKey(string privateKeyStr, string keyFormat){string signType = "RSA";if (privateKeyStr.Length > 1024){signType = "RSA2";}//PKCS8,PKCS1if (keyFormat == "PKCS1"){return LoadPrivateKeyPKCS1(privateKeyStr, signType);}else{return LoadPrivateKeyPKCS8(privateKeyStr);}}/// <summary>/// PKCS1 格式私钥转 RSACryptoServiceProvider 对象/// </summary>/// <param name="strKey">pcsk1 私钥的文本内容</param>/// <param name="signType">RSA 私钥长度1024 ,RSA2 私钥长度2048 </param>/// <returns></returns>public static RSACryptoServiceProvider LoadPrivateKeyPKCS1(string privateKeyPemPkcs1, string signType){try{privateKeyPemPkcs1 = privateKeyPemPkcs1.Replace("-----BEGIN RSA PRIVATE KEY-----", "").Replace("-----END RSA PRIVATE KEY-----", "").Replace("\r", "").Replace("\n", "").Trim();privateKeyPemPkcs1 = privateKeyPemPkcs1.Replace("-----BEGIN PRIVATE KEY-----", "").Replace("-----END PRIVATE KEY-----", "").Replace("\r", "").Replace("\n", "").Trim();byte[] data = null;//读取带data = Convert.FromBase64String(privateKeyPemPkcs1);RSACryptoServiceProvider rsa = DecodeRSAPrivateKey(data, signType);return rsa;}catch (Exception ex){throw ex;}return null;}private static RSACryptoServiceProvider DecodeRSAPrivateKey(byte[] privkey, string signType){byte[] MODULUS, E, D, P, Q, DP, DQ, IQ;// --------- Set up stream to decode the asn.1 encoded RSA private key ------MemoryStream mem = new MemoryStream(privkey);BinaryReader binr = new BinaryReader(mem);  //wrap Memory Stream with BinaryReader for easy readingbyte bt = 0;ushort twobytes = 0;int elems = 0;try{twobytes = binr.ReadUInt16();if (twobytes == 0x8130) //data read as little endian order (actual data order for Sequence is 30 81)binr.ReadByte();    //advance 1 byteelse if (twobytes == 0x8230)binr.ReadInt16();    //advance 2 byteselsereturn null;twobytes = binr.ReadUInt16();if (twobytes != 0x0102) //version numberreturn null;bt = binr.ReadByte();if (bt != 0x00)return null;//------ all private key components are Integer sequences ----elems = GetIntegerSize(binr);MODULUS = binr.ReadBytes(elems);elems = GetIntegerSize(binr);E = binr.ReadBytes(elems);elems = GetIntegerSize(binr);D = binr.ReadBytes(elems);elems = GetIntegerSize(binr);P = binr.ReadBytes(elems);elems = GetIntegerSize(binr);Q = binr.ReadBytes(elems);elems = GetIntegerSize(binr);DP = binr.ReadBytes(elems);elems = GetIntegerSize(binr);DQ = binr.ReadBytes(elems);elems = GetIntegerSize(binr);IQ = binr.ReadBytes(elems);// ------- create RSACryptoServiceProvider instance and initialize with public key -----CspParameters CspParameters = new CspParameters();CspParameters.Flags = CspProviderFlags.UseMachineKeyStore;int bitLen = 1024;if ("RSA2".Equals(signType)){bitLen = 2048;}RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(bitLen, CspParameters);//RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();RSAParameters RSAparams = new RSAParameters();RSAparams.Modulus = MODULUS;RSAparams.Exponent = E;RSAparams.D = D;RSAparams.P = P;RSAparams.Q = Q;RSAparams.DP = DP;RSAparams.DQ = DQ;RSAparams.InverseQ = IQ;RSA.ImportParameters(RSAparams);return RSA;}catch (Exception ex){throw ex;// return null;}finally{binr.Close();}}private static int GetIntegerSize(BinaryReader binr){byte bt = 0;byte lowbyte = 0x00;byte highbyte = 0x00;int count = 0;bt = binr.ReadByte();if (bt != 0x02)        //expect integerreturn 0;bt = binr.ReadByte();if (bt == 0x81)count = binr.ReadByte();    // data size in next byteelseif (bt == 0x82){highbyte = binr.ReadByte(); // data size in next 2 byteslowbyte = binr.ReadByte();byte[] modint = { lowbyte, highbyte, 0x00, 0x00 };count = BitConverter.ToInt32(modint, 0);}else{count = bt;     // we already have the data size}while (binr.ReadByte() == 0x00){    //remove high order zeros in datacount -= 1;}binr.BaseStream.Seek(-1, SeekOrigin.Current);        //last ReadByte wasn't a removed zero, so back up a bytereturn count;}/// <summary>/// PKCS8 文本转RSACryptoServiceProvider 对象/// </summary>/// <param name="privateKeyPemPkcs8"></param>/// <returns></returns>public static RSACryptoServiceProvider LoadPrivateKeyPKCS8(string privateKeyPemPkcs8){try{//PKCS8是“BEGIN PRIVATE KEY”privateKeyPemPkcs8 = privateKeyPemPkcs8.Replace("-----BEGIN RSA PRIVATE KEY-----", "").Replace("-----END RSA PRIVATE KEY-----", "").Replace("\r", "").Replace("\n", "").Trim();privateKeyPemPkcs8 = privateKeyPemPkcs8.Replace("-----BEGIN PRIVATE KEY-----", "").Replace("-----END PRIVATE KEY-----", "").Replace("\r", "").Replace("\n", "").Trim();//pkcs8 文本先转为 .NET XML 私钥字符串string privateKeyXml = RSAPrivateKeyJava2DotNet(privateKeyPemPkcs8);RSACryptoServiceProvider publicRsa = new RSACryptoServiceProvider();publicRsa.FromXmlString(privateKeyXml);return publicRsa;}catch (Exception ex){throw ex;}}/// <summary>/// PKCS8 私钥文本 转 .NET XML 私钥文本/// </summary>/// <param name="privateKeyPemPkcs8"></param>/// <returns></returns>public static string RSAPrivateKeyJava2DotNet(string privateKeyPemPkcs8){RsaPrivateCrtKeyParameters privateKeyParam = (RsaPrivateCrtKeyParameters)PrivateKeyFactory.CreateKey(Convert.FromBase64String(privateKeyPemPkcs8));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()));}#endregion/// <summary>/// 加载公钥证书/// </summary>/// <param name="publicKeyCert">公钥证书文本内容</param>/// <returns></returns>public static RSACryptoServiceProvider LoadPublicCert(string publicKeyCert){publicKeyCert = publicKeyCert.Replace("-----BEGIN CERTIFICATE-----", "").Replace("-----END CERTIFICATE-----", "").Replace("\r", "").Replace("\n", "").Trim();byte[] bytesCerContent = Convert.FromBase64String(publicKeyCert);X509Certificate2 x509 = new X509Certificate2(bytesCerContent);RSACryptoServiceProvider rsaPub = (RSACryptoServiceProvider)x509.PublicKey.Key;return rsaPub;}/// <summary>/// pem 公钥文本 转  .NET RSACryptoServiceProvider。/// </summary>/// <param name="publicKeyPem"></param>/// <returns></returns>public static RSACryptoServiceProvider LoadPublicKey(string publicKeyPem){publicKeyPem = publicKeyPem.Replace("-----BEGIN PUBLIC KEY-----", "").Replace("-----END PUBLIC KEY-----", "").Replace("\r", "").Replace("\n", "").Trim();//pem 公钥文本 转  .NET XML 公钥文本。string publicKeyXml = RSAPublicKeyJava2DotNet(publicKeyPem);RSACryptoServiceProvider publicRsa = new RSACryptoServiceProvider();publicRsa.FromXmlString(publicKeyXml);return publicRsa;}/// <summary>/// pem 公钥文本 转  .NET XML 公钥文本。/// </summary>/// <param name="publicKey"></param>/// <returns></returns>private static string RSAPublicKeyJava2DotNet(string publicKey){RsaKeyParameters publicKeyParam = (RsaKeyParameters)PublicKeyFactory.CreateKey(Convert.FromBase64String(publicKey));return string.Format("<RSAKeyValue><Modulus>{0}</Modulus><Exponent>{1}</Exponent></RSAKeyValue>",Convert.ToBase64String(publicKeyParam.Modulus.ToByteArrayUnsigned()),Convert.ToBase64String(publicKeyParam.Exponent.ToByteArrayUnsigned()));}}}

调取:

/// <summary>
/// 将字符串进行签名,返回签名字符串
/// </summary>
/// <param name="jsonString"></param>
/// <returns>strSigned</returns>
public string GetstrSigned(string jsonString)
{string strSigned = "";try{//RSA密钥//PKCS8格式私钥string privateKey = "1111111111";//获取私钥对象var rsaPri = RsaUtil.LoadPrivateKey(privateKey, "PKCS8");//待签名字符串 转为byte 数组byte[] byToSign = Encoding.UTF8.GetBytes(jsonString); // 编码要和其它语言一致,一般是:UTF8 byte[] bySigned = rsaPri.SignData(byToSign, "SHA1");//SHA256,对应JAVA,SHA256withRSA,签名结果是 byte 数组strSigned = Convert.ToBase64String(bySigned);//将byte 数组转为字符串,方便传输,一般是base64字符串,其它类型需和对方协商}catch (Exception){throw;}return strSigned;
}

相关文章:

.NetRSA签名(调的JAVA的接口)

公共类: using Org.BouncyCastle.Crypto.Parameters; using Org.BouncyCastle.Security; using System; using System.IO; using System.Security.Cryptography; using System.Security.Cryptography.X509Certificates;namespace CommonUtils {/// <summary>/// 将私钥&…...

CSS||选择器

目录 作用 分类 基础选择器 标签选择器 ​编辑类选择器 id选择器 通配符选择器 作用 选择器&#xff08;选择符&#xff09;就是根据不同需求把不同的标签选出来这就是选择器的作用。 简单来说&#xff0c;就是选择标签用的。 选择器的使用一共分为两步&#xff1a; 1.…...

几种常见的算法

一、冒泡排序法 冒泡排序法 原始数据&#xff1a;3 2 7 6 8 第1次循环&#xff1a;&#xff08;最大的跑到最右边&#xff09; 2 3 7 6 8&#xff08;3和2比较&#xff0c;2<3 所以2和3交换位置&#xff09; 2 3 7 6 8&#xff08;3和7比较&#xff0c;3<7 所以不需要交…...

原生的cURL函数而不是 tp6框架的Http类,curl_init()、curl_setopt()和curl_exec()等cURL函数

GET请求示例&#xff1a; // 初始化 cURL $ch curl_init(); // 设置 cURL 选项 curl_setopt($ch, CURLOPT_URL, https://example.com/api/resource); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 执行 cURL 并获取返回结果 $response curl_exec($ch); // 关闭 cURL…...

Win10下在Qt项目中配置SQlite3环境

资源下载 官网资源&#xff1a;SQLite Download Page 1、sqlite.h sqlite-amalgamation-3450000.zip (2.60 MiB) 2、sqlite3.def&#xff0c;sqlite3.dll sqlite-dll-win-x64-3450000.zip (1.25 MiB) 3、 win10下安装sqlite3所需要文件 sqlite-tools-win-x64-3450000.zipht…...

Sentinel 轨道数据及下载

Sentinel卫星轨道文件在处理Sentinel卫星数据时发挥着关键作用。这些轨道文件包含了有关卫星在轨道上的运动、位置、姿态等信息&#xff0c;对于地理校正、成像几何校正以及多时相分析等方面具有重要作用。以下是Sentinel卫星轨道文件的主要作用&#xff1a; 地理校正&#xff…...

MD5 加密

任务&#xff1a; 接到一个任务&#xff0c;调用对方的接口&#xff0c;内容和密码&#xff0c;需要使用md5进行加密&#xff0c;再发送请求。 参数说明&#xff1a; 参数名称 说明 备注 timespan 时间戳 格式为yyyyMMddHHmmss pwd 密码 此处用原始密码时间戳做MD5加…...

在 Excel 中将列数据用单引号括起来并添加分隔符的解决方案

在 Excel 中&#xff0c;有时候我们需要将某一列的所有值连接在一起&#xff0c;并且每个值用单引号括起来&#xff0c;同时在每个值之间添加逗号和空格。这样的需求在数据处理和导出时比较常见。本文将介绍一种使用 Excel 函数解决这个问题的方法。 解决方案&#xff1a; 方…...

技术硬实力,阿里巴巴为什么要开源Spring Cloud Alibaba?

Spring Cloud Alibaba是阿里巴巴开源的一款高性能的微服务RPC框架&#xff0c;关于Spring Cloud Alibaba的详细介绍我这里就不啰嗦了&#xff0c;大家可以参考官网及相关源码&#xff0c;我这里只是想聊的是“阿里巴巴为什么要开源Spring Cloud Alibaba”&#xff0c;只要追根朔…...

2024 前端高频面试题之 HTML/CSS 篇

【前言】随着市场的逐渐恶劣&#xff0c;通过总结面试题的方式来帮助更多的coder&#xff0c;也是记录自己的学习过程&#xff0c;温故而知新。欢迎各位同胞大大点评补充~ 前端面试题之 HTML/CSS 篇 1、HTML 语义化&#xff1f;2、块级元素&内联样式3、盒子模型的理解&…...

实现将信息作为txt,pdf,图片的形式保存到电脑~

PrintableUtils作为输出信息的工具类&#xff1a; package org.example; import com.itextpdf.text.*; import com.itextpdf.text.Font; import com.itextpdf.text.pdf.PdfWriter; import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; im…...

服务器变矿机,该如何应对?

开始 恶意的挖矿程序会导致服务器cpu的异常占用&#xff0c;很让人讨厌。起初&#xff0c;我只是使用top命令显示出占用cpu不正常的进程&#xff0c;发现其中一个进程占用了百分之九十九点几&#xff0c;然后通过kill -9 <PID>命令干掉它。但总是过不了几天&#xff0c;…...

2018年认证杯SPSSPRO杯数学建模A题(第一阶段)海豚与沙丁鱼全过程文档及程序

2018年认证杯SPSSPRO杯数学建模 探究海豚猎捕时沙丁鱼群的躲避运动模型 A题 海豚与沙丁鱼 原题再现&#xff1a; 沙丁鱼以聚成大群的方式来对抗海豚的捕食。由于水下光线很暗&#xff0c;所以在距离较远时&#xff0c;海豚只能使用回声定位方法来判断鱼群的整体位置&#xf…...

【Webpack】预处理器 - 常用loader介绍

选用合适的loader来处理不同的资源和不同的功能&#xff0c;以下是一些主流的loader&#xff0c;但这并不是全部&#xff0c;因为每时每刻都可能有新的loader 发布到 npm上 babel-loader babe-loader 用来处理ES6并将其编译为ESS&#xff0c;它使我们能够在最新的工程中使用最…...

lodash 的 _.groupBy 函数是怎么实现的?

说在前面 &#x1f388;lodash的_.groupBy函数可以将一个数组按照给定的函数分组&#xff0c;返回一个新对象。该函数接收两个参数&#xff1a;第一个参数是要进行分组的数组&#xff0c;第二个参数是用于分组的函数。该函数会对数组中的每个元素进行处理&#xff0c;返回一个值…...

(2024,ViM,双向 SSM 骨干,序列建模)利用双向状态空间模型进行高效视觉表示学习

Vision Mamba: Efficient Visual Representation Learning with Bidirectional State Space Model 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0.摘要 3. 方法 3.1. 基础知识 3.…...

docker容器和常用命令

1.什么是容器 容器是隔离的环境中运行的一个 进程 , 如果进程结束 , 容器就会停止. 细致: 容器的隔离环境 , 拥有自己的 ip 地址 , 系统文件 , 主机名 , 进程管理 , 相当于一个 mini的系统 2.容器 vs 虚拟机 3.Docker极速上手指南 #1.安装相关依赖. sudo yum install -y …...

【征服redis9】快速征服lua脚本

lua脚本&#xff0c;这个名字总让人想歪&#xff0c;不过老外发明名字&#xff0c;我们只能跟着叫了。这个脚本语言在redis里和Nginx里都有用&#xff0c;所以我们就来看一下。 目录 1 lua的介绍与说明 2 lua的基本语句体验 3.Lua的数据结构和高级特性 1 lua的介绍与说明 …...

vue3.2二次封装antd vue 中的Table组件,原有参数属性不变

vue3.2中的<script setup>语法 在项目中多处使用到表格组件,所以进行了一个基础的封装,主要是通过antd vue 中表格的slots配置项,通过配合插槽来进行封装自定义表格; 这次主要的一个功能是编辑之后变成input框 修改了之后变成完成发送请求重新渲染表格&#xff1a; 子…...

GBASE南大通用分享,如何修改可信上下文

在以下示例中&#xff0c;假设该可信上下文对象 appserver 存在并启用。以下的 ALTER TRUSTED CONTEXT 语句将 appserver 可信上下文对象的对象方式重置为 DISABLE。当其处于该方式时&#xff0c; appserver 可信上下文仍然存在&#xff0c;但是它不能用于存取数据库服务器。 …...

TI SimpleLink平台实战:MSP432+CC3120构建统一嵌入式开发方案

1. 项目概述&#xff1a;为什么我们需要一个统一的嵌入式开发平台&#xff1f;如果你和我一样&#xff0c;在嵌入式行业摸爬滚打了几年&#xff0c;一定会对下面这个场景深有感触&#xff1a;老板今天说要做个带Wi-Fi的智能插座&#xff0c;你吭哧吭哧用ESP32调通了&#xff1b…...

AI 写作一键生成超简单,焦圈儿免费积分福利等你来领

「现在写一篇公众号推文&#xff0c;没三四个小时都下不来。」一位做个人 IP 的朋友跟我抱怨。问题不在于工具太少&#xff0c;而在于门槛太高&#xff0c; 要么你得自己熬夜改稿&#xff0c;要么你得学一堆复杂 Prompt&#xff0c;才能把 AI 伺候好。内容行业正在进入一个悖论…...

手把手复现:用GCC编译选项关闭栈保护,一步步演示缓冲区溢出攻击(附完整代码)

从零构建缓冲区溢出攻击实验&#xff1a;GCC编译选项与漏洞利用实战指南 缓冲区溢出攻击作为系统安全领域的经典课题&#xff0c;至今仍在各类CTF竞赛和实际渗透测试中频繁出现。对于刚接触底层安全的研究者而言&#xff0c;亲手复现一次完整的溢出攻击过程&#xff0c;远比阅读…...

保姆级教程:手把手教你用ROS话题转发搞定CARLA与Autoware的传感器数据对齐

保姆级教程&#xff1a;手把手教你用ROS话题转发搞定CARLA与Autoware的传感器数据对齐 当你在深夜的实验室里终于让CARLA仿真器和Autoware自动驾驶系统分别跑通时&#xff0c;那种成就感可能持续不到30秒——因为接下来你会发现&#xff0c;CARLA输出的传感器数据在Autoware中就…...

百度网盘直链解析:5分钟实现全速下载的完整指南

百度网盘直链解析&#xff1a;5分钟实现全速下载的完整指南 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 还在为百度网盘蜗牛般的下载速度而烦恼吗&#xff1f;今天我要向你…...

8051中断向量冲突与Keil调试问题解决方案

1. 问题现象与背景分析最近在调试基于MCBx51评估板的8051应用程序时&#xff0c;遇到了一个相当诡异的现象&#xff1a;原本在评估版上运行正常的程序&#xff0c;移植到实际硬件后出现了异常行为&#xff0c;甚至导致调试连接中断。最典型的错误提示就是"CONNECTION TO T…...

告别信号失真!手把手教你理解PCIe均衡中的预加重与去加重

PCIe信号均衡技术&#xff1a;预加重与去加重的实战解析 在高速串行通信领域&#xff0c;信号完整性始终是工程师面临的核心挑战。当PCIe总线速率从2.5GT/s演进到32GT/s甚至更高时&#xff0c;信号在传输过程中遭遇的高频衰减和码间干扰(ISI)问题变得尤为突出。预加重(Pre-emph…...

最近被黑产盯上了,用我的帐号发了duboo信息,这不是我发的

...

检索增强生成RAG基础架构与手动模拟

检索增强生成RAG基础 什么是RAG? 检索增强生成(RAG)是指对大型语言模型输出进行优化&#xff0c;使其能够在生成响应之前引用训练数据来源之外的权威知识库。大型语言模型(LLM)用海量数据进行训练&#xff0c;使用数十亿个参数为回答问题、翻译语言和完成句子等任务生成原始输…...

为什么你的Perplexity搜不出科学健身计划?NIST认证信息检索模型原理首度公开

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;为什么你的Perplexity搜不出科学健身计划&#xff1f; Perplexity 作为一款以“实时网络检索大模型推理”为特色的AI搜索工具&#xff0c;其底层机制决定了它并非专为结构化健康决策而优化。当你输入“…...