BRa*_*t27 13 java public-key private-key
我记得很久以前用OpenSSL这么做,但我想知道它是否可能以及如何,我从来没有在java上使用过Cryptography.
Eli*_*uft 28
我们假设我们正在讨论RSA私钥和公钥.然后,如果您使用的是PEM格式文件,那么首先需要将文件中的私钥读入PrivateKey对象:
public PrivateKey readPemRsaPrivateKey(String pemFilename) throws
java.io.IOException,
java.security.NoSuchAlgorithmException,
java.security.spec.InvalidKeySpecException
{
String pemString = File2String(pemFilename);
pemString = pemString.replace("-----BEGIN RSA PRIVATE KEY-----\n", "");
pemString = pemString.replace("-----END RSA PRIVATE KEY-----", "");
byte[] decoded = Base64.decodeBase64(pemString);
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(decoded);
KeyFactory kf = KeyFactory.getInstance("RSA");
return kf.generatePrivate(keySpec);
}
Run Code Online (Sandbox Code Playgroud)
其中File2String是这样的:
private static String File2String(String fileName) throws
java.io.FileNotFoundException, java.io.IOException
{
File file = new File(fileName);
char[] buffer = null;
BufferedReader bufferedReader = new BufferedReader(new FileReader(file));
buffer = new char[(int)file.length()];
int i = 0;
int c = bufferedReader.read();
while (c != -1) {
buffer[i++] = (char)c;
c = bufferedReader.read();
}
return new String(buffer);
}
Run Code Online (Sandbox Code Playgroud)
现在,您可以使用以下代码生成相应的PublicKey:
import java.security.interfaces.RSAPrivateCrtKey;
import java.security.spec.RSAPublicKeySpec;
Run Code Online (Sandbox Code Playgroud)
...
PrivateKey myPrivateKey = readPemRsaPrivateKey(myPrivateKeyPemFileName);
RSAPrivateCrtKey privk = (RSAPrivateCrtKey)myPrivateKey;
RSAPublicKeySpec publicKeySpec = new java.security.spec.RSAPublicKeySpec(privk.getModulus(), privk.getPublicExponent());
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey myPublicKey = keyFactory.generatePublic(publicKeySpec);
Run Code Online (Sandbox Code Playgroud)
小智 5
请确保 Eli Rosencruft 的答案基本正确,但模数和公共指数的顺序不正确!这是正确的说法:
RSAPublicKeySpec publicKeySpec = new java.security.spec.RSAPublicKeySpec(privk.getModulus(), privk.getPublicExponent());
Run Code Online (Sandbox Code Playgroud)
Pol*_*ial -9
您不能直接从另一个密钥生成另一个密钥。这在数学上是不可能的。如果您有一个包含公钥和私钥的密钥 blob,则可以相对轻松地提取其中之一。
\n\n编辑,2017 年:多年以后,对加密有了更好的理解,现在我很清楚这个答案并不正确。
\n\n引用维基百科:
\n\n\n\n\n公钥由模数 n 和公共(或加密)指数 e 组成。私钥由模数 n 和私有(或解密)指数 d 组成,必须保密。p、q 和 \xce\xbb(n) 也必须保密,因为它们可用于计算 d。
\n
公共模数 n 可以计算为 p × q。原始私钥中唯一缺少的是 e,但该值通常选择为 65537,如果没有,您仍然可以根据 d 和 \xce\xbb(n) 计算 e。
\n\n然而,许多私钥存储格式实际上包含公共模数 n 以及其他组件,因此您可以直接提取值。
\n\n编辑,2018:仍然有人对此投反对票,这是正确的!我留下这个答案是为了让人们知道我最初为什么错了,并提醒自己以后不要再犯错。
\n 归档时间: |
|
查看次数: |
15511 次 |
最近记录: |