2 yinghuashiqing yinghuashiqing 于 2014.03.30 20:14 提问

java实现XML的数字签名,但是老是提示签名算法不存在

这是写的关于XML的数字签名用java实现,我对于这个是小白,对于XML除了的遍历其他的都不太懂,错误老是提示签名算法不存在,我都要撞墙了,最近急需这个,拜托各位大大,帮帮忙我快哭死了

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.cert.X509Certificate;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;

import com.sun.org.apache.xml.internal.security.algorithms.MessageDigestAlgorithm;
import com.sun.org.apache.xml.internal.security.signature.XMLSignature;
import com.sun.org.apache.xml.internal.security.transforms.Transforms;
import com.sun.org.apache.xml.internal.security.utils.XMLUtils;

public class pres03 {
public static void main(String[] args) {
try {
//声明密钥库格式
String keystoreType="JKS";
//声明密钥库存储文件路径及名称
String keystoreFile="src/xmlkey.jks";
//声明密钥库口令
String keystorePass="password";
//声明私钥别名
String privateKeyAlias="xmlkey";
//声明私钥口令
String privateKeyPass="password";
//声明证书别名
String certificateAlias="xmlkey";

        //获取私钥
        //获得KeyStore类的一个实例
        KeyStore ks=KeyStore.getInstance(keystoreType);
        //创建一个输入流,使用keystoreFile中的数据初始化KeyStore实例
        FileInputStream fis=new FileInputStream(keystoreFile);
        //加载密钥库文件
        ks.load(fis, keystorePass.toCharArray());
        //获取签名私钥
        PrivateKey privatekey=(PrivateKey)ks.getKey(privateKeyAlias, privateKeyPass.toCharArray());

        //创建文件对象
        File file=new File("src/pre.xml");
        //构建文档对象工厂
        DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
        //构建文档对象
        DocumentBuilder db=dbf.newDocumentBuilder();
        //创建文件流转换为文档对象
        Document doc=db.parse(file);

        Element root=doc.getDocumentElement();

        //创建XML签名文件
        File signatureFile=new File("src/CI-certified.xml");

        //创建XML签名实例,指定的签名算法为DSA
        XMLSignature signature=new XMLSignature(doc, 
                signatureFile.toURL().toString(), 
                XMLSignature.ALGO_ID_SIGNATURE_DSA);
        //设置签名对象的ID
        String id1="100";
        signature.setId(id1);

        //创建转换处理对象
        Transforms transforms=new Transforms(doc);
        //指定签名类型为封内签名
        transforms.addTransform(Transforms.TRANSFORM_ENVELOPED_SIGNATURE);
        //计算摘要值并加入到签名对象中
        signature.addDocument("#"+id1, transforms, MessageDigestAlgorithm.ALGO_ID_DIGEST_SHA1);

        //将签名者的数字证书存入KeyInfo元素中
        X509Certificate cert=(X509Certificate) ks.getCertificate(certificateAlias);
        signature.addKeyInfo(cert);
        //将签名者的公钥存入KeyInfo元素中
        signature.addKeyInfo(cert.getPublicKey());
        //将签名本身存入CI文档中,构造封内签名
        root.appendChild(signature.getElement());
        //使用签名者的私钥对signature对象签名
        signature.sign(privatekey);

        //输出签名后的XML文件
        //创建输出流
        FileOutputStream fos=new FileOutputStream(signatureFile);
        //输出XML签名文件
        XMLUtils.outputDOMc14nWithComments(doc, fos);

    } catch (Exception e) {
        e.printStackTrace();
    }

}

}

然后一运行就出现了下面的错误

com.sun.org.apache.xml.internal.security.signature.XMLSignatureException: The requested algorithm http://www.w3.org/2000/09/xmldsig#dsa-sha1 does not exist. Original Message was: null
Original Exception was java.lang.NullPointerException
at com.sun.org.apache.xml.internal.security.algorithms.SignatureAlgorithm.(Unknown Source)
at com.sun.org.apache.xml.internal.security.signature.SignedInfo.(Unknown Source)
at com.sun.org.apache.xml.internal.security.signature.XMLSignature.(Unknown Source)
at com.sun.org.apache.xml.internal.security.signature.XMLSignature.(Unknown Source)
at XML_02.pres07.main(pres07.java:64)
java.lang.NullPointerException
at com.sun.org.apache.xml.internal.security.algorithms.SignatureAlgorithm.(Unknown Source)
at com.sun.org.apache.xml.internal.security.signature.SignedInfo.(Unknown Source)
at com.sun.org.apache.xml.internal.security.signature.XMLSignature.(Unknown Source)
at com.sun.org.apache.xml.internal.security.signature.XMLSignature.(Unknown Source)
at XML_02.pres07.main(pres07.java:64)

