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?
Vous devez vous connecter pour publier un commentaire.
produit quelque chose comme:
avis de la
(stdin)=
'? vous ne voulez pas que pour être une partie de votre hash, si vous avez besoin de créer un digest, utilisez le-binary
option.essayez de l'utiliser pour signer vos données:
Cela ne tout ce que vous avez besoin.
modifier - un peu plus d'explications:
nous allons créer un digest et de montrer
maintenant, nous profitons de cette digérer et signe int utilisant
rsautl
:maintenant, nous allons signer le même fichier à l'aide
dgst
directement:Donc, ce qui est différent ici? Pour voir cela, on peut vérifier la signature et de montrer la sortie brute. Les deux fichiers contiennent le digérer, mais les métadonnées et le rembourrage est différent:
Pour le voir plus clairement, nous pouvons essayer d'utiliser le
-asn1parse
drapeau, qui ne marchera pas pour la première signature, mais pour le second, il montre la structure correcte de la signature:openssl rsautl -verify -inkey public.pem -keyform PEM -pubin -in signature > verified
, ce qui ne fonctionne pas plus. Pouvez-vous me dire quelle est la bonne commande pour vérification?openssl rsautl -sign
générer une sortie non valide?