Rsa

使用 OpenSSL 生成 RSA 短密鑰

  • August 12, 2021

要編寫 CTF 挑戰,我想創建一個 228 位大小的 RSA 密鑰對。我希望密鑰的格式與 OpenSSL 生成的密鑰完全相同。但是,OpenSSL 不支持少於 512 位長的密鑰。有什麼解決辦法?

最後你必須對其進行程式,我想這是一個小型 Java 應用程序,它創建 PEM 編碼的 RSA PRIVATE KEY(未加密的 PKCS#1 結構)和 PUBLIC KEY(X.509 SubjectPublicKeyInfo)。

顯然,它是建立在 Java / JCA 的 Bouncy Castle 提供程序和PemWriter作為提供程序包一部分的“輕量級”API 之上的。

package com.stackexchange.crypto;

import java.io.FileWriter;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.Security;

import org.bouncycastle.asn1.ASN1Object;
import org.bouncycastle.asn1.ASN1Sequence;
import org.bouncycastle.asn1.pkcs.PrivateKeyInfo;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.util.io.pem.PemObject;
import org.bouncycastle.util.io.pem.PemWriter;

public class ShortRsaKeyPair {

   public static void main(String[] args) throws Exception{
       Security.addProvider(new BouncyCastleProvider()); 
       KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA", "BC");
       kpg.initialize(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 PRIVATE KEY", pkcs1Object.getEncoded("DER")));
       }

       // not needed, you can also generate it from the private key using "openssl rsa -pubout"
       try (PemWriter pemWriter = new PemWriter(new FileWriter("pubkey.pem"))) {
           pemWriter.writeObject(new PemObject("PUBLIC KEY", kp.getPublic().getEncoded()));
       }
   }
}

您可以使用以下方法檢查結果:

openssl rsa -pubin -in pubkey.pem -text
openssl rsa -in privkey.pem -text

RSA 私鑰的格式在PKCS#1 V2.2 附錄 A.1.2中描述。可以告訴 OpenSSL 以 PEM 格式輸出該格式的密鑰,以便生成的數據是文本;這是未加密時 RSA 私鑰的做法。

給定的程式碼 $ (p,q,e) $ 是此線上試用中的一頁 Python(不保證正確性) !

可以使用 Lapo Luchini 的 ASN.1 JavaScript 解碼器解析結果

使用 中的私鑰private.pem,OpenSSL 可以生成公鑰

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

也可以使用 ASN.1 JavaScript 解碼器解析結果

引用自:https://crypto.stackexchange.com/questions/93532