错误中64行指的是XMLSignature signature=new XMLSignature(doc, 这句

下面是我要签名的XML文档
CSDN移动问答

还有就是那个什么秘钥和签名证书什么我也是看网上的生成的,也是DSA的

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
java中XML 数字签名的标准
注:本文来自IBM官方网站! 1. 技术背景 1.1 数字签名简介 数字签名是非对称密钥技术的一种应用模式,用于保证报文的完整性,不可否认性,以及提供身份认证信息。数字签名的原理如图 1 所示。 图 1:数字签名的原理 发送者在发送报文之前,先选用某种摘要算法为报文生成一个摘要值,并使用自己的私钥对摘要值加密,然后将加密后的摘要附在报文后面,一同发送给报文的接收者。接收者
RSA数字签名java实现
1、数字签名原理 用RSA算法做数字签名,总的来说,就是签名者用私钥参数d加密,也就是签名;验证者用签字者的公钥参数e解密来完成认证。 下面简要描述数字签名和认证的过程。 (1)、生成密钥 为用户随机生成一对密钥:公钥(e,n)和私钥(d,n). (2)、签名过程 a) 计算消息的散列值H(M). b) 用私钥(d,n)加密散列值:s=(H(M)) mod n,签名结果就是s. c) 发送消息和签名(M,s). (3)、认证过程 a) 取得发送方的公钥(e,n). b) 解密签名s:h=s mod n. c) 计算消息的散列值H(M). d) 比较,如果h=H(M),表示签名有效;否则,签名无效。 根据上面的过程,我们可以得到RSA数字签名的框图如图2-1: 图 2-1 RSA数字签名框图 2、 假设Alice想和Bob通信,以本地两个文件夹Alice和Bob模拟两个用户,实现消息M和签名的模拟分发 (1)、Alice通过RSA算法生成一对密钥:公钥(e,n)和私钥(d,n),将公私钥分别存入pubKey.txt和priKey.txt中。 pubKey.txt中公钥如下: priKey.txt中私钥如下: (2)、将Alice中的pubKey.txt拷到Bob中,模拟公玥的分发。 (3)、将Alice中的消息info.txt做散列,将散列后的值存入hashInfo.txt中。 (4)、将Alice中的消息hashInfo.txt和签名sign.txt拷到Bob中,实现M密文状态下的签名与模拟分发、消息传递。 (5)Bob取得公钥pubKey.txt,用公钥解密签名,计算消息的散列值H(M).比较,如果h=H(M),表示签名有效;否则,签名无效。 后台运行结果如下:
数字签名算法,c++实现,RSA的算法
包涵三个RSA算法,c++是实现,数字签名的合集,三个独自的程序,可以独自编译运行,VC6.0下编译
数字签名算法DSS
完整的报告 程序 和实验结果,DSA相关的SHA-1生成散列的程序,综合利用所学的知识,编写一段基于标准输入输出
日常小结-RSA加密算法、数字签名和数字证书及其java实现
前段时间遇到过RSA这里把前段时间学到的东西做一些总结:RSARSA是目前为止应用最为广泛的非对称加密算法。非对称加密算法简单的说就是分成公钥和私钥。加密和解密采用不同的算法实现,这样的好处是不需要像传统对称加密算法一样将相同算法的密钥分发给对方,从而减少密钥被获取所带来的严重危害,目前基本上都是采用非对称算法,而RSA是最为广泛的。理论上1024位以上的RSA是无法破解的(或者未公开)。基本原理:
DSS数字签名标准Java实现
所谓数字签名,是一种用数字通信形式达到签名的功能,目的是证明通信双方的身份、达到确保通信的安全,是一套密码系统。 这里用RSA加密,用MD5形成摘要,验证信息完整性。
Java实现数字签名
一、数字签名算法概述    签名认证是对非对称加密技术与数字摘要技术的综合运用,指的是将通信内容的摘要信息使用发送者的私钥进行加密,然后将密文与原文一起传输给信息的接收者,接收者通过发送者的公钥信息来解密被加密的摘要作息,然后使用与发送者相同的摘要算法,对接收到的内容采用相同的方式方式产生摘要串,与解密的摘要串进行对比,如果相同,则说明接收到的内容是完整的,在传输过程中没有受到第三方的篡改,否则
数字签名中的elgamal算法
本压缩包中是用C编写的ELGAMAL加密算法
DSA数字签名原理及JAVA实现
DSA数字签名          DSA数字签名是Elgamal和Schnorr数字签名的一个变种,DSA数字签名优于Elgamal数字签名的地方在于它的签名长度较短,并且某些可以破解Elgamal方案的攻击不适用DSA数字签名,DSA数字签名的原理如下: 1. 首先生成一个素数p,p满足 2^L-1 注:关于L的值的范围看到两种不同的说法 a):L是1024、2048、3072三个值中的
数字签名算法中MD5withRSA
package Encoder.digestSign; import java.security.InvalidKeyException; import java.security.KeyFactory; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.securit