当前位置:文档之家› 用Java实现数字签名

用Java实现数字签名


第 12 章 数据的加密保护
以下代码是用 Java 语言实现将一个字符串“郭克华_安全编程技术”,利用 DSA 算法 进行数字签名并且验证的过程,同样,由于本书不是讲解某种语言本身,所以在这里略过 Java 加密体系的讲解,在代码中如果出现新的 API,读者可以参考 Java 文档。
P12_02.java import java.security.InvalidKeyException; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.NoSuchAlgorithmException; import java.security.PrivateKey; import java.security.PublicKey; import java.security.Signature; import java.security.SignatureException;
x2x
第 12 章 数据的加密保护
(2) 将收到的消息摘要 H(M)用发送方公开密钥进行解密; (3) 两者进行比较,不一致则发出否决消息,否则接受信息。
〖2-1〗用RSA实现数字签名
以下代码是用 Java 语言实现将一个字符串“郭克华_安全编程技术”,利用 RSA 和 SHA 算法进行数字签名并且验证的过程,同样,由于本书不是讲解某种语言本身,所以在这里 略过 Java 加密体系的讲解,在代码中如果出现新的 API,读者可以参考 Java 文档。
在不同的情况下字签名
在第 12 章我们介绍了 DSA,数字签名算法(Digital Signature Algorithm ,DSA),它也是 一种非对称加密算法,被美国 NIST 作为数字签名标准(DigitalSignature Standard, DSS)。但 是 应用于数字签名中。DSA 算法比 RSA 产生密钥的速度要快一些,且安全性与 RSA 差 不多。DSA 的理论基础,主要依赖于整数有限域离散对数难题。关于其实现过程,读者可 以参考相关文献。 x4x
if(sig.verify(signatureBytes)) {
System.out.println("签名验证成功"); } else {
System.out.println("签名验证失败"); } } catch(SignatureException e) { e.printStackTrace(); } } } 运行,界面如下:
public class P14_01 {
public static void main(String[] args) throws Exception {
String msg = "郭克华_安全编程技术"; System.out.println("原文是:" + msg);
byte[] msgBytes = msg.getBytes();
〖1-2〗数字签名的过程
在数字签名方面,目前应用比较广泛的是利用 RSA 计算签名和数字签名标准 DSS。 其中,利用 RSA 方法进行数字签名得到了广泛的应用。该方法的过程如下:
1:要签名的报文作为一个散列函数的输入,产生一个定长的安全散列码,一般称为 消息摘要。
2:使用发方的私有密钥对这个消息摘要进行加密就形成签名。将报文和签名传送出 去。
h=H(M) 其中,M 是待加工的消息,可以为任意长度;H 为单向散列算法,h 作为生成的消息 摘要,具有固定的长度,并且和 M 的长度无关。一个好的单向散列算法需要 H 具有以下 的单向性质:①给定 H 和 M,很容易计算 h;②给定 h 和 H,很难计算 M,甚至得不到 M 的任何消息;③给定 H,要找两个不同的 M1 和 M2,使得 H(M1)= H(M2)在计算上是不可行 的。 在实际应用中还要求单向散列函数具有如下特点:(1)单向散列函数能够处理任意长度 的消息(至少是在实际应用中可能碰到的长度的消息),其生成的消息摘要长度具有固定的 大小,而且,对同一个消息反复执行该函数总得到相同的消息摘要。(2)单向散列函数生成 的消息摘要是不可预见的,消息摘要看起来和原始数据没有任何关系。而且,原始数据的 任何微小变化都会对生成的消息摘要产生很大的影响。(3)具有不可逆性,即通过生成的消 息摘要得到原始数据的任何信息在计算上是完全不可行的。 目前在密码学上已经设计出了大量的单向散列函数,如:RabinHash 方案、MerkleHash 方案、NHash 算法、MD2 算法、MD4 算法、MD5 算法和 SHA 等。通过考察发现,实际 系统中用得最多的单向散列函数是消息摘要算法 MD5(Message Digest5)和安全散列算法 SHA(Security Hash Algorithm)。它们具有相似的原理和实现方法,关于它们在不可逆加密 中的应用,前述章节已经叙述。
ChinaSEI系列讲义(By郭克华)
用 Java 实现数字签名
如果有文字等小错,请多包涵。在不盈利的情况下,欢迎免费传播。 版权所有.郭克华 本讲义经过修正、扩充,由清华大学出版社出版。 详细可查询 /51834 /product.aspx?product_id=20862469
发送方 私钥加密
消息摘要 密文
消息 正文
单向 散列
发送方 公钥解密
接收方
消息 摘要
比较,得出结论
消息 摘要
图 1 数字签名的基本过程
如前所述,数字签名算法一般分为两个步骤:产生消息摘要和生成数字签名。 首先,系统根据一定的单向加密算法计算出消息的消息摘要。 使用单向散列函数的目的是将任意长度的消息压缩成为某一固定长度的消息摘要。单 向散列函数又称为单向 Hash 函数,它不是加密算法,却在密码学中有着广泛的应用,与 各种加密算法有着密切的关系。它的模型为:
【2】实现数字签名
如前所述,数字签名过程中,在产生签名阶段,发送方至少要进行以下的计算: (1) 由消息 M 利用单向散列函数产生消息摘要 H(M); (2) 将产生的消息摘要 H(M)用发方的私有密钥进行加密。 在验证签名阶段,接收方也要进行以下的计算: (1) 由消息 M 利用单向散列函数产生消息摘要 H(M);
public class P14_02 {
private KeyPair key = null; Signature sig = null; public P14_02() throws NoSuchAlgorithmException {
// 形成DSA公钥对 KeyPairGenerator keyGen = KeyPairGenerator.getInstance("DSA"); keyGen.initialize(1024); // 生成公钥和私钥对 key = keyGen.generateKeyPair(); // 实例化Signature,用于产生数字签名,指定用DSA算法 sig = Signature.getInstance("DSA"); }
x3x
安全编程技术
byte[] signatureBytes = sig.sign();
String signature = new String(signatureBytes); System.out.println("签名是:" + signature);
//使用公鈅验证 PublicKey publicKey = key.getPublic(); sig.initVerify(publicKey); //对msgBytes重新实施签名 sig.update(msgBytes); try {
P14_01.java import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.PrivateKey; import java.security.PublicKey; import java.security.Signature; import java.security.SignatureException;
x5x
安全编程技术
byte[] signatureBytes = sig.sign(); return signatureBytes; }
3:收方接受报文并根据报文产生一个消息摘要,同时使用发方的公开密钥对签名进 行解密。
4:如果计算得出的消息摘要和解密后的签名互相匹配,那么签名就是有效的。 5:因为只有发方知道密钥,因此只有发方才能产生有效的签名。 具体过程如下图所示:
安全编程技术
发送方
消息 正文
消息 发送 正文
单向 散列
消息 摘要
//形成RSA密钥对 KeyPairGenerator keyGen=KeyPairGenerator.getInstance("RSA"); keyGen.initialize(1024); //生成公钥和私钥对 KeyPair key=keyGen.generateKeyPair();
//实例化Signature,用于产生数字签名,指定用RSA和SHA算法 Signature sig=Signature.getInstance("SHA1WithRSA"); //得到私钥 PrivateKey privateKey = key.getPrivate(); //用私钥来初始化数字签名对象 sig.initSign(privateKey); //对msgBytes实施签名 sig.update(msgBytes); //完成签名,将结果放入字节数组signatureBytes
public byte[] getSignature(String msg) throws InvalidKeyException,SignatureException
相关主题