我想使用java从pfx文件中提取有关RSA公钥的信息。
我有一个pfx文件,并转换为x509 Pem文件。从pem文件,使用下面的命令在终端:
openssl x509 -in file.pem -text
我可以查看公钥指数和模值
主题公钥信息:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
00:da:7c:e0:3e:c4:62:8d:ce:29:04:2f:93:78:7c:
:
6a:e7:c9:7c:8b:6f:09:5c:75:5f:8c:5e:9c:6a:b9:
7:32:90: a4:4b
Exponent: 65537 (0x10001)
如何在java中提取上述信息?
输入:PFX文件和密码
输出:公钥指数和模值。
我使用下面的代码来提取公钥指数和模数,但我没有得到使用openssl提取的值。我怀疑java.security.cert.证书是否使用其他DER格式??
什么是openssl的java等价物?
代码:
KeyStore ks = KeyStore.getInstance("pkcs12");
ks.load(new FileInputStream(file), password.toCharArray());
Enumeration enumeration = ks.aliases();
while (enumeration.hasMoreElements()) {
String alias = (String) enumeration.nextElement();
java.security.cert.Certificate certificate = ks.getCertificate(alias);
PublicKey publickey = certificate.getPublicKey();
}
我添加这个答案是因为我最近尝试使用java从原始公钥字符串中获取模数和指数(另请参见https://crypto.stackexchange.com/questions/18031/how-to-find-modulus-from-a-rsa-public-key,并认为其他人可能会发现以下代码很有用:
String publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCqGKukO1De7zhZj6+H0qtjTkVxwTCpvKe4eCZ0FPqri0cb2JZfXJ/DgYSF6vUpwmJG8wVQZKjeGcjDOL5UlsuusFncCzWBQ7RKNUSesmQRMSGkVb1/3j+skZ6UtW+5u09lHNsj6tQ51s1SPrCBkedbNf0Tp0GbMJDyR4e9T04ZZwIDAQAB";
try {
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
byte[] keyBytes = Base64.getDecoder().decode(publicKey.getBytes("UTF-8"));
X509EncodedKeySpec spec = new X509EncodedKeySpec(keyBytes);
PublicKey fileGeneratedPublicKey = keyFactory.generatePublic(spec);
RSAPublicKey rsaPub = (RSAPublicKey)(fileGeneratedPublicKey);
BigInteger publicKeyModulus = rsaPub.getModulus();
BigInteger publicKeyExponent = rsaPub.getPublicExponent();
System.out.println("publicKeyModulus: " + publicKeyModulus);
System.out.println("publicKeyExponent: " + publicKeyExponent);
} catch (NoSuchAlgorithmException | UnsupportedEncodingException | InvalidKeySpecException e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
给出预期输出:
publicKeyModulus: 119445732379544598056145200053932732877863846799652384989588303737527328743970559883211146487286317168142202446955508902936035124709397221178664495721428029984726868375359168203283442617134197706515425366188396513684446494070223079865755643116690165578452542158755074958452695530623055205290232290667934914919
publicKeyExponent: 65537
Adding to the above Java Program to extract the n-modulus and e-exponent of the Base64 format of RSA would be as follows.
import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.security.KeyFactory;
import java.security.NoSuchAlgorithmException;
import java.security.PublicKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
public class ModulusExpFromPublicKeyRSA {
public static void main(String args[]) {
String publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCqGKukO1De7zhZj6+H0qtjTkVxwTCpvKe4eCZ0FPqri0cb2JZfXJ/DgYSF6vUpwmJG8wVQZKjeGcjDOL5UlsuusFncCzWBQ7RKNUSesmQRMSGkVb1/3j+skZ6UtW+5u09lHNsj6tQ51s1SPrCBkedbNf0Tp0GbMJDyR4e9T04ZZwIDAQAB";
try {
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
byte[] keyBytes = Base64.getDecoder().decode(publicKey.getBytes("UTF-8"));
X509EncodedKeySpec spec = new X509EncodedKeySpec(keyBytes);
PublicKey fileGeneratedPublicKey = keyFactory.generatePublic(spec);
RSAPublicKey rsaPub = (RSAPublicKey)(fileGeneratedPublicKey);
BigInteger publicKeyModulus = rsaPub.getModulus();
BigInteger publicKeyExponent = rsaPub.getPublicExponent();
System.out.println("publicKeyModulus: " + publicKeyModulus);
System.out.println("publicKeyExponent: " + publicKeyExponent);
String nModulus=Base64.getUrlEncoder().encodeToString(publicKeyModulus.toByteArray());
String eExponent=Base64.getUrlEncoder().encodeToString(publicKeyExponent.toByteArray());
System.out.println("n Modulus for RSA Algorithm: " + nModulus);
System.out.println("e Exponent for RSA Algorithm: " + eExponent);
} catch (NoSuchAlgorithmException | UnsupportedEncodingException | InvalidKeySpecException e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
}
}
publicKeyModulus: 119445732379544598056145200053932732877863846799652384989588303737527328743970559883211146487286317168142202446955508902936035124709397221178664495721428029984726868375359168203283442617134197706515425366188396513684446494070223079865755643116690165578452542158755074958452695530623055205290232290667934914919
publicKeyExponent: 65537
n Modulus for RSA Algorithm: AKoYq6Q7UN7vOFmPr4fSq2NORXHBMKm8p7h4JnQU-quLRxvYll9cn8OBhIXq9SnCYkbzBVBkqN4ZyMM4vlSWy66wWdwLNYFDtEo1RJ6yZBExIaRVvX_eP6yRnpS1b7m7T2Uc2yPq1DnWzVI-sIGR51s1_ROnQZswkPJHh71PThln
e Exponent for RSA Algorithm: AQAB
您需要向下转换到透明的java.security.interfaces.RSAPublicKey
类型。然后您可以访问模数和公共指数。
KeyStore ks = KeyStore.getInstance("pkcs12");
ks.load(new FileInputStream(file), password.toCharArray());
Enumeration<String> enumeration = ks.aliases();
while (enumeration.hasMoreElements()) {
String alias = enumeration.nextElement();
Certificate certificate = ks.getCertificate(alias);
RSAPublicKey pub = (RSAPublicKey) certificate.getPublicKey();
System.out.println(pub.getModulus().toString(16));
System.out.println(pub.getPublicExponent().toString(16));
}
问题内容: 给定此文件(使用openssl生成并使用密码加密): 如何使用Java 获取对象?我编写了以下代码,但是找不到正确的方法来获取: 我想我应该构建一个,但我不知道如何。我尝试了这个答案和另一个答案中的方法,但是它们在解析字节数组时都导致错误。 问题答案: 我正在使用 BouncyCastle 1.57 (bcprov-jdk15on,bcmail-jdk15on和bcpkix-jdk15
给定这个文件(使用openssl生成并使用密码加密): 如何在Java中获得一个< code>PrivateKey对象?我编写了以下代码,但是我找不到获取< code>KeySpec的正确方法: 我想我应该构建一个<code>RSAPrivateKeySpec</code>,但我不知道怎么做。我尝试了这个答案和另一个答案中的方法,但在解析字节数组时,它们都会导致错误。
问题内容: 我有一个私钥文件(PEM BASE64编码)。我想在其他地方使用它解密其他数据。使用Java,我尝试读取文件并解码其中的BASE64编码数据。这是我尝试的代码段。 import java.io.; import java.nio.ByteBuffer; import java.security. ; import java.security.spec.PKCS8EncodedKeySp
我有一个私钥文件(PEM BASE64编码)。我想用它来解密一些其他数据。使用Java我试着读取文件并解码其中的BASE64编码数据。这是我尝试的代码片段.... 我得到以下错误 类似的问题已经贴在这里,但那些对我没有用。几乎所有的人都建议使用Bouncycastle provider,而Bouncycastle provider并不愿意使用FIPS兼容的provider,并且不确定BC prov
我已生成一个私钥,其中包含: 在此之后,我生成了一个公钥: 我想使用我的私钥对一些消息进行签名,并使用我的公钥验证一些其他消息,代码如下: 我找到了一个将私钥转换为PKCS8格式并加载的解决方案。它适用于以下代码: 最后我的问题是:如何从文件中加载RSA公钥? 我想可能需要将公钥文件转换为x509格式,并使用。但是我该怎么做呢?
我正在使用openssl库,我想用BIO从. pem文件中读取公钥。我尝试了这个,但我的rsa变量仍然未初始化: 当我调试应用程序时,它向我显示如下内容: 我的文件有效,密钥是按照PKCS#1格式生成的。我用asn1解析器解析了它。