`

Rsa签名算法详解

阅读更多
Rsa签名算法详解


签名生成规则与验证签名规则如下:

每次生成签名时该算法都会生成一对对应的公钥和私钥对,
所以在应用中一般都会采取使用同一对密钥对进行签名与验签(建议使用静态变量)保证对方验证签名时用的公钥是与你生成签名用的是同一对,否则就不能通过验证
将自己生成的秘钥对中的公钥交给对方用来验证你的签名,私钥用来生成签名
同样的对方也会选定一组密钥对将公钥给你用来验证签名,用他的私钥来生成签名
备注:一般对安全性要求比较高的企业,不仅仅限与用rsa签名来保证安全,还会对rsa签名再次加密,比如本案例就使用了base64来加密和解密,同样大家也可以采取其他的措施来增加安全性比如:aes等

注意事项:
①在获取对方的签名的时候注意是否有系统会自动生成空格(尤其是签名串在换行的时候)
②在拼装对方的加密串转换成byte类型时注意是否跟对方的字符编码保持一致



具体的实现代码如下

package com.xxx.web.util;

import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.HashMap;
import java.util.Map;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

/**
 * @Description: (签名工具类)
 * @author keguan_li 
 * @date 2016年9月22日 
 */
public class RSAUtils {
	
	/** */
	/**
	* 加密算法RSA
	*/
	public static final String KEY_ALGORITHM = "RSA";

	/** */
	/**
	* 签名算法
	*/
	public static final String SIGNATURE_ALGORITHM = "MD5withRSA";//有几种算法MD5withRSA是其中一种
	
	public static final String CHARSET = "UTF-8";

	/**
	 * initKey()生成公钥与私钥
	 * 将生成的公钥与对方互换
	 * 因为每次生成签名的时候公钥和私钥都会随机变化(一对密钥对)
	 * 所以要将自己的私钥和对方的公钥设成静态变量
	 * 保证每次生成签名用的都是同一个私钥
	 */
	
    public static final String privateKey="MIICeAIB2QcCQQCvpSVi/IElHyzvvPxRKsTYz/Z";
    
    public static final String publicKey="MIGfMA0GCSqGSvcuK3QJ3i9ZhBpOoyd4JOwIDAQAB";             
	/**
	 * 生成签名
	 * @param retSignPacket
	 * @param strPriKey
	 * @return
	 * @throws Exception
	 */
	public static String addSign(String retSignPacket) throws Exception{
		byte[] bytesKey = decryptBASE64(privateKey);
		PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(bytesKey);
		KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
		PrivateKey priKey = keyFactory.generatePrivate(pkcs8KeySpec);
		Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
		signature.initSign(priKey);
		signature.update(retSignPacket.getBytes(CHARSET));
		String sign = encryptBASE64(signature.sign());
		return sign;
	}

	/** 
	 * 校验数字签名 
	 *  
	 * @param data 
	 *            加密数据 
	 * @param publicKey 
	 *            公钥 
	 * @param sign 
	 *            数字签名 
	 *  
	 * @return 校验成功返回true 失败返回false 
	 * @throws Exception 
	 *  
	 */
	public static boolean verify(byte[] data, String sign)
			throws Exception {

		// 解密由base64编码的公钥  
		byte[] keyBytes = decryptBASE64(publicKey);
		// 构造X509EncodedKeySpec对象  
		X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
		// KEY_ALGORITHM 指定的加密算法  
		KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
		// 取公钥匙对象  
	    PublicKey pubKey = keyFactory.generatePublic(keySpec);
		Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
		signature.initVerify(pubKey);
		signature.update(data);
		// 验证签名是否正常  
		boolean ret = signature.verify(decryptBASE64(sign));
		System.out.println("验签结果:" + ret);
		return ret;
	}
	
	  public static Map<String, Object> initKey() throws Exception {  
	        KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM);  
	        keyPairGen.initialize(1024);  
	        KeyPair keyPair = keyPairGen.generateKeyPair();  
	        // 公钥  
	        RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();  
	  
	        // 私钥  
	        RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();  
	  
	        Map<String, Object> keyMap = new HashMap<String, Object>(2);  
	  
	        keyMap.put("RSAPublicKey", encryptBASE64(publicKey.getEncoded()));  
	        keyMap.put("RSAPrivateKey", encryptBASE64(privateKey.getEncoded()));  
	        
	        System.out.println("私钥为(生成签名用) : ");
	        String priKey = encryptBASE64(privateKey.getEncoded());
			System.out.println(priKey);
			System.out.println("*****************");
			System.out.println("公钥为(验证签名用) : ");
			String pubKey = encryptBASE64(publicKey.getEncoded());
			System.out.println(pubKey);
	        return keyMap;  
	    }  
	

	/** 
	 * BASE64解密 
	 *  
	 * @param key 
	 * @return 
	 * @throws Exception 
	 */
	@SuppressWarnings("restriction")
	public static byte[] decryptBASE64(String key) throws Exception {
		return (new BASE64Decoder()).decodeBuffer(key);
	}

	/**
	 * BASE64加密
	 * 
	 * @param key
	 * @return
	 * @throws Exception
	 */
	@SuppressWarnings("restriction")
	public static String encryptBASE64(byte[] key) throws Exception {
		return (new BASE64Encoder()).encodeBuffer(key);
	}

	
	public static void main(String[] args) throws Exception {
		initKey();//该方法生成签名,私钥本地用于本地签名,公钥交给对方用于验证你的签名
		addSign("a");//生成签名的方法,a为你要生成签名的签名串,还有用于生成签名的私钥,已写成静态常量
		verify("a".getBytes(),"b");//验证签名的方法,a为你拼接的对方的加密串(在转成byte时字符集编码要与对方的字符集编码保持一致),b为对方的签名,还有对方的公钥我已经将其写成静态常量了
	}
}

0
0
分享到:
评论

相关推荐

    python实现签名RSA算法工程文件

    python实现签名RSA算法工程文件 详解博客地址:https://blog.csdn.net/m0_52316372/article/details/125695341

    Rsa算法详解.docx

    ### RSA算法详解 #### 一、RSA算法简介 RSA算法是一种重要的公钥加密技术,它由Ron Rivest、Adi Shamir和Leonard Adleman三位科学家于1977年提出,因此命名为RSA。这一算法是首个既可用于数据加密也能实现数字签名...

    C#中关于RSA加密算法(案例代码) c#经典案例.pdf

    C#中RSA加密算法详解 在C#程序中,RSA加密算法是一种广泛使用的公钥加密算法。 RSA加密算法于1977年由Ron Rivest、Adi Shamir和Len Adleman在美国麻省理工学院开发的。RSA取名来自开发他们三者的名字。RSA是目前最...

    基于 RSA 算法的数字签名的设计与实现

    第三章 RSA算法详解 RSA算法由Rivest、Shamir和Adleman三位科学家提出,它结合了大整数因子分解的困难性,构建了一种可信赖的加密和签名机制。RSA算法的实现包括两个主要步骤:密钥生成和操作(加密、解密、签名和...

    计算机课程设计rsa数字签名实现

    【RSA数字签名实现详解】 RSA数字签名是一种广泛应用于网络安全中的加密技术,它是基于RSA公钥密码体制的一种非对称加密算法。在这个计算机课程设计中,我们将深入探讨如何使用MATLAB来实现RSA数字签名的生成与验证...

    支付宝rsa签名认证工具

    **支付宝RSA签名认证工具详解** 在电子商务和移动支付领域,安全是至关重要的。支付宝作为中国领先的第三方支付平台,为了确保交易的安全性,采用了一种强大的加密技术——RSA(Rivest-Shamir-Adleman)算法进行...

    用实例讲解RSA加密算法(精)

    RSA 加密算法详解 RSA 加密算法是第一个比较完善的公开密钥算法,它既能用于加密,也能用于数字签名。RSA 以它的三个发明者 Ron Rivest, Adi Shamir, Leonard Adleman 的名字首字母命名,这个算法经受住了多年深入...

    支付宝RSA签名验签工具windows_V1.4

    **支付宝RSA签名验签工具详解** 在现代电子商务和移动支付领域,安全性是至关重要的。支付宝作为全球领先的支付平台,为了确保交易的安全性,采用了RSA加密算法进行签名和验签操作。RSA是一种非对称加密算法,它...

    PHP版RSA加密算法

    **PHP版RSA加密算法详解** RSA(Rivest-Shamir-Adleman)是一种非对称加密算法,广泛应用于网络安全领域,如数据传输保护、数字签名等。在PHP中实现RSA加密,可以帮助开发者增强应用的安全性。本文将详细介绍如何在...

    数字签名算法,c++实现,RSA的算法

    "数字签名算法,c++实现,RSA的算法" 指的是使用C++编程语言实现的一种基于RSA公钥加密算法的数字签名技术。RSA是一种非对称加密算法,它在信息安全领域中广泛应用,特别是在数字签名、数据加密和身份验证等方面。 ...

    RSA加密算法讲义.pdf

    RSA加密算法是一种基于非对称加密技术的加密方法,由罗纳德·李维斯特(Ron Rivest)、阿迪·...RSA算法的应用不仅仅限于加密通信,还广泛应用于数字签名、证书认证等多个方面,是现代信息安全体系不可或缺的一部分。

    RSA.rar_RSAACT.cpp_RSA签名

    **RSA算法详解** RSA是一种非对称加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出,它的全称取自这三位发明者的名字首字母。RSA算法的独特之处在于它使用一对密钥进行加密和解密,即公钥和私钥,...

    Python实现的rsa加密算法详解

    ### Python 实现 RSA 加密算法详解 #### 一、引言 RSA 加密算法是一种非对称加密技术,由 Ron Rivest、Adi Shamir 和 Leonard Adleman 在 1977 年提出,因此取名为 RSA。该算法的安全性基于大数分解的数学难题。在...

    dyl.rar_rsa_rsa加密_rsa加密算法

    **RSA加密算法详解** RSA(Rivest-Shamir-Adleman)是一种非对称加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出,它是现代密码学的基石之一。该算法基于大整数因子分解的困难性,为数据传输提供...

    支付宝RSA签名验签工具 针对mac

    **支付宝RSA签名验签工具详解** 在现代网络安全中,数据的加密和签名是保障交易安全的重要环节。支付宝作为中国领先的第三方支付平台,为开发者提供了RSA签名验签工具,旨在确保交易过程中信息的完整性和不可篡改性...

    支付宝RSA加密签名验签工具

    - 签名与验签:对请求数据生成RSA签名,并验证支付宝返回的签名。 - 文件操作:可能支持对证书和私钥文件的导入导出。 5. **使用步骤** - 安装工具:解压文件并安装在Windows环境下。 - 导入公钥和私钥:商户...

    ASP基于RSA的数字签名的设计与实现(源代码+论文).zip

    **RSA算法详解** RSA(Rivest-Shamir-Adleman)是一种非对称加密算法,由其发明者的名字首字母命名。该算法基于大数因子分解的困难性,用于公钥加密和数字签名。RSA的核心包括一对密钥:公钥和私钥。任何人都可以...

    RSA算法的C++实现

    ### RSA算法的C++实现详解 #### 概述 RSA算法是现代密码学中的一个重要组成部分,它是由Ron Rivest、Adi Shamir和Leonard Adleman三位科学家于1978年提出的,并以其名字首字母命名。RSA算法是首个能够同时支持数据...

    PKCS__1_v2.1_RSA_算法标准+RSA-oaep_spec

    **RSA算法标准与OAEP加密机制详解** RSA(Rivest-Shamir-Adleman)是一种非对称加密算法,由三位美国科学家在1977年提出,是目前应用最广泛的公钥加密技术之一。它基于大整数因子分解的困难性,即对于一个大整数N,...

Global site tag (gtag.js) - Google Analytics