SHA256withRSA签名验签

基于openssl SHA256WithRSA签名和验签过程 openssl, SHA256WithRSA,签名和验签 阅读详情

直接上代码:

RSA.java

 


import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.HashMap;
import java.util.Map;

public class RSA {
    public static final String KEY_ALGORITHM = "RSA";
    public static final String CIPHER_ALGORITHM = "RSA/ECB/PKCS1Padding";
    public static final String PUBLIC_KEY = "publicKey";
    public static final String PRIVATE_KEY = "privateKey";
    public static final int KEY_SIZE = 2048;
    /**
     * 生成密钥对
     * 
     * @return
     */
    public static Map<String, byte[]> generateKeyBytes() {

        try {
            KeyPairGenerator keyPairGenerator = KeyPairGenerator
                    .getInstance(KEY_ALGORITHM);
            keyPairGenerator.initialize(KEY_SIZE);
            KeyPair keyPair = keyPairGenerator.generateKeyPair();
            RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
            RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
            Map<String, byte[]> keyMap = new HashMap<String, byte[]>();
            keyMap.put(PUBLIC_KEY, publicKey.getEncoded());
            keyMap.put(PRIVATE_KEY, privateKey.getEncoded());
            return keyMap;
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 还原公钥
     * 
     * @param keyBytes
     * @return
     */
    public static PublicKey restorePublicKey(byte[] keyBytes) {
        X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(keyBytes);
        try {
            KeyFactory factory = KeyFactory.getInstance(KEY_ALGORITHM);
            PublicKey publicKey = factory.generatePublic(x509EncodedKeySpec);
            return publicKey;
        } catch (NoSuchAlgorithmException | InvalidKeySpecException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 还原私钥
     * 
     * @param keyBytes
     * @return
     */
    public static PrivateKey restorePrivateKey(byte[] keyBytes) {
        PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(
                keyBytes);
        try {
            KeyFactory factory = KeyFactory.getInstance(KEY_ALGORITHM);
            PrivateKey privateKey = factory
                    .generatePrivate(pkcs8EncodedKeySpec);
            return privateKey;
        } catch (NoSuchAlgorithmException | InvalidKeySpecException e) {
            e.printStackTrace();
        }
        return null;
    }
}

Demo.java

 

 

import java.security.InvalidKeyException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.SignatureException;
import java.util.Map;

public class Demo {

	public static final String SIGNATURE_ALGORITHM = "SHA256withRSA";
	public static final String ENCODE_ALGORITHM = "SHA-256";
	public static final String PLAIN_TEXT = "test string";

	public static void main(String[] args) {
		// 公私钥对
		Map<String, byte[]> keyMap = RSA.generateKeyBytes();
		PublicKey publicKey = RSA.restorePublicKey(keyMap.get(RSA.PUBLIC_KEY));
		PrivateKey privateKey = RSA.restorePrivateKey(keyMap.get(RSA.PRIVATE_KEY));
		// 签名
		byte[] sing_byte = sign(privateKey, PLAIN_TEXT);
		// 验签
		verifySign(publicKey, PLAIN_TEXT, sing_byte);
	}

	/**
	 * 签名
	 * 
	 * @param privateKey
	 *            私钥
	 * @param plain_text
	 *            明文
	 * @return
	 */
	public static byte[] sign(PrivateKey privateKey, String plain_text) {
		MessageDigest messageDigest;
		byte[] signed = null;
		try {
			messageDigest = MessageDigest.getInstance(ENCODE_ALGORITHM);
			messageDigest.update(plain_text.getBytes());
			byte[] outputDigest_sign = messageDigest.digest();
			System.out.println("SHA-256加密后-----》" +bytesToHexString(outputDigest_sign));
			Signature Sign = Signature.getInstance(SIGNATURE_ALGORITHM);
			Sign.initSign(privateKey);
			Sign.update(outputDigest_sign);
			signed = Sign.sign();
			System.out.println("SHA256withRSA签名后-----》" + bytesToHexString(signed));
		} catch (NoSuchAlgorithmException | InvalidKeyException | SignatureException e) {
			e.printStackTrace();
		}
		return signed;
	}

	/**
	 * 验签
	 * 
	 * @param publicKey
	 *            公钥
	 * @param plain_text
	 *            明文
	 * @param signed
	 *            签名
	 */
	public static boolean verifySign(PublicKey publicKey, String plain_text, byte[] signed) {

		MessageDigest messageDigest;
		boolean SignedSuccess=false;
		try {
			messageDigest = MessageDigest.getInstance(ENCODE_ALGORITHM);
			messageDigest.update(plain_text.getBytes());
			byte[] outputDigest_verify = messageDigest.digest();
			//System.out.println("SHA-256加密后-----》" +bytesToHexString(outputDigest_verify));
			Signature verifySign = Signature.getInstance(SIGNATURE_ALGORITHM);
			verifySign.initVerify(publicKey);
			verifySign.update(outputDigest_verify);
			SignedSuccess = verifySign.verify(signed);
			System.out.println("验证成功?---" + SignedSuccess);
			
		} catch (NoSuchAlgorithmException | InvalidKeyException | SignatureException e) {
			e.printStackTrace();
		}
		return SignedSuccess;
	}

	/**
	 * bytes[]换成16进制字符串
	 * 
	 * @param src
	 * @return
	 */
	public static String bytesToHexString(byte[] src) {
		StringBuilder stringBuilder = new StringBuilder("");
		if (src == null || src.length <= 0) {
			return null;
		}
		for (int i = 0; i < src.length; i++) {
			int v = src[i] & 0xFF;
			String hv = Integer.toHexString(v);
			if (hv.length() < 2) {
				stringBuilder.append(0);
			}
			stringBuilder.append(hv);
		}
		return stringBuilder.toString();
	}
}

 

 

 

 

 

 

 

SHA256WithRSA签名和验签过程 SHA256算法:哈希值长度是256位的一种哈希算法。 哈希算法:一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。 RSA加密算法是一种非对称加密算法。 以下是基于OpenSSL实现的SHA256WithRSA签名和验签功能 RSASign.h #include <openssl/objects.h> #include <openssl/rsa.h> #... 阅读详情

相关推荐

java实现SHA256withRSA公、私钥生成以及签名和验签

SHA256withRSA公、私钥生成以及签名和验签 直接上代码 import java.security.KeyFactory; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.PrivateKey; import java.security.PublicKey; ...

qq_35673036的博客 1万+

RSA SHA256withRSA 对应的验签方式

当加密方式 RSA //验签时用 java.security.Signature signetcheck = Signature.getInstance("MD5withRSA"); 加密方式 SHA256withRSA //验签时用 java.security.Signature signetcheck = Signature.getInstance("SHA256withRSA");

weixin_42633835的博客 996

C#中使用BouncyCastle实现MD5withRSA与SHA256withRSA签名验签

数字签名是保障数据完整性与身份认证的核心技术,其原理基于非对称加密与哈希算法的结合。通过私钥对数据的哈希值进行加密生成签名,公钥则用于验证签名与原始数据哈希值的一致性。这项技术在金融支付、物联网通信等需要强安全保证的场景中具有重要价值。当在C#开发中需要实现特定标准的签名算法如MD5withRSA或SHA256withRSA时,.NET原生库可能无法提供足够的灵活性。BouncyCastle.Crypto作为强大的第三方加密库,提供了对PKCS#1等标准的细粒度控制,能够精准实现这些算法,并确保与Java、

weixin_33935636的博客 316

常见签名算法之SHA256withRSA

概述 在https://blog.csdn.net/chinoukin/article/details/100934995章节中,我介绍了用Hmac算法用于签名算法中的方法,本章节中将对常见的签名算法“SHA256withRSA”做一下分析与介绍。 此文由来 当我在使用springcloud的oauth2时,经常会用到jwt作为用户身份的确认和鉴权。而我们知道jwt是由三部分...

chinoukin的博客 5万+

C#实战:从零实现SHA256WithRSA签名验签,解决API对接核心安全难题

数字签名是现代信息安全的核心技术之一,它基于非对称加密和哈希算法,为数据完整性与身份认证提供了可靠保障。其原理是通过私钥对数据的哈希值进行加密生成签名,接收方则使用公钥解密并比对哈希值来验证。这项技术在保障数据传输安全、防止篡改和身份伪造方面具有重要价值,广泛应用于支付网关对接、开放平台API调用以及需要高安全性的内部系统通信等场景。本文聚焦于工程实践中高频出现的SHA256WithRSA组合,针对C#开发者常遇到的PEM证书加载、密钥格式处理及编码一致性等痛点,提供从原理到代码的完整解决方案,帮助开发者彻

weixin_32234493的博客 302

PHP的SHA256WithRSA签名和验签

//生成 sha256WithRSA 签名 function getSign($content, $privateKey){ $privateKey = "-----BEGIN RSA PRIVATE KEY-----\n" . wordwrap($privateKey, 64, "\n", true) . "\n-----END RSA PRIVATE K...

食鱼酱的博客 1万+

SHA256withRSA 签名与验签

package com.bfb.gateway.payment.unionpayat.handler.utils;import java.io.File;import java.io.FileInputStream;import java.security.KeyStore;import java.security.PrivateKey;import java.security.PublicKey...

zhl15545506227的博客 2万+

Delphi 7实现SHA256withRSA签名验签:CryptoAPI方案详解与实战

非对称加密是现代软件安全的核心技术之一,它基于公钥和私钥的数学原理,实现了数据加密、数字签名等关键功能。RSA作为最经典的非对称算法,其安全性依赖于大数分解的难度,结合哈希算法可生成数字签名,确保数据的完整性和身份认证。在工程实践中,SHA256withRSA已成为对接支付接口、实现安全登录、配置文件防篡改等场景的行业标准。对于使用Delphi 7这类经典开发环境维护遗留系统的开发者而言,实现该标准面临原生组件支持不足的挑战。本文聚焦于通过Windows CryptoAPI这一系统级方案,在Delphi 7

weixin_29323049的博客 334

SHA256withRSA证书签名,私钥签名/公钥验签

证书签名 package test; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.securi...

ddak56357的博客 2511

C# SHA256WithRSA加密帮助类

这篇文章接上一篇一起用,主要是实现SHA1/SHA256和RSA加解密算法。

星火燎猿 2953

SHA256withRSA-Delphi7.rar

SHA256加密

java sha256withrsa_SHA256withRSA证书签名,私钥签名/公钥验签

packagetest;importjava.io.File;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.IOException;importjava.io.InputStream;importjava.security.KeyStore;importjava.security.Pr...

weixin_39854440的博客 933

Unity工业数据可视化:基于ModbusTCP的实时数据通信实战

本文详细介绍了在Unity中实现工业数据可视化的核心方法,重点讲解了基于ModbusTCP协议与PLC等工业设备进行实时数据通信的实战流程。内容涵盖NModbus库的集成、Modbus Slave模拟器的使用、TCP连接的建立与多线程安全通信、数据读写与解析,以及如何将实时数据驱动3D场景,为构建工业数字孪生与监控系统提供完整解决方案。

ol7890123的博客 554

使用SHA256WithRSA来签名和验签(.NET/C#)

RSACryptoServiceProvider does work with SHA2-based signatures, but you have to invest some effort into it. When you use a certificate to get your RSACryptoServiceProvider it really matters what's the...

weixin_34375233的博客 6923

Python爬虫实战:5分钟搞定Web of Science文献批量导出与解析(附完整代码)

本文提供了一套利用Python爬虫技术,快速实现Web of Science文献批量提取与解析的完整方案。通过解析官方导出的HTML文件,结合BeautifulSoup和pandas库,可将文献数据自动转换为结构化的Excel/CSV表格,帮助科研人员高效管理文献信息,节省大量手动整理时间。

weixin_29050513的博客 1165

强化学习环境Gym库的介绍

Gym是一个用于进行强化学习实验的开源库,它提供了一个仿真环境,内置了多种仿真游戏,例如出租车游戏、悬崖游戏等,不同的游戏所用的网格、规则、奖励(reward)都不一样,适合为强化学习做测试。(1) 多种环境:Gym库内置了上百种实验环境,包括算法环境、简单文本环境、经典控制环境、Atari游戏环境、MuJoCo环境和机械控制环境等。(2) Gym提供多种环境供我们使用,这里以一个简单的CartPole-v0为例,首先导入gym库,然后创建一个CartPole-v0环境,通过调用gym.make方法实现。

ahah12345678的博客 2148

C#实现Java SHA256WithRSA签名验签的兼容方案与原理剖析

数字签名是保障数据传输安全、实现身份认证与防篡改的核心密码学技术,其基础原理基于非对称加密算法与哈希函数的结合。RSA作为最广泛使用的非对称算法,通过私钥签名、公钥验签的机制确保数据完整性与来源可信性。在工程实践中,不同技术生态对PKCS#1等标准的实现细节差异常导致跨平台互通问题,例如Java与.NET在SHA256WithRSA签名流程中对DigestInfo结构和填充模式的处理不一致。本文聚焦**签名验签**与**跨平台兼容**两大技术热点,深入解析Java默认实现与.NET RSA类的底层差异,提供

diyudong4681的博客 349

RexUniNLU零样本通用自然语言理解:nlp_deberta_rex-uninlu_chinese-base模型实战解析

本文深入解析了RexUniNLU零样本通用自然语言理解模型(nlp_deberta_rex-uninlu_chinese-base)的实战应用。通过详细的环境配置、模型加载及实战案例,展示了该模型在零样本场景下的强大能力,如实体识别和复杂关系抽取,显著提升NLP任务效率。

weixin_29088655的博客 251

java sha256withrsa_SHA256withRSA 签名与验签

package com.bfb.gateway.payment.unionpayat.handler.utils;import java.io.File;import java.io.FileInputStream;import java.security.KeyStore;import java.security.PrivateKey;import java.security.PublicKey...

weixin_30359265的博客 2186

从拧螺丝到精密装配:三菱伺服电机扭矩控制在工业自动化中的实战解析

本文深入解析三菱伺服电机扭矩控制在工业自动化中的实战应用,重点介绍MR-J4系列伺服系统的高精度扭矩响应技术。从螺丝紧固到精密装配,详细讲解扭矩控制模式的选择、硬件配置、参数设置及典型故障排查方案,帮助工程师提升生产效率和产品质量。

weixin_29186249的博客 471

Oracle EBS(R12+)通过Multi-Org 多组织架构、Multi-Ledger 多账簿、SLA 子分类账会计、多币种引擎、多会计政策并行五大核心能力,为跨国企业提供一体化、自动化、合规的

Oracle EBS(R12+)提供全球会计核算解决方案,通过Multi-Org多组织架构实现跨国集团数据隔离与共享,支持四层组织结构(业务组→法律实体→经营单位→库存组织)。Multi-Ledger多账簿功能允许一笔业务多准则自动核算,包含主账簿、辅助账簿和报告币种。系统内置多币种处理引擎,覆盖全流程货币业务,支持自动重估、再计量和折算。通过SLA子分类账会计实现多会计政策并行处理,满足不同国家会计准则和税制要求。该方案可同时支持本地法定、集团合并及管理分析需求,实现全球财务数据集中管理,提升合规性和运营

金牌架构师 553

delphi RSA签名与验签(支持SHA1WithRSA(RSA1)、SHA256WithRSA(RSA2)和MD5WithRSA签名与验签,秘钥格式支持PKCS8和PKC), D7~XE10可用

【delphi RSA签名与验签】支持3种方式签名与验签(SHA1WithRSA(RSA1)、SHA256WithRSA(RSA2)和MD5WithRSA),秘钥格式支持PKCS8和PKCS1,支持2种字符集选择(UTF-8和GBK),D7~XE10可用

芝麻卖瓜的博客 3238

【笔记】1.1 拉伸力-伸长(延伸)曲线和应力-应变曲线

过了B点后,由于颈缩导致的截面半径迅速减小,导致真应力迅速上升,切线斜率明显提高。假设试样原长为ε,在力的作用下伸长了dε,那么根据应变的定义,瞬时的应变为dε/ε,总的应变为瞬时应变的累计,假设在瞬时的条件下,试样受载荷变化量为 ΔF ,变化的截面积为 ΔA ,而且ΔA→0,那么瞬时的。由于原始的截面积和原始的标距长度为常数,故得到的曲线长相和拉伸力-伸长(延伸)曲线没啥区别。因为用的都是原始的截面积和原始的标距长度,故称为公称应力和公称应变。如果拉伸力→应力,伸长长度→应变,就会得到应力-应变曲线。

m0_73676887的博客 5270
上一篇: 【Java TCP/IP Socket】服务端的实现(可连接oracle数据库)
下一篇: Windows下使用java调用OpenSSL(无需安装OpenSSL)
Liu_Dag
博客等级 码龄10年 37粉丝 21原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Liu_Dag

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值