Voglio generare una firma RSA-SHA256 in Java, ma non riesco a ottenere la stessa firma di OpenSSL sulla console.Perché le firme RSA-SHA256 generate con OpenSSL e Java sono diverse?
Questo è quello che ho fatto con OpenSSL (segue this tutorial):
Genera coppia di chiavi:
openssl genrsa -out private.pem 1024
estratto la chiave pubblica:
openssl rsa -in private.pem -out public.pem -outform PEM -pubout
Creare hash dei dati:
echo 'data to sign' > data.txt
openssl dgst -sha256 <data.txt> hash
Il file hash generato inizia con (stdin)=
quello che ho rimosso a mano (prima ho dimenticato di dirlo, grazie mata).
cancelletto:
openssl rsautl -sign -inkey private.pem -keyform PEM -in hash > signature
di riprodurre i risultati in Java ho convertito la chiave privata da PEM Der:
openssl pkcs8 -topk8 -inform PEM -outform DER -in private.pem -nocrypt > private.der
Ora ho scritto questa classe Java per generare la stessa firma:
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;
}
}
Sfortunatamente i risultati non sono gli stessi, quindi penso di aver fatto qualcosa di wron g, ma non riesco a capire cosa. Qualcuno di voi può aiutarmi a trovare l'insetto?
Il riempimento casuale e la codifica dei messaggi assicurano che le firme non corrispondano. Forse dovresti usare uno schema di firma deterministico? – jww