Понимание того, как изменить необработанный гекс RSA на правильный ключ

Вы можете игнорировать все до обновления 3, остальное только для справки о том, что привело меня в точку, в которой я нахожусь.

Итак, я довольно новичок в кодировании, и я хотел заняться чем-то функциональным. Я работал над криптосистемой RSA, которая будет генерировать пару ключей и шифровать / дешифровать сообщения, используя указанную пару ключей. До сих пор я выяснил, как генерировать модуль и показатель степени для каждого ключа и как заставить каждый ключ функционировать должным образом при кодировании / декодировании. Но я работаю с необработанным модулем и показателем степени отдельно для каждого ключа, и у меня нет никакой реальной подсказки, как должно выглядеть форматирование ключа RSA. Итак, я хочу знать, как я могу создать правильно отформатированный ключ RSA (я знаю, что должен использовать javax.crypto, но я не совсем понимаю, как). Я бы предпочел, чтобы я мог взять уже имеющийся у меня код (который приведен ниже) и добавить часть, которая берет модуль и показатель степени и объединяет их в подходящий ключ. О, и я хотел бы иметь возможность найти модуль и показатель степени по ключу, чтобы я мог добавить его к своим частям кода шифрования / дешифрования. Кроме того, у меня есть открытый ключ, который я сгенерировал как модуль и показатель степени.

ОБНОВЛЕНИЕ в выпуске: Хорошо, так что благодаря ArtJom B. Я искал библиотеку безопасности в Java. Но теперь я столкнулся с новой проблемой, и я полностью потерян. Я отредактировал свой код так, чтобы он (надеюсь) брал части каждого ключа и превращал их в ключевые объекты с помощью ключевого фактора. Но я продолжаю получать ту же ошибку. Ниже приведен код новой программы, а также ошибка, которую я продолжаю получать. Мне все равно, если это означает, что я переделываю реализацию алгоритма, я просто хочу, чтобы мой код функционировал.

Обновление 2: Хорошо, так что GregS связал меня с вопросом об исключениях. Большой! код скомпилируется и запустится. Но есть несколько проблем. А) закрытый ключ отображается только как [эта часть исправлена], и я не знаю, что я могу с этим сделать... Б) открытый ключ по-прежнему разделен как модуль и открытый показатель, я думал, что это не так должен сделать это

Небольшое обновление: О, я понял это, я случайно поместил частную экспоненту в область модулей, а он публичную экспоненту в область частных экспонентов в ctor RSAPublicKeySpec. Но проблемы A и B все еще существуют...

Окончательное редактирование: Хорошо, поэтому вопрос начинал становиться слишком широким. Я менял фокус с первоначального намерения. На мой оригинальный вопрос ответили, и поэтому код, который работает, приведен ниже. Я генерирую ключевой объект, затем получаю base64 его кодирования.

Вот новый код:

    import javax.xml.bind.DatatypeConverter;
import java.util.Base64;
import java.math.*;
import java.util.Scanner;
import java.security.spec.KeySpec;
import java.security.*;
import javax.crypto.Cipher;
import java.security.GeneralSecurityException;
import java.security.KeyFactory;
import java.security.spec.RSAPublicKeySpec;
import java.security.spec.RSAPrivateKeySpec;
import java.security.Provider;
import java.security.Key;
import java.security.Security;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import java.security.InvalidKeyException;
import java.security.spec.RSAPrivateCrtKeySpec;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.interfaces.RSAPrivateCrtKey;
import java.security.interfaces.RSAPublicKey;

public class RSAcryptprop {

public static void main(String[] args){
        try{
        Scanner reader = new Scanner(System.in);
        KeyFactory kF = KeyFactory.getInstance("RSA"); 

        BigInteger valP, valQ, valN, totN, valE, valD, valC, valM, valMD, valsub, valDD, valED, valND, valQE, valPE, valCrtC;

        String valPt, valQt, valEt, valMt;

        //here's the set of starting values, two prime numbers of similar bit length


        System.out.println("Value of P?:");
        valPt = reader.next();
        valP = new BigInteger(valPt);
        System.out.println("Value of Q?:");
        valQt = reader.next();
        valQ = new BigInteger(valQt);


        //then find the value of N and the totient of N

        valN= valQ.multiply(valP);
        valsub = new BigInteger("1");

totN= (valQ.subtract(valsub)).multiply(valP.subtract(valsub));


        System.out.println("Totient of N:" + totN.toString(10));
        System.out.println("Value of E? (must be coprime to totient of N):");
        //E is a number coprime to the totient of N

        valEt = reader.next();
        valE = new BigInteger(valEt);



        //N and E are the public key
        RSAPublicKeySpec pubKeyS;
        pubKeyS = new RSAPublicKeySpec(valN,valE);
        PublicKey pubKey = kF.generatePublic(pubKeyS);
        String pubKeyProp = DatatypeConverter.printBase64Binary(pubKey.getEncoded());
        byte[] encodedPubKey = Base64.getDecoder().decode(pubKeyProp);  

        //then I find the modular inverse of the totient modulus E.
        valD = valE.modInverse(totN);




        valPE = valD.mod(valP.subtract(valsub));
        valQE = valD.mod(valQ.subtract(valsub));
        valCrtC = (valQ.subtract(valsub)).mod(valP);
        //N and D are the private key
        RSAPrivateCrtKeySpec privKeyS;
        privKeyS = new RSAPrivateCrtKeySpec(valN, valE, valD, valP, valQ, valPE, valQE, valCrtC);
        PrivateKey privKey = kF.generatePrivate(privKeyS);
        String privKeyProp = DatatypeConverter.printBase64Binary(privKey.getEncoded());
        byte[] encodedPrivKey = Base64.getDecoder().decode(privKeyProp);

        System.out.println("Value of the message?:");
        valMt = reader.next();

        //M is the message that is being encrypted

        valM = new BigInteger(valMt);



        //now for encryption/decryption
        RSAPublicKeySpec pubKeySD;      
        pubKeySD = kF.getKeySpec(pubKey,RSAPublicKeySpec.class);
        valND = pubKeySD.getModulus();
        RSAPrivateCrtKeySpec privKeySD;
        privKeySD = kF.getKeySpec(privKey,RSAPrivateCrtKeySpec.class);
        valDD = privKeySD.getPrivateExponent();


        //C is the encrypted form of the message

        valED = pubKeySD.getPublicExponent();

        valC= valM.modPow(valED,valND); 

        //now to decode the value of M from the value of C
        valMD = valC.modPow(valDD,valND);


        //M is the message, C is the encoded form, n and e are the public key, n and d are the private key


        System.out.println("Message being encrypted: " + valM);

        System.out.println("Encrypted form of message: " + valC);

        System.out.println("Message after going through decrypting: " + valMD);
        System.out.println();
        System.out.println("Proper Private Key:");
        System.out.println("-----BEGIN RSA PRIVATE KEY-----");
        System.out.println(privKeyProp);
        System.out.println("-----END RSA PRIVATE KEY-----");
        System.out.println("Proper Public Key:");
        System.out.println("-----BEGIN RSA PUBLIC KEY-----");
        System.out.println(pubKeyProp);
        System.out.println("-----END RSA PUBLIC KEY-----");

        }
        catch(NoSuchAlgorithmException e){
        System.err.println("algorithm error");
        }
        catch(InvalidKeySpecException e){
        System.err.println("keyspec error");
        }

    }

}

0 ответов

Другие вопросы по тегам