Рейтинг:2

Генерация коротких ключей RSA с использованием OpenSSL

флаг ru

Чтобы написать вызов CTF, я хочу создать пару ключей RSA размером 228 бит.Я хочу, чтобы ключи были точно в том же формате, что и ключи, сгенерированные OpenSSL. Но OpenSSL не поддерживает ключи длиной менее 512 бит. Что может быть решением?

Рейтинг:2
флаг in

В конце концов вам придется запрограммировать его, я полагаю, вот небольшое приложение Java, которое создает закодированный PEM PRIVATE KEY RSA (незашифрованная структура PKCS # 1) и PUBLIC KEY (X.509 SubjectPublicKeyInfo).

Очевидно, что он построен на основе провайдера Bouncy Castle для Java/JCA и PemWriter из «облегченного» API, входящего в пакет провайдера.

пакет com.stackexchange.crypto;

импортировать java.io.FileWriter;
импортировать java.security.KeyPair;
импортировать java.security.KeyPairGenerator;
импортировать java.security.Security;

импортировать org.bouncycastle.asn1.ASN1Object;
импортировать org.bouncycastle.asn1.ASN1Sequence;
импортировать org.bouncycastle.asn1.pkcs.PrivateKeyInfo;
импортировать org.bouncycastle.jce.provider.BouncyCastleProvider;
импортировать org.bouncycastle.util.io.pem.PemObject;
импортировать org.bouncycastle.util.io.pem.PemWriter;

открытый класс ShortRsaKeyPair {

    public static void main(String[] args) выдает Exception{
        Security.addProvider(новый BouncyCastleProvider()); 
        KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA", "BC");
        кпг.инициализировать(228);
        KeyPair kp = kpg.generateKeyPair();
        
        PrivateKeyInfo privKeyInfo = PrivateKeyInfo.getInstance(ASN1Sequence.getInstance(kp.getPrivate().getEncoded()));
        ASN1Object pkcs1Object = (ASN1Object) privKeyInfo.parsePrivateKey(); 
        try (PemWriter pemWriter = new PemWriter(new FileWriter("privkey.pem"))) {
            pemWriter.writeObject(new PemObject("ЧАСТНЫЙ КЛЮЧ RSA", pkcs1Object.getEncoded("DER")));
        }
 
        // не требуется, вы также можете сгенерировать его из закрытого ключа с помощью «openssl rsa -pubout»
        try (PemWriter pemWriter = new PemWriter(new FileWriter("pubkey.pem"))) {
            pemWriter.writeObject(новый PemObject("ПУБЛИЧНЫЙ КЛЮЧ", kp.getPublic().getEncoded()));
        }
    }
}

Вы можете проверить результат, используя:

openssl rsa -pubin -in pubkey.pem -текст
openssl rsa -in privkey.pem -text
Рейтинг:2
флаг ng

Формат закрытых ключей RSA описан в PKCS#1 V2.2, приложение A.1.2. OpenSSL можно указать выводить ключ в этом формате с форматированием PEM поверх него, чтобы результирующие данные были текстовыми; это практика для закрытых ключей RSA, когда они не зашифрованы.

Код для этого дан $(р, д, е)$ это одна страница Python (без гарантии правильности) в этом Попробуйте онлайн!

Можно проанализировать результат с помощью декодера JavaScript ASN.1 Лапо Лукини.

С закрытым ключом в частный .pem, OpenSSL может сгенерировать открытый ключ с помощью

openssl rsa -in private.pem -outform PEM -pubout -out public.pem

Можно также проанализировать результат с помощью указанного декодера JavaScript ASN.1.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.