现实中的文件和书信我们可以通过印章来确定它的有效和可信性,那么在计算机网络中传送的报文如何保证呢?这就是数字签名要解决的问题。
数字签名必须能保证以下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里面有RSA和DSA公开密钥算法的实现。
下面是部分代码
generateKeypair方法生成PK和SK,你只需要把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
分享到:
相关推荐
下面我们将深入探讨如何在Java中实现数字签名。 1. **数字签名的概念** 数字签名并非是我们在纸上签署的名字,而是通过一种加密算法,将原始数据和发送者的私钥结合,生成的一段信息。这个信息可以被接收者用发送...
C和Java实现的MD5数字签名在原理上是相同的,但具体实现细节因编程语言和库的不同而有所差异。在实际应用中,除了考虑代码实现,还需要关注安全性问题,因为MD5由于存在碰撞攻击的弱点,已不再被认为是一种安全的...
该源码分为两个包,一个rsa包,一个...SignatureData.java 实现数字签名 VerifySignature.java 实现数字签名验证,并含有主程序(main函数) cn.chd.david.utils BitByte.java 工具类,实现二进制流和十六进制流转换
下面将详细介绍Java实现的数字签名算法RSA的相关概念、原理、实现方法及操作技巧。 背景介绍 数字签名是一种带有密钥(公钥、私钥)的消息摘要算法。其主要功能是验证数据完整性、认证数据来源、抗否认。在数字...
下面简要描述数字签名和认证的过程。 (1)、生成密钥 为用户随机生成一对密钥:公钥(e,n)和私钥(d,n). (2)、签名过程 a) 计算消息的散列值H(M). b) 用私钥(d,n)加密散列值:s=(H(M)) mod n,签名结果就是s. c) ...
### 数字签名的Java实现 #### 一、引言 随着互联网的发展,数据安全变得尤为重要。数字签名技术作为保障信息安全的重要手段之一,在电子商务、电子政务等领域有着广泛的应用。本文主要探讨了基于Java语言的数字...
下面将详细介绍这些算法以及它们在Java中的实现,以及如何进行数字签名和数字证书的验证。 1. **SM2算法**:SM2是一种基于椭圆曲线密码学(ECC)的公钥加密算法,用于非对称加密。它提供了密钥交换、签名和验证的...
Java数字签名源程序是用于实现数据完整性、身份验证和非否认性的关键技术,它在网络安全中扮演着重要角色。本程序是使用JAVA编程语言编写的,遵循了计算机科学中关于密码学的基本原理。数字签名通常与公钥基础设施...
下面简要介绍如何使用Java实现数字签名: 1. **导入必要的库**:需要导入Java安全库(java.security.*),以便使用加密和哈希算法。 2. **生成密钥对**:使用KeyPairGenerator类生成公钥和私钥。 3. **创建签名对象...
在Java中,数字签名通常使用Java Cryptography Architecture (JCA) 和 Java Cryptography Extension (JCE) 提供的API来实现。在这个项目中,我们看到它被用作二次开发的基础,意味着它提供了一个可扩展的框架,可以...
所谓数字签名,是一种用数字通信形式达到签名的功能,目的是证明通信双方的身份、达到确保通信的安全,是一套密码系统。 这里用RSA加密,用MD5形成摘要,验证信息完整性。
本文介绍了数字签名的基本概念及其在Java平台中的实现方式,重点讨论了XML数字签名的标准接口及其在Java SE 6中的应用。通过对具体示例的分析,读者可以更好地理解如何在实际项目中使用Java标准接口来实现XML数字...
在Java中,我们可以利用Java Cryptography Extension (JCE) 和 Java Secure Socket Extension (JSSE) 这些强大的库来实现电子签名功能。 第一种实现方式可能基于RSA公钥加密算法。RSA是一种非对称加密算法,它包括...
(2)发送方用自己的私钥加密生成的信息生成发送方的数字签名,发送方把这个数字签名作为发送信息的附件和明文信息,一同用接收方的公钥进行加密,将加密后的密文一同发送给接收方; (3)接收方首先把接收到的密文...
以上代码展示了Java中如何使用RSA、DSA和ECC实现数字签名和验证的基本流程。实际应用中,可能还需要考虑密钥的存储和管理、证书链的验证等复杂情况。在提供的`JavaSignVerify`压缩包文件中,可能包含了示例代码,...
通过阅读"Java加密和数字签名编程快速入门",无论是初学者还是有一定经验的开发者,都能掌握Java中加密和数字签名的基本原理和实际应用。"www.pudn.com.txt"可能是提供额外链接或资源的文本文件,而"Java加密和数字...
本示例将详细介绍如何在Java中创建和验证数字签名。 首先,数字签名的核心概念是基于公钥加密体系,如RSA或DSA。它涉及到两个密钥:公钥和私钥。私钥由数据的发送者持有,用于创建签名;公钥则被接收者用来验证签名...