所谓数字签名就是信息发送者用其私钥对从所传报文中提取出的特征数据(或称数字指纹)进行 RSA 算法操作,以保证发信人无法抵赖曾发过该信息(即不可抵赖性),同时也确保信息报文在经签名后末被篡改(即完整性)。当信息接收者收到报文后,就可以用发送者的公钥对数字签名进行验证。
在数字签名中有重要作用的数字指纹是通过一类特殊的散列函数(HASH 函数)生成的,对这些 HASH 函数的特殊要求是:
1:接受的输入报文数据没有长度限制;
2:对任何输入报文数据生成固定长度的摘要(数字指纹)输出
3:从报文能方便地算出摘要;
4:难以对指定的摘要生成一个报文,而由该报文反推算出该指定的摘要;
5:两个不同的报文难以生成相同的摘要
代表:DSA
实例:
package test; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.PrivateKey; import java.security.PublicKey; import java.security.Signature; public class DSA { public static void main(String[] args) { try { DSA my = new DSA(); my.run(); } catch (Exception e) { e.printStackTrace(); } } public void run() { // 数字签名生成密钥 // 第一步生成密钥对,如果已经生成过 , 本过程就可以跳过 // 对用户来讲 myprikey.dat 要保存在本地,而 mypubkey.dat 给发布给其它用户 if ((new java.io.File("myprikey.dat")).exists() == false) { if (generatekey() == false) { System.out.println("生成密钥对败"); return; } } // 第二步 , 此用户 // 从文件中读入私钥 , 对一个字符串进行签名后保存在一个文件 (myinfo.dat) 中 // 并且再把 myinfo.dat 发送出去,为了方便数字签名也放进了 myifno.dat 文件中 , 当然也可分别发送 try { ObjectInputStream in = new ObjectInputStream(new FileInputStream("myprikey.dat")); PrivateKey myprikey = (PrivateKey) in.readObject(); in.close(); String myinfo = "这是我的信息"; // 要签名的信息 // 用私钥对信息生成数字签名 Signature signet = Signature.getInstance("DSA"); signet.initSign(myprikey); signet.update(myinfo.getBytes()); byte[] signed = signet.sign(); // 对信息的数字签名 System.out.println("signed( 签名内容 )=" + byte2hex(signed)); // 把信息和数字签名保存在一个文件中 ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("myinfo.dat")); out.writeObject(myinfo); out.writeObject(signed); out.close(); System.out.println("签名并生成文件成功"); } catch (java.lang.Exception e) { e.printStackTrace(); System.out.println("签名并生成文件失败"); } // 第三步 获得信息检查 // 其他人通过公共方式得到此户的公钥和文件 // 其他人用此户的公钥 , 对文件进行检查 , 如果成功说明是此用户发布的信息 . try { ObjectInputStream in = new ObjectInputStream(new FileInputStream("mypubkey.dat")); PublicKey pubkey = (PublicKey) in.readObject(); in.close(); System.out.println(pubkey.getFormat()); in = new ObjectInputStream(new FileInputStream("myinfo.dat")); String info = (String) in.readObject(); byte[] signed = (byte[]) in.readObject(); in.close(); Signature signetcheck = Signature.getInstance("DSA"); signetcheck.initVerify(pubkey); signetcheck.update(info.getBytes()); if (signetcheck.verify(signed)) { System.out.println("info=" + info); System.out.println("签名正常"); } else System.out.println("非签名正常"); } catch (java.lang.Exception e) { e.printStackTrace(); } ; } // 生成一对文件 myprikey.dat 和 mypubkey.dat 私钥和公钥 // 公钥要用户发送 ( 文件 , 网络等方法 ) 给其它用户 , 私钥保存在本地 public boolean generatekey() { try { KeyPairGenerator keygen = KeyPairGenerator.getInstance("DSA"); keygen.initialize(512); KeyPair keys = keygen.genKeyPair(); PublicKey pubkey = keys.getPublic(); PrivateKey prikey = keys.getPrivate(); ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("myprikey.dat")); out.writeObject(prikey); out.close(); System.out.println("写入对象 prikeys ok"); out = new ObjectOutputStream(new FileOutputStream("mypubkey.dat")); out.writeObject(pubkey); out.close(); System.out.println("写入对象 pubkeys ok"); System.out.println("生成密钥对成功"); return true; } catch (java.lang.Exception e) { e.printStackTrace(); System.out.println("生成密钥对失败"); return false; } } public String byte2hex(byte[] b) { String hs = ""; String stmp = ""; for (int n = 0; n < b.length; n++) { stmp = (java.lang.Integer.toHexString(b[n] & 0XFF)); if (stmp.length() == 1) hs = hs + "0" + stmp; else hs = hs + stmp; if (n < b.length - 1) hs = hs + ":"; } return hs.toUpperCase(); } }
请您到ITEYE网站看 java小强 原创,谢谢!
http://cuisuqiang.iteye.com/ !
自建博客地址:http://www.javacui.com/ ,内容与ITEYE同步!
相关推荐
在Java中实现加密算法涉及到多个重要的概念和技术,包括单钥密码体制、消息摘要、Diffie-Hellman密钥一致协议、非对称算法和公钥体系以及数字签名。下面将详细阐述这些知识点。 **1. 单钥密码体制** 单钥密码体制,...
四、Java加密算法实现步骤 1. 导入相关类库:如`javax.crypto.Cipher`、`java.security.KeyPairGenerator`等。 2. 选择加密算法:如AES、RSA等。 3. 初始化Cipher对象:根据加密模式(ECB、CBC等)和填充模式...
这个RAR压缩包文件“JAVA上加密算法的实现用例”包含了一个PDF文档,很可能是详细介绍了如何在Java环境中应用各种加密算法的实际案例。虽然没有具体的标签提供额外的信息,但我们可以基于通常的加密算法来探讨相关...
我自己按照国密文档通过Java实现SM2密码算法加密/解密、签名验签,SM3密码杂凑算法,SM4分组密码算法ECB、CBC模式加密/解密。 经过详尽的测试过后没有发现问题,但建议大家在使用时仍进行验证。若有问题请及时反馈,...
综上所述,“JAVA源码很强的Java加密解密算法源码”这一主题涵盖了加密解密的基本概念、应用场景以及具体的实现方法等内容。对于Java开发者而言,深入学习这些知识不仅有助于提升自己的技术水平,还能更好地应对实际...
在实际应用中,这个项目可能包含了一个名为ACPSample_QRC的示例代码或者测试用例,这可能是用来演示如何在Java中实现数字签名和证书加载的具体过程。二次开发时,可以参考这个示例,了解如何生成和验证数字签名,...
这个“计算机软件-编程源码-java加密解密工具包.zip”文件提供了一组Java实现的加密解密工具,对于开发者来说是一个非常实用的资源。 Java作为跨平台的开发语言,拥有丰富的库和API来支持加密操作。其中,最常用的...
- 加密/解密类:实现了各种加密算法的类,提供简单易用的接口。 - 密钥管理类:用于生成、存储和管理密钥对。 - 工具类:包含了加密相关的辅助方法,如随机数生成、编码转换等。 - 测试用例:为了确保代码的正确性,...
RSA算法是一种非对称加密算法,广泛应用于网络安全领域,如数据加密、数字签名等。在Java中实现RSA算法,主要涉及到`java.security`和`javax.crypto`这两个包中的类和接口。下面将详细介绍如何在Java中实现RSA算法,...
RSA算法是一种非对称加密算法,它在信息安全领域有着广泛的应用,特别是在数据加密、数字签名以及安全网络通信中。该算法基于两个大素数的乘积难以分解的数学难题,即大整数因子分解问题。这里我们将深入探讨RSA算法...
1. **加密算法**:在“加密机加密”这一标签中,我们可以推断出该工程可能使用了特定的加密算法,如AES(高级加密标准)、RSA(公钥加密技术)或DES(数据加密标准)。这些算法用于将敏感信息转化为密文,保护数据不...
RSA算法是一种非对称加密算法,它在信息安全领域有着广泛的应用,特别是在网络通信中的数据加密和数字签名。C#和Java作为两种常见的编程语言,都提供了实现RSA算法的库和接口。这个压缩包中的内容看起来是针对C#环境...
SM2算法是其中一种非对称加密算法,主要用于数字签名、身份认证和数据加密。本主题关注的是如何在Python环境中实现与Java bouncycastle包兼容的SM2加解密方法。 Java bouncycastle库是一个强大的密码学库,提供了...
- **国密**:即国家商用密码算法,是中国制定的一系列加密算法,包括SM2、SM3、SM4等,旨在保障国内网络安全和信息安全。 - **SM3**:是国密算法中的一种密码哈希函数,可将任意长度的消息映射为固定长度的摘要,...
RSA算法是一种非对称加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出,是目前最广为应用的公钥加密算法。其核心特点是使用一对密钥,一个公开,任何人都可以获取,称为公钥;另一个保密,只有接收...