Rsa
使用 OpenSSL 生成 RSA 短密鑰
要編寫 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