Pourquoi le RSA-SHA256 signatures-je créer avec OpenSSL et Java différents?

Je veux générer un RSA-SHA256 signature en Java, mais je n'arrive pas à produire la même signature que avec OpenSSL sur la console.

C'est ce que j'ai fait avec OpenSSL (à la suite de ce tutoriel):

Générer une paire de clés:

openssl genrsa -out private.pem 1024

Extraire la clé publique:

openssl rsa -in private.pem -out public.pem -outform PEM -pubout

Créer de hachage de données:

echo 'data to sign' > data.txt
openssl dgst -sha256 < data.txt > hash

Généré le fichier de hachage commence avec (stdin)= ce que j'ai enlevé à la main (d'abord oublié de le mentionner, merci mata).

Signe de hachage:

openssl rsautl -sign -inkey private.pem -keyform PEM -in hash  > signature

Pour reproduire les résultats en Java, j'ai d'abord converti la clé privée à partir de PEM DER:

openssl pkcs8 -topk8 -inform PEM -outform DER -in private.pem -nocrypt > private.der

Maintenant que j'ai écrit cette classe Java pour générer la même signature:

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;
    }

}

Malheureusement, les résultats ne sont pas les mêmes, donc je pense que je dois avoir fait quelque chose de mal, mais je ne peux pas comprendre ce que. Quelqu'un peut-il vous aider moi à trouver le bug?

  • Aléatoire de rembourrage et de codage des messages veillera à ce que les signatures ne correspondent pas. Peut-être devriez-vous utiliser un déterministe signature régime?
InformationsquelleAutor Arthur Dent | 2012-11-16