【问题标题】:How to convert String to Private key?如何将字符串转换为私钥?
【发布时间】:2018-04-03 06:30:22
【问题描述】:

我正在尝试将存储在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

我知道之前已经提出过类似的问题,但似乎都没有解决我的问题。

请帮助我知道我哪里出错了。

【问题讨论】:

  • stackoverflow.com/questions/28218636/… 请检查一下,希望对您有所帮助
  • 能否给个解释或示范一下?会更容易理解。
  • 而不是Base64.decode(privKeyStr.getBytes("UTF-8")) 使用Base64.decode(privKeyStr,Base64.DEFAULT)editing 之后你还commit/apply 吗?

标签: java android cryptography rsa


【解决方案1】:

请更改

byte[] privateKeyBytes = publicKey.getEncoded();

byte[] privateKeyBytes = privateKey.getEncoded();

其余代码似乎正确

【讨论】:

  • 非常感谢!我真是太傻了!花了一天时间
  • 我面临另一个问题,我生成的私钥是OpenSSLRSAPrivateCrtKey{modulus=a91429b4419419c824b7665e24fdecaf5e9d8ca0f66c102a96001dce08fb92b3e289b92f6db467b5ddd8d469463bb98dd2ce7ffa7c764e1957e1145bb6caa97181a9acf1c2df812f4cabd875b5c29e8ff2092ac03bb0f1e23f6ac6dabc5382a19394f1854804dc839956258ffa76095962ff01de323bab084e6007c786dc9411,publicExponent=10001}
  • 但在将字符串转换为私钥后,我得到了OpenSSLRSAPrivateKey{modulus=a91429b4419419c824b7665e24fdecaf5e9d8ca0f66c102a96001dce08fb92b3e289b92f6db467b5ddd8d469463bb98dd2ce7ffa7c764e1957e1145bb6caa97181a9acf1c2df812f4cabd875b5c29e8ff2092ac03bb0f1e23f6ac6dabc5382a19394f1854804dc839956258ffa76095962ff01de323bab084e6007c786dc9411
  • 我没有得到publicExponent 部分,我得到的是OpenSSLRSAPrivateKey 而不是OpenSSLRSAPrivateCrtKey
  • 您不应该使用内部实现类,因为它在版本之间会发生变化。您可以将PrivateKey 转换为RSAPrivateKeyRSAPrivateCrtKey。我想您可以提取后者的公共指数。
猜你喜欢
  • 1970-01-01
  • 2017-09-08
  • 1970-01-01
  • 2021-03-01
  • 2019-09-04
  • 2019-03-01
  • 1970-01-01
  • 2013-07-17
  • 2021-06-07
相关资源
最近更新 更多