`

Java密码学(5)——数字签名算法

 
阅读更多

数字签名算法是一种带有密钥的消息摘要算法,数字签名算法=非对称加密算法+消息摘要算法。

数字签名算法能验证数据的完整性、认证数据来源、起到抗否认作用。

数字签名算法包含签名和验签两项操作,遵循“私钥签名,公钥验签”的原则。签名时需要私钥和待签名数据,验签时需要公钥、签名值和待签名数据。

数字签名算法主要包括RSA、DSA、CDSA。

 

  • RSA算法

模型分析

代码实现

	/**
	 * RSA私钥签名
	 * @param data
	 * @param key
	 * @return
	 */
	public static String RSAsign(String data, String key){
		try {
			//取得私钥  
	        PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(Hex.decodeHex(key.toCharArray()));  
	        KeyFactory keyFactory = KeyFactory.getInstance("RSA");  
	        PrivateKey privateKey = keyFactory.generatePrivate(pkcs8KeySpec);  
			
			Signature signature = Signature.getInstance("MD5withRSA");
			signature.initSign(privateKey);
			signature.update(Hex.decodeHex(data.toCharArray()));
			return Hex.encodeHexString(signature.sign());
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (InvalidKeyException e) {
			e.printStackTrace();
		} catch (DecoderException e) {
			e.printStackTrace();
		} catch (InvalidKeySpecException e) {
			e.printStackTrace();
		} catch (SignatureException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	/**
	 * RSA公钥验签
	 * @param data
	 * @param key
	 * @param sign
	 * @return
	 */
	public static boolean RSAverify(String data, String key, String sign){
		try {
			//取得公钥  
	        X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(Hex.decodeHex(key.toCharArray()));  
	        KeyFactory keyFactory = KeyFactory.getInstance("RSA");  
	        PublicKey publicKey = keyFactory.generatePublic(x509KeySpec);  
			
			Signature signature = Signature.getInstance("MD5withRSA");
			signature.initVerify(publicKey);
			signature.update(Hex.decodeHex(data.toCharArray()));
			return signature.verify(Hex.decodeHex(sign.toCharArray()));
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (InvalidKeyException e) {
			e.printStackTrace();
		} catch (DecoderException e) {
			e.printStackTrace();
		} catch (InvalidKeySpecException e) {
			e.printStackTrace();
		} catch (SignatureException e) {
			e.printStackTrace();
		}
		return false;
	}

 测试代码

		String[] key = initRSAKey();
		String publicKey = key[0];
		System.out.println("RSA公钥:"+publicKey);
		String privateKey = key[1];
		System.out.println("RSA私钥:"+privateKey);
		String data = "404142434445464748494a4b4c4d4e4f";
		System.out.println("原始数据:"+data);
		String sign = RSAsign(data, privateKey);
		System.out.println("私钥签名结果:"+sign);
		System.out.println("公钥验签结果:"+RSAverify(data, publicKey, sign));

 运行结果

RSA公钥:30819f300d06092a864886f70d010101050003818d00308189028181008290eef003da573054a8b0437d4c78d19a723510ad9f5a7bba2023a9643a70760cf4cca77cf49228b92d4e6b837b01d6712bcc22335d9627defbb2211640c5320a5b52bd98a1fd06a3923904fa7a50797a27886e442c50565c929a2be004f2ef1bec1fa3e2b1975b46b5a025b6aaf0754a52b28de66b206a79072a3952471b390203010001
RSA私钥:30820276020100300d06092a864886f70d0101010500048202603082025c020100028181008290eef003da573054a8b0437d4c78d19a723510ad9f5a7bba2023a9643a70760cf4cca77cf49228b92d4e6b837b01d6712bcc22335d9627defbb2211640c5320a5b52bd98a1fd06a3923904fa7a50797a27886e442c50565c929a2be004f2ef1bec1fa3e2b1975b46b5a025b6aaf0754a52b28de66b206a79072a3952471b3902030100010281803d1081df993db5c771e0cf475143c1c1ee24f9f289f15c853f60a6ad23a63d50c8f07902e06b162c9ba6b7e58ac1adf3584cae955446b1e285e45bc423bf393a66ca470e870f3244d01994207a563aedebe7a892a22c888d46a7084c356f86278efc3808c51043a1900d740719c90d0ae2773f4f7a9e2a08509b0a917469944d024100dead217c4dc8f087690c63ae3de4b29f24fd8181c0bcc7e921e84cab3b1df4bb1e60489f4a35ecdade8c6d950513d7a0d4c948b77b53eb65d3a61fc44b3aa793024100961b013726e71a472203b4b2c7fccbd02b683f039bec30b085303a9dcdb45b8fe54b2b64114ddd9e2b03df1090d947c9323e2bd9c27f8fa2651f99caa7421983024100d7d4739a6a4293708c4f67e6a1332436c0c1be5f2793532912a67879978947867ec0d06324a8f3f488b51019da9c0aea6694da988d3f1ff0c89e42381ebab16502402ce15824b05a0aee57ca39ddf693ac30cab9b9958faa38089f5a033ca9839298dc9af417506132b116f56a5d9ea188a82c809045e4b495329dffabd0fedf71970240773e796537cd98a0ad37979755c574c194e5109e7d14ae02dd34a001bb813ba399ee9ffc0893508d256c95162a810a67e03a1b02b7cf05a2f94ceee450c5890a
原始数据:404142434445464748494a4b4c4d4e4f
私钥签名结果:6e4c5f42cde60360aed945506ba13016ed8b107ad1a6b1b45890cde4422ce385806edc543e9abd67a72eb4ac86480b9e7b0db86ca15750b4207400a4aebb1325e66e564f3a73944bd27824f2621fb243366cc9d1ade75922029dc47614d738476f5e9219542181f91027502d1e7280654502da65db554d5248691f5736ad4970
公钥验签结果:true

 

所有代码示例:http://dl.iteye.com/topics/download/d0633e7f-c0da-35c8-9a01-7f81e26cefec

  • 大小: 28.5 KB
分享到:
评论

相关推荐

    java源码包---java 源码 大量 实例

     关于数字签名:产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据传送给签名对象(须在初始化之后),用公钥...

    JAVA上百实例源码以及开源项目

     关于数字签名:产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据传送给签名对象(须在初始化之后),用公钥...

    JAVA上百实例源码以及开源项目源代码

     关于数字签名:产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据传送给签名对象(须在初始化之后),用公钥...

    java源码包4

     关于数字签名:产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据传送给签名对象(须在初始化之后),用公钥...

    java源码包3

     关于数字签名:产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据传送给签名对象(须在初始化之后),用公钥...

    java源码包2

     关于数字签名:产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据传送给签名对象(须在初始化之后),用公钥...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    Java 数字签名、数字证书生成源码 2个目标文件 摘要:JAVA源码,系统相关,数字签名,数字证书 Java 数字签名、数字证书的相关实例。 关于数字签名:产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    Java 数字签名、数字证书生成源码 2个目标文件 摘要:JAVA源码,系统相关,数字签名,数字证书 Java 数字签名、数字证书的相关实例。 关于数字签名:产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用...

Global site tag (gtag.js) - Google Analytics