gpt4 book ai didi

java - Android 加密 RSA InvalidKeyException

转载 作者:搜寻专家 更新时间:2023-11-01 08:28:53 25 4
gpt4 key购买 nike

亲爱的,

我需要帮助来理解为什么 decryptString 不起作用并抛出“java.security.InvalidKeyException:需要 RSA 私钥或公钥”。当调用加密方法时,我通过私钥/证书使用公钥。

感谢您的帮助!

public class KeysHandler {

/***
* Generate and store in AndroidKeyStore a security KeyPair keys.
* @param alias - Alias to create the key.
* @return KeyPair object with: private and public key.
*/
public static KeyPair generateKeyPair(String alias) {
KeyPair kp = null;
if (alias != null) {
try {

KeyPairGenerator kpg = KeyPairGenerator.getInstance(KeyProperties.KEY_ALGORITHM_RSA, "AndroidKeyStore");
kpg.initialize(new KeyGenParameterSpec.Builder(alias,
KeyProperties.PURPOSE_SIGN |
KeyProperties.PURPOSE_VERIFY |
KeyProperties.PURPOSE_ENCRYPT |
KeyProperties.PURPOSE_DECRYPT)
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_PKCS1)
.build());

kp = kpg.generateKeyPair();

} catch (NoSuchProviderException | NoSuchAlgorithmException | InvalidAlgorithmParameterException ex) {
kp = null;
}
}
return kp;
}

public static String encryptString(String alias, String textToEncrypt) {
String cipheredText = null;

try {
KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
keyStore.load(null);

KeyStore.PrivateKeyEntry privateKeyEntry = (KeyStore.PrivateKeyEntry)keyStore.getEntry(alias, null);

// Encrypt the text
if(textToEncrypt != null && textToEncrypt.length() > 0) {

Cipher input = Cipher.getInstance("RSA/ECB/PKCS1Padding", "AndroidOpenSSL");
input.init(Cipher.ENCRYPT_MODE, privateKeyEntry.getCertificate().getPublicKey());

ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
CipherOutputStream cipherOutputStream = new CipherOutputStream(
outputStream, input);
cipherOutputStream.write(textToEncrypt.getBytes("UTF-8"));
cipherOutputStream.close();

byte[] vals = outputStream.toByteArray();
cipheredText = Base64.encodeToString(vals, Base64.DEFAULT);
}
} catch (Exception e) {
cipheredText = null;
}

return cipheredText;
}


public static String decryptString(String alias, String cipheredText) {

String clearText = null;
try {
KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
keyStore.load(null);

KeyStore.PrivateKeyEntry privateKeyEntry = (KeyStore.PrivateKeyEntry)keyStore.getEntry(alias, null);

Cipher output = Cipher.getInstance("RSA/ECB/PKCS1Padding", "AndroidOpenSSL");
output.init(Cipher.DECRYPT_MODE, privateKeyEntry.getPrivateKey());

CipherInputStream cipherInputStream = new CipherInputStream(
new ByteArrayInputStream(Base64.decode(cipheredText, Base64.DEFAULT)), output);
ArrayList<Byte> values = new ArrayList<>();
int nextByte;
while ((nextByte = cipherInputStream.read()) != -1) {
values.add((byte)nextByte);
}

byte[] bytes = new byte[values.size()];
for(int i = 0; i < bytes.length; i++) {
bytes[i] = values.get(i).byteValue();
}

clearText = new String(bytes, 0, bytes.length, "UTF-8");

} catch (Exception e) {
clearText = null;
}

return clearText;
}
}

最佳答案

尝试省略密码提供者:

Cipher output = Cipher.getInstance("RSA/ECB/PKCS1Padding");

其次,您可以先实例化提供者以确保其有效,然后将其作为第二个参数传递给 Cipher.getInstance()。第二个参数可以是字符串(提供者名称) 或提供者(对象)。使用第二个可能会使调试更容易。

关于java - Android 加密 RSA InvalidKeyException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42250058/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com