Ich möchte eine RSA-SHA256-Signatur in Java generieren, aber ich bekomme nicht die gleiche Signatur wie mit OpenSSL auf der Konsole.Warum sind die RSA-SHA256-Signaturen, die ich mit OpenSSL und Java erzeuge, anders?
Dies ist, was ich mit OpenSSL hat (nach this tutorial):
Schlüsselpaar generieren:
openssl genrsa -out private.pem 1024
Extract öffentlichen Schlüssel:
openssl rsa -in private.pem -out public.pem -outform PEM -pubout
erstellen Hash der Daten:
echo 'data to sign' > data.txt
openssl dgst -sha256 <data.txt> hash
Die generierte Hash-Datei beginnt mit (stdin)=
, was ich von Hand entfernt habe (zuerst vergessen, es zu erwähnen, danke mata).
Sign hash:
openssl rsautl -sign -inkey private.pem -keyform PEM -in hash > signature
Um die Ergebnisse in Java zu reproduzieren I umgewandelt zuerst den privaten Schlüssel von PEM DER:
openssl pkcs8 -topk8 -inform PEM -outform DER -in private.pem -nocrypt > private.der
nun diese Java-Klasse schrieb ich die gleiche Signatur zu generieren:
public class RSATest {
public static void main(String[] args) throws IOException,
NoSuchAlgorithmException, InvalidKeySpecException,
InvalidKeyException, SignatureException {
byte[] encodedPrivateKey = readFile("private.der");
byte[] content = readFile("data.txt");
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(encodedPrivateKey);
RSAPrivateKey privateKey = (RSAPrivateKey) keyFactory
.generatePrivate(keySpec);
Signature signature = Signature.getInstance("SHA256withRSA");
signature.initSign(privateKey);
signature.update(content);
byte[] signatureBytes = signature.sign();
FileOutputStream fos = new FileOutputStream("signature-java");
fos.write(signatureBytes);
fos.close();
}
private static byte[] readFile(String filename) throws IOException {
File file = new File(filename);
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
file));
byte[] bytes = new byte[(int) file.length()];
bis.read(bytes);
bis.close();
return bytes;
}
}
Leider sind die Ergebnisse nicht die gleichen, also denke ich, dass ich etwas getan haben muss wron g, aber ich kann nicht herausfinden, was. Kann jemand von mir mir helfen, den Fehler zu finden?
Zufällige Auffüllung und Nachrichtencodierung wird sicherstellen, dass die Signaturen nicht übereinstimmen. Vielleicht sollten Sie ein deterministisches Signaturschema verwenden? – jww