当前位置: 首页 > 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;但是它不能用于存取数据库服务器。 …...

浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)

✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义&#xff08;Task Definition&…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

Swagger和OpenApi的前世今生

Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章&#xff0c;二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑&#xff1a; &#x1f504; 一、起源与初创期&#xff1a;Swagger的诞生&#xff08;2010-2014&#xff09; 核心…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版

7种色调职场工作汇报PPT&#xff0c;橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版&#xff1a;职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现指南针功能

指南针功能是许多位置服务应用的基础功能之一。下面我将详细介绍如何在HarmonyOS 5中使用DevEco Studio实现指南针功能。 1. 开发环境准备 确保已安装DevEco Studio 3.1或更高版本确保项目使用的是HarmonyOS 5.0 SDK在项目的module.json5中配置必要的权限 2. 权限配置 在mo…...