Я получаю сообщение об ошибке:
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" в другом классе и двоично сериализуются.