java - 如何使用 BouncyCastle 从字符串生成私钥
问题描述
我有一个存储在变量中的字符串:
-----BEGIN RSA PUBLIC KEY-----
MIGHAoGBANAahj75ZIz9nXqW2H83nGcUao4wNyYZ9Z1kiNTUYQl7ob/RBmDzs5rY
mUahXAg0qyS7+a55eU/csShf5ATGzAXv+DDPcz8HrSTcHMEFpuyYooX6PrIZ07Ma
XtsJ2J4mhlySI5uOZVRDoaFY53MPQx5gud2quDz759IN/0gnDEEVAgED
-----END RSA PUBLIC KEY-----
我生成公钥为:
public static PublicKey getFromString(String keystr) throws Exception
{
//String S1= asciiToHex(keystr);
byte[] keyBytes = new sun.misc.BASE64Decoder().decodeBuffer(keystr);
ASN1InputStream in = new ASN1InputStream(keyBytes);
DERObject obj = in.readObject();
RSAPublicKeyStructure pStruct = RSAPublicKeyStructure.getInstance(obj);
RSAPublicKeySpec spec = new RSAPublicKeySpec(pStrcut.getModulus(), pStruct.getPublicExponent());
KeyFactory kf = KeyFactory.getInstance("RSA");
return kf.generatePublic(spec);
}
如何在 android 中使用充气城堡生成 PrivateKey
{编辑}
在不使用充气城堡的情况下,我正在生成这样的私钥:
public static PrivateKey getKey(String mKey){
try{
// Read in the key into a String
StringBuilder pkcs8Lines = new StringBuilder();
BufferedReader rdr = new BufferedReader(new StringReader(mKey));
String line;
while ((line = rdr.readLine()) != null) {
pkcs8Lines.append(line);
}
// Remove the "BEGIN" and "END" lines, as well as any whitespace
String pkcs8Pem = pkcs8Lines.toString();
pkcs8Pem = pkcs8Pem.replace("-----BEGIN RSA PRIVATE KEY-----", "");
pkcs8Pem = pkcs8Pem.replace("-----END RSA PRIVATE KEY-----", "");
pkcs8Pem = pkcs8Pem.replaceAll("\\s+","");
// Base64 decode the result
byte [] pkcs8EncodedBytes = Base64.decode(pkcs8Pem, Base64.DEFAULT);
// extract the private key
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(pkcs8EncodedBytes);
KeyFactory kf = KeyFactory.getInstance("RSA");
PrivateKey privKey = kf.generatePrivate(keySpec);
System.out.println(privKey);
return privKey;
}catch (Exception ex){
ex.printStackTrace();
}
return null;
}
我想用 Bouncy Castle 来达到同样的效果
解决方案
我对你为什么坚持使用 bouncycastle 感到有点困惑,但是如果你真的想使用 bouncycastle,那么 CMS/PKIX 库有一个很好的帮助类PEMParser
,它可以缩短所需的代码,例如:
public static PrivateKey getPemPrivateKey(String mKey) throws Exception {
PEMParser pemParser = new PEMParser(new StringReader(mKey));
final PEMKeyPair pemKeyPair = (PEMKeyPair) pemParser.readObject();
final byte[] encoded = pemKeyPair.getPrivateKeyInfo().getEncoded();
KeyFactory kf = KeyFactory.getInstance("RSA");
return kf.generatePrivate(new PKCS8EncodedKeySpec(encoded));
}
推荐阅读
- django - 您可以在 django 中使用 URL 模板标记参数设置第三个选项 URL path() 字典的值吗?
- python - python RuntimeWarning:在减去 x = asanyarray(arr - arrmean) 中遇到无效值
- java - 我得到一个 java.lang.NullPointerException,有人告诉我解决它的方法
- java - 没有确定主要方法?
- php - 即使 file_exists() 返回 true,Laravel PHP require() 也会失败
- javascript - 如何根据相对日期验证 Joi 日期?
- python - Rest 框架和 URL 模式
- android - Android 日期和时间选择器对话框(微调器样式)
- javascript - React Redux:如何在 reducer 中正确返回可迭代数组?
- javascript - Lodash:无法通过自定义谓词进行过滤,包含匹配属性和函数