现实中的文件和书信我们可以通过印章来确定它的有效和可信性,那么在计算机网络中传送的报文如何保证呢?这就是数字签名要解决的问题。
数字签名必须能保证以下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实现数字签名(ChinaSEI) 版权所有 郭克华 讲解详细,有实例,并且均可以测试通过!
数字签名 md5数字签名 c实现的md5数字签名 java实现的md5数字签名 数字签名 md5数字签名 c实现的md5数字签名 java实现的md5数字签名
数字签名的java实现代码,仅供参考。附带需要用到的jar包
该源码分为两个包,一个rsa包,一个...SignatureData.java 实现数字签名 VerifySignature.java 实现数字签名验证,并含有主程序(main函数) cn.chd.david.utils BitByte.java 工具类,实现二进制流和十六进制流转换
下面简要描述数字签名和认证的过程。 (1)、生成密钥 为用户随机生成一对密钥:公钥(e,n)和私钥(d,n). (2)、签名过程 a) 计算消息的散列值H(M). b) 用私钥(d,n)加密散列值:s=(H(M)) mod n,签名结果就是s. c) ...
java 国密算法实现,包含SM2 SM3 SM4和数字签名、数字证书的验证以及相应的说明文档
所谓数字签名,是一种用数字通信形式达到签名的功能,目的是证明通信双方的身份、达到确保通信的安全,是一套密码系统。 这里用RSA加密,用MD5形成摘要,验证信息完整性。
java数字签名(签名生成,用证书验证签名)
主要介绍了Java实现的数字签名算法RSA,结合完整实例形式详细分析了RSA算法的相关概念、原理、实现方法及操作技巧,需要的朋友可以参考下
(2)发送方用自己的私钥加密生成的信息生成发送方的数字签名,发送方把这个数字签名作为发送信息的附件和明文信息,一同用接收方的公钥进行加密,将加密后的密文一同发送给接收方; (3)接收方首先把接收到的密文...
这是一个大学老师堆Java 和数字签名的理解 供大家分享
主要讲述数字签名技术及其用Java是如何实现的
自己用JAVA写的数字签名程序,包括说明文档和截图。
Java 实现数字签名的简单例子
介绍了xml数字签名在java中的实现.
此项目基于java标准数字签名验签技术可直接二次开发
在电子支付的过程中,通过实现身份...含身份认证、数字签名和验证及数据加解密等复杂 功能的应用程序,充分利用0121,成熟的开放性技 术和相对低廉的开发维护成本3无疑是开发基于 45678576的电子商务应用的理想选择。
Java语言的数字签名和认证实现代码。包括RSA签名认证、DSA、ECC三种签名认证方式。
本程序用java语言实现数字签名模拟。可以生成公钥和私钥,并要私钥加密,公钥解密,进行验证。模拟数字签名