Как я могу проверить свои данные в цифровой подписи?

Мне нужно сверить мои данные с данными в цифровой подписи, как я могу сравнить их. В этом коде проверьте подпись, которая расшифровывается открытым ключом и оригинальной подписью.

  1. генерация открытого ключа, частного ключа и подписи.
  2. прочтите мои данные.
  3. хэшировать этот код.
  4. читать подпись.
  5. сравнить подпись и мои данные. // У меня проблема на этом этапе. Я хочу сравнить мои данные и подпись.

     public static void verify () {
            BufferedReader in = new BufferedReader(new FileReader("EndSignatuer.txt"));
            FileInputStream keyfis = new FileInputStream("EndSignatuer.txt");
            byte[] Signen = new byte[keyfis.available()];
            keyfis.read(Signen);
            keyfis.close();
            String signatureString = new String(Signde);
            System.out.println("SignatureString:" + signatureString);
            len = Signde.length;
            X509EncodedKeySpec pubKeySpec = new X509EncodedKeySpec(encKey);
            KeyFactory keyFactory = KeyFactory.getInstance("DSA", "SUN");
            PublicKey pubKey = keyFactory.generatePublic(pubKeySpec);
            Signature sig = Signature.getInstance("SHA1withDSA", "SUN");
            sig.initVerify(pubKey);
    

    }

Мне нужно:

public static void verify (byte[] mydata) {
........
sig.initVerify(mydata);
}

person MohammadTofi    schedule 26.04.2014    source источник


Ответы (1)


Во-первых, проверка подписи НЕ включает «расшифровку с помощью открытого ключа». Для RSA при подписании и проверке используются операции, похожие на шифрование и дешифрование, что сбило с толку многих людей, описывающих их таким образом, но на самом деле они разные. Для DSA, который вы здесь используете, и для ECDSA разница больше: нет ничего похожего на шифрование или дешифрование, есть только подпись и проверка.

Кроме того, подписи, как и многие криптографические объекты, представляют собой фактически случайные байты, а не допустимые символы. Преобразование в строку и попытка ее отображения в лучшем случае приведет к мусору и может испортить отображение. В ситуациях, когда они должны быть ограничены допустимыми символами (например, S / MIME и XML), обычно выполняется преобразование в base64 или шестнадцатеричный формат и, при необходимости, обратно в двоичный.

Тем не менее, вы близки. Вы начинаете с вызова sig.initVerify с открытым ключом, как и у вас. Затем вы вызываете sig.update с данными, которые могут быть одним буфером или их серией (особенно когда у вас больше данных, чем помещается в памяти за раз). Наконец, вы вызываете sig.verify со значением подписи, и он возвращает true или false. См. http://docs.oracle.com/javase/7/docs/api/java/security/Signature.html для получения дополнительных сведений.

person dave_thompson_085    schedule 26.04.2014