如何将字符串转换为私钥?

3

我正在尝试将存储在SharedPreferences中的字符串转换为PrivateKey,但我无法这样做。

这是我将PrivateKey转换为String的方法:

kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(1024);
kp = kpg.genKeyPair();
publicKey = kp.getPublic();
privateKey = kp.getPrivate();

byte[] privateKeyBytes = publicKey.getEncoded();
String privKeyStr = new String(Base64.encode(privateKeyBytes));

SharedPreferences.Editor editor = getPrefs(context).edit();
editor.putString(user + "_private_key", privKeyStr + "");
editor.commit();

以下是我尝试从SharedPreference中检索密钥并将其转换回PrivateKey的方法:

String privKeyStr = getPrefs(context).getString(user + "_private_key", "no private key");
Log.d("key", privKeyStr);
byte[] sigBytes = new byte[0];
try {
    sigBytes = Base64.decode(privKeyStr.getBytes("UTF-8"));
} catch (UnsupportedEncodingException e) {
    e.printStackTrace();
}
PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(sigBytes);
KeyFactory keyFact = KeyFactory.getInstance("RSA");
PrivateKey privateKey = null;

try {
    privateKey = keyFact.generatePrivate(privateKeySpec);  //throws exception
} catch (InvalidKeySpecException e) {
    e.printStackTrace();
}

以下是我一直收到的错误信息:

java.security.spec.InvalidKeySpecException: java.lang.RuntimeException: error:0c0000b9:ASN.1 encoding routines:OPENSSL_internal:WRONG_TAG

我知道类似的问题已经被问过了,但是似乎没有一个能解决我的问题。

请帮助我找出我错在哪里。


请检查此链接 https://stackoverflow.com/questions/28218636/invalidkeyspecexception-using-public-key,希望能对您有所帮助。 - Jackey kabra
你能否给出一个解释或演示?这样会更容易理解。 - Vishist Varugeese
请使用Base64.decode(privKeyStr,Base64.DEFAULT)代替Base64.decode(privKeyStr.getBytes("UTF-8"))另外,您在编辑后是否已经进行了提交/应用? - Sagar
1个回答

5

请更改

byte[] privateKeyBytes = publicKey.getEncoded();

使用

byte[] privateKeyBytes = privateKey.getEncoded();

代码的其余部分似乎是正确的。

非常感谢!我真是太傻了!在这上面花了一整天。 - Vishist Varugeese
我面临另一个问题,我生成的私钥是OpenSSLRSAPrivateCrtKey {modulus = a91429b4419419c824b7665e24fdecaf5e9d8ca0f66c102a96001dce08fb92b3e289b92f6db467b5ddd8d469463bb98dd2ce7ffa7c764e1957e1145bb6caa97181a9acf1c2df812f4cabd875b5c29e8ff2092ac03bb0f1e23f6ac6dabc5382a19394f1854804dc839956258ffa76095962ff01de323bab084e6007c786dc9411,publicExponent=10001} - Vishist Varugeese
但是在将字符串转换为私钥后,我得到了OpenSSLRSAPrivateKey{modulus=a91429b4419419c824b7665e24fdecaf5e9d8ca0f66c102a96001dce08fb92b3e289b92f6db467b5ddd8d469463bb98dd2ce7ffa7c764e1957e1145bb6caa97181a9acf1c2df812f4cabd875b5c29e8ff2092ac03bb0f1e23f6ac6dabc5382a19394f1854804dc839956258ffa76095962ff01de323bab084e6007c786dc9411 - Vishist Varugeese
我没有得到publicExponent部分,而且我得到的是OpenSSLRSAPrivateKey而不是OpenSSLRSAPrivateCrtKey - Vishist Varugeese
你不应该使用内部实现类,因为它在版本之间会发生变化。你可以将 PrivateKey 强制转换为 RSAPrivateKeyRSAPrivateCrtKey。我想你可以提取后者的公共指数。 - pedrofb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接