Key Exchange utilizzando PKI

3

Sono nuovo nel campo della crittografia e sto provando un programma di esempio per capire il meccanismo di scambio di chiavi PKI. Ho provato a creare un certificato autofirmato usando openssl

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout privateKey.key -out certificate.cer

Questo mi ha dato un file di certificato che posso pubblicare sul mio programma client e un file di chiave privata che io userò per decifrare il testo crittografato dai programmi client. Sono in grado di crittografare il testo normale utilizzando il file del certificato, ma si trova ad affrontare un problema nell'ottenere la chiave privata. Come leggo la chiave privata dal file chiave per usarla in decrittazione.

La mia comprensione con lo scambio di chiavi è che ho una chiave pubblica e privata autofirmata o ottenuta da CA; pubblica la chiave pubblica per le applicazioni (mittente) che intendono inviarmi un messaggio. Il mittente crittografa una chiave simmetrica con la chiave pubblica pubblicata e il ricevente decrittografa il messaggio utilizzando la chiave privata e quindi entrambe le parti hanno scambiato la chiave simmetrica per ulteriore crittografia bidirezionale.

Mentre provo ad estrarre la chiave privata usando il codice java sotto

public class RSAToy {


    private static final String BEGIN_RSA_PRIVATE_KEY = "-----BEGIN PRIVATE KEY-----\n"
            + "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDW6ofjl8o8sjGg\n"
            + "ANqLneMcrq+xUYVRnKT1mGtboMYHJqtgNIbCzMo4Ym4Uw5+m1JEa2fxbcExp1JAK\n"
            + "A3Cmih+KaJ/gjyaJDKHrTuRN7hs4oSo6aPTIAW3euuqWH7xrFOIvXRRIqRWu4oir\n"
            + "xEjjyQ2IxqkPssf+AUAkz9DiH6phGIaXHXocIsCSEssZWkYd7WZ0HYL3Bfz+W4aY\n"
            + "+PfKDwflMLknsWOkmzc8N+i4Bac3IxOuFhwmg3y2YQq//ZkkaJv3OVIjj6v2OuRY\n"
            + "vgfrPs9dwkshloxp8HRDlA5upXiBiv3JOawbkBUs+bmxzjTNT+vyliKb4qq9ZCAF\n"
            + "ikV5BKazAgMBAAECggEADao137O8CSXvX9QOEUiFs0IsK6MaTfkex/rcAKR1UukT\n"
            + "hndwhhxNU052310c3pevbjyj/hBi22vHiMt1MzGfFcbXO4j+k0I5XWPTwly8YFpm\n"
            + "+/XGcp0cpkfOOKNl8I0QYKCTdJdDqK4AsKM3WzxiXur6vuPIMY9Uy8Jm7qnCxI+T\n"
            + "xoYW857hX9caDvDS+YyMzHFHfcuqI0//4AzjgxgIqy8D0w9u4Xr61mAsLYNsXAUt\n"
            + "ZPOXoI8KhQ7DAAYzmY3OnBRr3fQbM2yXVxdW9Tv6bhmFrpuicUHfMRJrnjzK1b4O\n"
            + "nPtn5542rVzCXe6FWu1c98Gw0S+oo3G8gfgg/IpukQKBgQD4cnXrMGV2ETE3rWjD\n"
            + "drEo0pGJ8UCAwl08xBRY5dlK6SkfsnMOiZhQIsFLqMvknEmYNarWdu4Bmu3lgoo1\n"
            + "/JO0UGUifbklhDTQoy7q12jzCLMMQMSm5ziTCehJ2lOMI+Z+gD+AQD9ltCUBCQrR\n"
            + "s8YhAR8TH5aDtb2kkohRrDufKwKBgQDdcx2LvnjaR1lB9MQ85snTx2LQt26ewyRd\n"
            + "2zxBBQtNGQvmP0mj3t/88tHu+MPQCCvHpFiPdcs7VN/SEfE6vw9R0YY6b/YIKelm\n"
            + "uj9t5Ar2EZtUvbiVCYyKXAl5tgXNAESTP8LDidhQ41UjJS0ZaVwXbCwDVDZqS4NY\n"
            + "JGSeq9SSmQKBgQCGQ40YOcJLKQVZGnyoTUd2UT1Xt6ntK5ypjymT1Ts1sYWI3K4z\n"
            + "KAbJH88oLSNq+08GU9JsLj93XJu90WsRu9qyslPFbP4WmTjVm6pqPVk5JfVk5Meh\n"
            + "jwlS5SLEbpmB/ZC9wl8O1ymrs8vfoFxZcXbcNTfu5L45lYjUHGBRCuv5mwKBgBN6\n"
            + "AGs+AVsRU2RdprTEh5O8wZAh0fTcrOIkWhRN4USSo11Iy61B+OlCYfxmnLI7Rb51\n"
            + "UeSsM4ewW08ajODh1PMZPnj9R+JH7WM/ljyQBfbGbabyWL2i7V1t4td1juUM1Psu\n"
            + "bG7OPNxAYkiJCIJnpdXZibVxPqfypEaoTME306ZhAoGBAO9E1RbKR+9p/h7xzXPE\n"
            + "0vFyN0ItW2Mu3ESE4VRplYx4ht/zZ4gBJMHLNNQCk3IQGflizJ6+On74z6RnYxAy\n"
            + "jiF9zLqj8NKy24wrWithYepG4C0JL6xg2k3gYLxyuccXak06D0ABDxnwJcXrZvmq\n"
            + "zuhsR8X+g3gxaGr7dTgMcZ2J\n"
            + "-----END PRIVATE KEY-----";


