`
cuisuqiang
  • 浏览: 3962723 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
3feb66c0-2fb6-35ff-968a-5f5ec10ada43
Java研发技术指南
浏览量:3672099
社区版块
存档分类
最新评论

JAVA加密算法实现用例 数字签名

    博客分类:
  • JDK
阅读更多

所谓数字签名就是信息发送者用其私钥对从所传报文中提取出的特征数据(或称数字指纹)进行 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上加密算法的实现用例.doc

    在Java中实现加密算法涉及到多个重要的概念和技术,包括单钥密码体制、消息摘要、Diffie-Hellman密钥一致协议、非对称算法和公钥体系以及数字签名。下面将详细阐述这些知识点。 **1. 单钥密码体制** 单钥密码体制,...

    JAVA上加密算法的实现用例.rar_java 加密_加密_加密算法 java

    四、Java加密算法实现步骤 1. 导入相关类库:如`javax.crypto.Cipher`、`java.security.KeyPairGenerator`等。 2. 选择加密算法:如AES、RSA等。 3. 初始化Cipher对象:根据加密模式(ECB、CBC等)和填充模式...

    JAVA上加密算法的实现用例.rar

    这个RAR压缩包文件“JAVA上加密算法的实现用例”包含了一个PDF文档,很可能是详细介绍了如何在Java环境中应用各种加密算法的实际案例。虽然没有具体的标签提供额外的信息,但我们可以基于通常的加密算法来探讨相关...

    SM2&SM3;&SM4;国密算法Java实现

    我自己按照国密文档通过Java实现SM2密码算法加密/解密、签名验签,SM3密码杂凑算法,SM4分组密码算法ECB、CBC模式加密/解密。 经过详尽的测试过后没有发现问题,但建议大家在使用时仍进行验证。若有问题请及时反馈,...

    JAVA源码很强的Java加密解密算法源码

    综上所述,“JAVA源码很强的Java加密解密算法源码”这一主题涵盖了加密解密的基本概念、应用场景以及具体的实现方法等内容。对于Java开发者而言,深入学习这些知识不仅有助于提升自己的技术水平,还能更好地应对实际...

    java 数字签名 证书加载

    在实际应用中,这个项目可能包含了一个名为ACPSample_QRC的示例代码或者测试用例,这可能是用来演示如何在Java中实现数字签名和证书加载的具体过程。二次开发时,可以参考这个示例,了解如何生成和验证数字签名,...

    信息安全大作业-CA系统的设计和实现源码(电子认证服务系统-数字证书数字签名python语言)+项目详细说明.7z

    这些文档应经过安全的加密(加密算法任选); 3、给通过认证的用户颁发证书; 4、用户密钥丢失时,可以吊销证书,密钥作废。 5、选做且加分项:交互友好的程序界面。 【性能】 能抵抗大多数的常见攻击,如重放攻击、...

    计算机软件-编程源码-java加密解密工具包.zip

    这个“计算机软件-编程源码-java加密解密工具包.zip”文件提供了一组Java实现的加密解密工具,对于开发者来说是一个非常实用的资源。 Java作为跨平台的开发语言,拥有丰富的库和API来支持加密操作。其中,最常用的...

    Java加密解密工具集 JCT v1.0源码包

    - 加密/解密类:实现了各种加密算法的类,提供简单易用的接口。 - 密钥管理类:用于生成、存储和管理密钥对。 - 工具类:包含了加密相关的辅助方法,如随机数生成、编码转换等。 - 测试用例:为了确保代码的正确性,...

    java实现RSA算法

    RSA算法是一种非对称加密算法,广泛应用于网络安全领域,如数据加密、数字签名等。在Java中实现RSA算法,主要涉及到`java.security`和`javax.crypto`这两个包中的类和接口。下面将详细介绍如何在Java中实现RSA算法,...

    RSA算法实现(JAVA)

    RSA算法是一种非对称加密算法,它在信息安全领域有着广泛的应用,特别是在数据加密、数字签名以及安全网络通信中。该算法基于两个大素数的乘积难以分解的数学难题,即大整数因子分解问题。这里我们将深入探讨RSA算法...

    应急广播加密生成签名--Java测试工程.rar

    1. **加密算法**:在“加密机加密”这一标签中,我们可以推断出该工程可能使用了特定的加密算法,如AES(高级加密标准)、RSA(公钥加密技术)或DES(数据加密标准)。这些算法用于将敏感信息转化为密文,保护数据不...

    C# RSA加密、支持JAVA格式公钥私钥

    RSA算法是一种非对称加密算法,它在信息安全领域有着广泛的应用,特别是在网络通信中的数据加密和数字签名。C#和Java作为两种常见的编程语言,都提供了实现RSA算法的库和接口。这个压缩包中的内容看起来是针对C#环境...

    Python兼容Java bouncycastle包的国密sm2加解密方法

    SM2算法是其中一种非对称加密算法,主要用于数字签名、身份认证和数据加密。本主题关注的是如何在Python环境中实现与Java bouncycastle包兼容的SM2加解密方法。 Java bouncycastle库是一个强大的密码学库,提供了...

    java实现国密sm3算法程序

    - **国密**:即国家商用密码算法,是中国制定的一系列加密算法,包括SM2、SM3、SM4等,旨在保障国内网络安全和信息安全。 - **SM3**:是国密算法中的一种密码哈希函数,可将任意长度的消息映射为固定长度的摘要,...

Global site tag (gtag.js) - Google Analytics