He encontrado un pequeño problema al implementar una versión modificada del Protocolo estación a estación (STS). Digamos que tenemos dos directores A y B, donde ambos conocen la clave pública del otro:
- A- > B: Ta (valor público de DH)
- B- > A: Tb, SigB (Tb, Ta, A)
- A- > B: SigA (Ta, Tb, B)
Para el segundo mensaje de protocolo, quiero encriptar (usando mi clave privada) algunos datos usando encriptación de clave pública (por ejemplo, RSA); y como STS es un protocolo de acuerdo de clave utilizado para establecer una clave secreta, no se puede usar el cifrado simétrico como AES o 3DES.
Por otra parte, pensé en simplemente aplicar hash a los datos a un tamaño fijo (utilizando, por ejemplo, SHA-1) y luego firmarlos; sin embargo, eso tampoco funcionará, ya que la otra parte debe poder extraer las diferentes partes del mensaje firmado para una verificación de verificación posterior.
En caso de que no estuviera claro: SigB(Tb,Ta,A)
donde SigB
significa firmar usando la clave privada B, y debo poder recuperar Ta, Tb y A.
¿Hay alguna otra forma además de dividir los datos en bloques y luego firmar cada uno de esos bloques (BCE, que es vulnerable al análisis criptográfico)?
Aquí está el código que genera el 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
}
Y el código que genera el par DH.
kf = KeyFactory.getInstance("DH");
keyGen = KeyPairGenerator.getInstance("DH", "BC");
keyGen.initialize(paramSpec);
keyPair = keyGen.generateKeyPair();
kAgreement = KeyAgreement.getInstance("DH");
kAgreement.init(keyPair.getPrivate());