Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java.security.SignatureException:未初始化用于签名的对象_Java_Signature_Key Pair - Fatal编程技术网

java.security.SignatureException:未初始化用于签名的对象

java.security.SignatureException:未初始化用于签名的对象,java,signature,key-pair,Java,Signature,Key Pair,我得到了一个错误: java.security.SignatureException:未初始化用于签名的对象 在md.update(signature.sign()); 当我试图签名时。基本上,我要做的是获取一些数据,用我的私钥对数据进行签名,将其保存到一个文件中,打开该文件,通过比较处理数据的两个消息摘要来检查签名的数据是否与原始数据相同。我不确定这是不是应该这样做,但我现在正在尝试不同的事情 根据大多数指南,我应该用pubicKey初始化验证,用byte更新,然后签名检查数据,但每次我尝试签

我得到了一个错误:

java.security.SignatureException:未初始化用于签名的对象

md.update(signature.sign())
; 当我试图签名时。基本上,我要做的是获取一些数据,用我的私钥对数据进行签名,将其保存到一个文件中,打开该文件,通过比较处理数据的两个消息摘要来检查签名的数据是否与原始数据相同。我不确定这是不是应该这样做,但我现在正在尝试不同的事情

根据大多数指南,我应该用pubicKey初始化验证,用byte更新,然后签名检查数据,但每次我尝试签名时都会出现异常

    PublicKey publicKey;
    boolean verifyData = false;
    byte[] sign = null;
    MessageDigest md = MessageDigest.getInstance("SHA");
    MessageDigest md2 = MessageDigest.getInstance("SHA");

    ObjectInputStream keyIn = new ObjectInputStream(new FileInputStream(publicKeyLocation)); 
    publicKey = (PublicKey)keyIn.readObject();
    keyIn.close();

    BufferedReader reader = new BufferedReader(new FileReader(dataLocation+ ".txt")); 
    String data = reader.readLine(); 
    reader.close();

    ObjectInputStream signatureIn = new ObjectInputStream(new FileInputStream(signatureLocation)); 
    byte[] signatureToVerify = (byte[])signatureIn.readObject();
    signatureIn.close();

    Signature signature = Signature.getInstance("SHA256withDSA");
    signature.initVerify(publicKey);

    signature.update(signatureToVerify); 

    md.update(signature.sign());
    md2.update(data.getBytes());;

    verifyData = md.digest().equals(md2.digest());

    //verifyData = signature.verify(signature.sign());

    System.out.println(verifyData);
这是验证类

    PrivateKey privateKey;


    ObjectInputStream keyIn = new ObjectInputStream(new FileInputStream(privateKeyLocation)); 
    privateKey = (PrivateKey)keyIn.readObject();
    keyIn.close();


    BufferedReader reader = new BufferedReader(new FileReader(dataLocation+ ".txt")); 
    String data = reader.readLine(); 
    reader.close();

    Signature signature = Signature.getInstance("SHA256withDSA");

    MessageDigest md = MessageDigest.getInstance("SHA"); 
    md.update(data.getBytes()); 

    signature.initSign(privateKey);
    signature.update(md.digest());


    ObjectOutputStream outSignature = new ObjectOutputStream(new FileOutputStream(signatureLocation)); 
    outSignature.writeObject(signature.sign());     
    outSignature.close();

    System.out.println("Finished SignHandler");
这是签名初始化签名类


privatekey和publickey由另一个类中算法为“DSA”的keypairgenerator处理,并进行二进制序列化。

如果要签名,应使用
initSign
而不是
initVerify
。使用initSign、update、Sign和privatekey进行签名。此外,你的“指南”是错误的,或者你误解了它们。对于RSA签名,验证操作(通常)确实包括恢复和比较摘要,但您不需要编写代码,而是通过signature.verify操作(或者更确切地说是内部SignatureSpi.engineVerify操作)完成。对于DSA和ECDSA,验证操作不涉及比较摘要,事实上,比较摘要在数学上是不可能的。