    public static void main(String[] args) throws Exception {

        // Remove the first and last lines

        String privKeyPEM = BEGIN_RSA_PRIVATE_KEY.replace("-----BEGIN RSA PRIVATE KEY-----\n", "");
        privKeyPEM = privKeyPEM.replace("-----END RSA PRIVATE KEY-----", "");
//        System.out.println(privKeyPEM);

        // Base64 decode the data

        byte [] encoded = Base64.decodeBase64(privKeyPEM);

        // PKCS8 decode the encoded RSA private key

        PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(encoded);

//        RSAPrivateKeySpec keySpec = new R
        KeyFactory kf = KeyFactory.getInstance("RSA");
        PrivateKey privKey = kf.generatePrivate(keySpec);

        // Display the results

        System.out.println(privKey);
    }
}

Sto ottenendo

Exception in thread "main" java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException : DerInputStream.getLength(): lengthTag=111, too big.
    at sun.security.rsa.RSAKeyFactory.engineGeneratePrivate(Unknown Source)

Come posso risolvere il problema ed estrarre la chiave privata per decrittografare il mio messaggio codificato. Qualsiasi aiuto è molto apprezzato.

    
posta Vijay Selvaraj 07.11.2012 - 09:34
fonte

3 risposte

3

Quando OpenSSL crea una chiave privata, usa il proprio formato; in realtà, il formato raw basato su ASN.1 descritto in PKCS # 1 . Questo non è PKCS # 8 , che è un wrapper attorno a quello formato.

Puoi convertire la chiave privata nel formato PKCS # 8 in questo modo:

openssl pkcs8 -in privateKey.key -topk8 -nocrypt -out privateKey.pk8

L'opzione "-nocrypt" è perché PKCS # 8 supporta facoltativamente la crittografia basata su password della chiave privata. Puoi aggiungere -outform DER per evitare la codifica PEM ("PEM" è Base64 più una coppia di intestazioni, che rimuovi nel tuo codice).

    
risposta data 07.11.2012 - 13:09
fonte
0

Stai creando un certificato x509, ma poi provi ad importare una chiave di formato PKCS8. La chiave esportata non è compatibile. È necessario esportare un PKCS8 DER / PEM (a seconda di quale Java lo desidera) o cambiare il codice per importare le chiavi x509.

    
risposta data 07.11.2012 - 11:13
fonte
0

Se vuoi analizzare anche su Windows, dovresti usare

keyStr.replaceAll("(-+BEGIN RSA PRIVATE KEY-+\r?\n|-+END RSA PRIVATE KEY-+\r?\n?)", "");

per sostituire la stringa DER.

    
risposta data 03.02.2016 - 17:49
fonte