Ho riscontrato un piccolo problema durante l'implementazione di una versione modificata di Protocollo Station-to-Station (STS). Supponiamo di avere due principal A e B, in cui entrambi conoscono la chiave pubblica dell'altro:
- A- > B: Ta (valore pubblico DH)
- B- > A: Tb, SigB (Tb, Ta, A)
- A- > B: SigA (Ta, Tb, B)
Per il secondo messaggio di protocollo, voglio crittografare (usando la mia chiave privata) alcuni dati usando la crittografia a chiave pubblica (ad esempio RSA); e siccome STS è un protocollo di accordo chiave utilizzato per stabilire una chiave segreta, non è possibile utilizzare la crittografia simmetrica come AES o 3DES.
Inoltre, ho pensato di eseguire l'hashing dei dati su alcune dimensioni fisse (usando, ad esempio, SHA-1) e quindi firmarlo; tuttavia, ciò non funzionerà, dal momento che l'altra parte deve essere in grado di estrarre le diverse parti del messaggio firmato per alcuni controlli di verifica successivi.
Nel caso non fossi chiaro: SigB(Tb,Ta,A)
dove SigB
significa signing utilizzando la chiave privata B, e io devo essere in grado di recuperare Ta, Tb e A.
C'è un altro modo oltre a ridurre i dati in blocchi e quindi firmare ciascun blocco (ECB, che è vulnerabile all'analisi crittografica)?
Ecco il codice che genera DHparamspec
.
protected AlgorithmParameterSpec generateParameters() {
DHParameterSpec spec = null;
try {
AlgorithmParameterGenerator apg = AlgorithmParameterGenerator
.getInstance("DH");
apg.init(1024);
AlgorithmParameters algParam = apg.generateParameters();
spec = (DHParameterSpec)algParam
.getParameterSpec(DHParameterSpec.class);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (InvalidParameterSpecException e) {
e.printStackTrace();
}
return spec; // something went wrong
}
E il codice che genera la coppia DH.
kf = KeyFactory.getInstance("DH");
keyGen = KeyPairGenerator.getInstance("DH", "BC");
keyGen.initialize(paramSpec);
keyPair = keyGen.generateKeyPair();
kAgreement = KeyAgreement.getInstance("DH");
kAgreement.init(keyPair.getPrivate());