Aufgrund einiger Implementierung Detail, ich brauche Hashing und Signaturerzeugung zu spalten. Ich habe versucht, dies mit dem Signaturalgorithmus 'NONEwithRSA' zu erreichen.Separate Digest & Signierung mit Java-Sicherheitsanbieter
Dies ist eine grundlegende Arbeitsbeispiel:
public void rsaSignatureIntegrityTest() {
KeyPairGenerator gen = KeyPairGenerator.getInstance("RSA");
gen.initialize(2048, new SecureRandom());
KeyPair pair = gen.generateKeyPair();
byte[] digest = MessageDigest.getInstance("SHA-256").digest(MESSAGE);
Signature signer = Signature.getInstance("NONEwithRSA");
signer.initSign(pair.getPrivate());
signer.update(digest);
byte[] signed = signer.sign();
Signature verifier = Signature.getInstance("SHA256withRSA");
verifier.initVerify(pair.getPublic());
verifier.update(MESSAGE);
verifier.verify(signed);
}
des Lauf, wirft die verifier.verify()
Methode eine Signatur Ausnahme:
java.security.SignatureException: Signature encoding error
at sun.security.rsa.RSASignature.engineVerify(RSASignature.java:204)
at java.security.Signature$Delegate.engineVerify(Signature.java:1219)
at java.security.Signature.verify(Signature.java:652)
at testing.rsaSignatureIntegrityTest(testing.java:38)
...
Caused by: java.io.IOException: Sequence tag error
at sun.security.util.DerInputStream.getSequence(DerInputStream.java:297)
at sun.security.rsa.RSASignature.decodeSignature(RSASignature.java:229)
at sun.security.rsa.RSASignature.engineVerify(RSASignature.java:195)
... 26 more
Das Verifizierer Objekt scheint eine Art von DER-kodierte Struktur zu erwarten, die wird nicht vom Unterzeichnerobjekt erzeugt.
Vorschläge, wie dies zur Arbeit kommen?
Referenz: Schritt 2 von [EMSA-PKCS1-v1_5] (https://tools.ietf.org/html/rfc3447#section-9.2). Beachten Sie die DER-Codierung beträgt in diesem Fall ein festes Präfix hinzugefügt, wie in Anmerkung 1 auf Seite 43. –
@ dave_thompson_085 Danke für den Hinweis expained, ich habe gerade Reverse-engineered it! – Horst