Bonjour,

J'utilise la librairie BouncyCastle pour la première fois, et je n'ai pas fait des tonnes de crypto avant... mon pb est donc peut-être tout simple, mais je ne comprends pas comment le résoudre... :-(

Je suis en train de développer un bout de code qui doit vérifier la signature de 6 paramètres envoyés par un client tiers.

Les spécifications du client sont:
- 6 mots (texte pur) sont utilisés pour générer un message digest avec l'algorithme MD5
- ce message digest est ensuite signé avec PKCS#7
- la clé publique est un certificat X.509 v3 (stocké sur le serveur)

Côté serveur, je reçois les 6 mots en texte clair et la signature générée par PKCS#7.

J'ai deux questions:
1. est-ce que l'idée de base de mon code est correcte:
- regénérer le message digest sur la base des 6 mots
- confronter la signature reçue avec ce message digest

2. quand j'exécute mon bout de code, j'ai une exception: SignatureException: content hash found in signed attributes different.
Je ne comprends pas ce qu'elle signifie :-( (Google ne m'a pas été d'un grand secours sur ce coup).
Est-ce que quelqu'un pourrait m'expliquer ce que ça veut dire et comment résoudre ce problème ?

Merci beaucoup !!!!

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
	public static boolean checkSign(String word1, String word2, String word3, String word4, String word5, String word6, String receivedSignature) {
		// Add a Bouncy Castle security provider
		Security.addProvider(new BouncyCastleProvider());
		FileInputStream certifIS = new FileInputStream("myCert.cer");
 
		CertificateFactory cf = CertificateFactory.getInstance("X.509");
		Collection c = cf.generateCertificates(certifIS);
		certifIS.close();
		Iterator iterator = c.iterator();
		X509Certificate cert = null;
		while (iterator.hasNext()) {
		   cert = (X509Certificate)iterator.next();
		}
 
		MessageDigest sha = MessageDigest.getInstance("MD5");
		sha.reset();
		sha.update(word1.getBytes());
		sha.update(word2.getBytes());
		sha.update(word3.getBytes());
		sha.update(word4.getBytes());
		sha.update(word5.getBytes());
		sha.update(word6.getBytes());
		byte[] hash = sha.digest();
 
		byte signedContent[] = Base64.decode(receivedSignature);
		CMSSignedData signedData = new CMSSignedData(signedContent);
 
		if (signedData.getSignedContent() == null){
			CMSProcessableByteArray process = new CMSProcessableByteArray(hash);
			signedData = new CMSSignedData(process, signedContent);
		}
 
		SignerInformation signer = (SignerInformation) signedData.getSignerInfos().getSigners().iterator().next();
 
		boolean isOk = signer.verify(cert, "BC");
		return isOk;
	}