`
ttkktt
  • 浏览: 27830 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

数字签名介绍和java的实现

阅读更多

 

现实中的文件和书信我们可以通过印章来确定它的有效和可信性,那么在计算机网络中传送的报文如何保证呢?这就是数字签名要解决的问题。

数字签名必须能保证以下3点

1.接收者能够核实发送者对报文的签名。

2.发送者事后不能抵赖对报文的签名。

3.接收者不能伪造对报文的签名。

 

目前已经存在着各种各样数字签名方法。今天为大家介绍一种java中比较容易实现的公开密钥算法来做数字签名。首先介绍一下公开密钥算法实现数字签名的原理:

 

公开密钥算法有以下特点:

1.加密密钥PK对明文X加密后,用解密密钥SK解密即可恢复出原明文。另外加密和解密运算可以互换。

       公式为:Dsk(Epk(X))=X Epk(Dsk(X))=X

2.加密密钥PK是公开的,但通过PK无法推导出SK

 

2个特点正好满足了数字签名的3点要求。下图是用公开密钥算法实现数字签名的原理图

 


有了以上的知识用java来实现这个数字签名就很容易了,通过java.security里面有RSADSA公开密钥算法的实现。

下面是部分代码

generateKeypair方法生成PKSK,你只需要把SK保存下来用

 

public static void generateKeypair() {
		KeyPairGenerator keyGen;
		FileOutputStream out = null;
		try {
			keyGen = KeyPairGenerator.getInstance("DSA");// 指定使用DSA算法
			keyGen.initialize(1024, new SecureRandom());
			KeyPair pair = keyGen.generateKeyPair();
			pk = pair.getPublic();
			sk = pair.getPrivate();

			out = new FileOutputStream(System.getProperty("user.dir")
					+ "\\sk.dat");
			String tmpsk = StringUtil.encodeHex(sk.getEncoded());
			out.write(tmpsk.getBytes());
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				if (out != null)
					out.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

 generateSignature方法通过sk对明文进行签名,返回值是对明文的签名

public String generateSignature(File inFile, PrivateKey privKey) {
		Signature dsa;
		FileInputStream fis = null;
		try {
			dsa = Signature.getInstance("DSA");
			dsa.initSign(privKey);
			fis = new FileInputStream(inFile);

			SAXReader reader = new SAXReader();
			Document doc = reader.read(fis);
			dsa.update(doc.asXML().getBytes());

			byte[] signature = dsa.sign();
			return StringUtil.encodeHex(signature);
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (InvalidKeyException e) {
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (SignatureException e) {
			e.printStackTrace();
		} catch (DocumentException e) {
			e.printStackTrace();
		} finally {
			try {
				if (fis != null)
					fis.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return null;
	}

 validData方法对收到的数据进行签名验证

public boolean validData (byte[] data,String publicKey,String signature) {

		try { // valid the file with public key and signature
			byte[] encodedpubKey = StringUtil.decodeHex(publicKey);

			X509EncodedKeySpec pubKeySpec = new X509EncodedKeySpec(
					encodedpubKey);
			KeyFactory keyFactory;
			keyFactory = KeyFactory.getInstance("DSA");
			PublicKey pubKey = keyFactory.generatePublic(pubKeySpec);
			byte[] sign = StringUtil.decodeHex(signature);

			Signature s = Signature.getInstance("DSA");
			s.initVerify(pubKey);
			s.update(data);
			boolean flag = s.verify(sign);
			return flag;
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (InvalidKeySpecException e) {
			e.printStackTrace();
		} catch (InvalidKeyException e) {
			e.printStackTrace();
		} catch (SignatureException e) {
			e.printStackTrace();
		}
		return false;
	}

 

 

 

  • 大小: 15.5 KB
3
1
分享到:
评论
2 楼 ttkktt 2009-06-04  
StringUtil.decodeHex和encodeHex方法是自己写的对签名转换成Hex码的方法。
1 楼 ivyloo 2009-06-03  
有帮助,谢谢!
另外请问,StringUtil.encodeHex(signature);   在什么包中可取得该方法?

相关推荐

    数字签名的java实现

    下面我们将深入探讨如何在Java中实现数字签名。 1. **数字签名的概念** 数字签名并非是我们在纸上签署的名字,而是通过一种加密算法,将原始数据和发送者的私钥结合,生成的一段信息。这个信息可以被接收者用发送...

    C实现的MD5数字签名和java实现的数字签名。

    C和Java实现的MD5数字签名在原理上是相同的,但具体实现细节因编程语言和库的不同而有所差异。在实际应用中,除了考虑代码实现,还需要关注安全性问题,因为MD5由于存在碰撞攻击的弱点,已不再被认为是一种安全的...

    RSA数字签名Java实现

    该源码分为两个包,一个rsa包,一个...SignatureData.java 实现数字签名 VerifySignature.java 实现数字签名验证,并含有主程序(main函数) cn.chd.david.utils BitByte.java 工具类,实现二进制流和十六进制流转换

    Java实现的数字签名算法RSA完整示例

    下面将详细介绍Java实现的数字签名算法RSA的相关概念、原理、实现方法及操作技巧。 背景介绍 数字签名是一种带有密钥(公钥、私钥)的消息摘要算法。其主要功能是验证数据完整性、认证数据来源、抗否认。在数字...

    RSA数字签名java实现

    下面简要描述数字签名和认证的过程。 (1)、生成密钥 为用户随机生成一对密钥:公钥(e,n)和私钥(d,n). (2)、签名过程 a) 计算消息的散列值H(M). b) 用私钥(d,n)加密散列值:s=(H(M)) mod n,签名结果就是s. c) ...

    数字签名的Java实现

    ### 数字签名的Java实现 #### 一、引言 随着互联网的发展,数据安全变得尤为重要。数字签名技术作为保障信息安全的重要手段之一,在电子商务、电子政务等领域有着广泛的应用。本文主要探讨了基于Java语言的数字...

    java 国密算法实现包含SM2 SM3 SM4和数字签名、数字证书的验证

    下面将详细介绍这些算法以及它们在Java中的实现,以及如何进行数字签名和数字证书的验证。 1. **SM2算法**:SM2是一种基于椭圆曲线密码学(ECC)的公钥加密算法,用于非对称加密。它提供了密钥交换、签名和验证的...

    java数字签名源程序

    Java数字签名源程序是用于实现数据完整性、身份验证和非否认性的关键技术,它在网络安全中扮演着重要角色。本程序是使用JAVA编程语言编写的,遵循了计算机科学中关于密码学的基本原理。数字签名通常与公钥基础设施...

    数字签名技术及其Java实现

    下面简要介绍如何使用Java实现数字签名: 1. **导入必要的库**:需要导入Java安全库(java.security.*),以便使用加密和哈希算法。 2. **生成密钥对**:使用KeyPairGenerator类生成公钥和私钥。 3. **创建签名对象...

    java 数字签名验签

    在Java中,数字签名通常使用Java Cryptography Architecture (JCA) 和 Java Cryptography Extension (JCE) 提供的API来实现。在这个项目中,我们看到它被用作二次开发的基础,意味着它提供了一个可扩展的框架,可以...

    DSS数字签名标准Java实现

    所谓数字签名,是一种用数字通信形式达到签名的功能,目的是证明通信双方的身份、达到确保通信的安全,是一套密码系统。 这里用RSA加密,用MD5形成摘要,验证信息完整性。

    Java SE 6中 XML 数字签名的标准 Java 接口介绍

    本文介绍了数字签名的基本概念及其在Java平台中的实现方式,重点讨论了XML数字签名的标准接口及其在Java SE 6中的应用。通过对具体示例的分析,读者可以更好地理解如何在实际项目中使用Java标准接口来实现XML数字...

    java实现多种方式实现电子签名,项目可直接在eclipse下运行

    在Java中,我们可以利用Java Cryptography Extension (JCE) 和 Java Secure Socket Extension (JSSE) 这些强大的库来实现电子签名功能。 第一种实现方式可能基于RSA公钥加密算法。RSA是一种非对称加密算法,它包括...

    信息摘要,数字签名的java实现

    (2)发送方用自己的私钥加密生成的信息生成发送方的数字签名,发送方把这个数字签名作为发送信息的附件和明文信息,一同用接收方的公钥进行加密,将加密后的密文一同发送给接收方; (3)接收方首先把接收到的密文...

    Java 数字签名和验证

    以上代码展示了Java中如何使用RSA、DSA和ECC实现数字签名和验证的基本流程。实际应用中,可能还需要考虑密钥的存储和管理、证书链的验证等复杂情况。在提供的`JavaSignVerify`压缩包文件中,可能包含了示例代码,...

    Java加密和数字签名编程快速入门.rar_Java加密_java 数字 签名_java 数字签名_数字 签名_数字签名

    通过阅读"Java加密和数字签名编程快速入门",无论是初学者还是有一定经验的开发者,都能掌握Java中加密和数字签名的基本原理和实际应用。"www.pudn.com.txt"可能是提供额外链接或资源的文本文件,而"Java加密和数字...

    用Java实现数字签名一例

    本示例将详细介绍如何在Java中创建和验证数字签名。 首先,数字签名的核心概念是基于公钥加密体系,如RSA或DSA。它涉及到两个密钥:公钥和私钥。私钥由数据的发送者持有,用于创建签名;公钥则被接收者用来验证签名...

Global site tag (gtag.js) - Google Analytics