java.security.SignatureException: объект не инициализирован для подписания - PullRequest
0 голосов
/ 31 октября 2019

Я получаю сообщение об ошибке:

java.security.SignatureException: объект не инициализирован для подписания

при md.update(signature.sign());когда я пытаюсь подписать свою подпись. По сути, я пытаюсь получить некоторые данные, подписать их своим закрытым ключом, сохранить их в файл, открыть файл и проверить, совпадают ли подписанные данные с исходными данными, сравнив два дайджеста сообщений, которыеобрабатывать данные. Не совсем уверен, что это так, как должно быть, но сейчас я просто пробую разные вещи.

Согласно большинству руководств, я должен initVerify с моим pubicKey, обновлять с помощью байта изатем подпишите, чтобы проверить данные, но каждый раз, когда я пытаюсь сделать подпись, я получаю исключение.

    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");

, и это подпись инициализации подписиclass.

Закрытый ключ и открытый ключ обрабатываются генератором ключей с алгоритмом "DSA" в другом классе и двоично сериализуются.

...