Загружаю ключ из памяти телефона, декодирую из base64 в byte, получаю ключ и дальше уже работаю с ним. Но при запуске программа выдает ошибку
unknown key type passed to RSA.
Что я делаю не правильно?
void main1() throws LoginException, NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException, UnsupportedEncodingException {
String test = "hello";
Cipher cipher2 = Cipher.getInstance("RSA");
//key
byte [] decodedPublicKey = Base64.decode(myPublickKey, 4);
byte[] decodedPrivateKey = Base64.decode(myPrivateKey,4);
SecretKey originalPublicKey = new SecretKeySpec(decodedPublicKey, 0, decodedPublicKey.length, "RSA");
SecretKeySpec originalPrivateKey = new SecretKeySpec(decodedPrivateKey, 0, decodedPrivateKey.length, "RSA");
cipher2.init(Cipher.ENCRYPT_MODE, originalPublicKey);
byte[] bytes2 = cipher2.doFinal(test.getBytes());
Cipher decript2 = Cipher.getInstance("RSA");
decript2.init(Cipher.DECRYPT_MODE,originalPrivateKey);
byte[] decriptedBytes2 = decript2.doFinal(bytes2);
for (byte b : decriptedBytes2)kodMess+=(char) b;
Toast.makeText(ChatActivity.this, kodMess, Toast.LENGTH_SHORT).show();
}
Кодирую так
//генерирую ключ
KeyPairGenerator pairGenerator = KeyPairGenerator.getInstance("RSA");
KeyPair keyPair = pairGenerator.generateKeyPair();
Key publicKey = keyPair.getPublic();
Key privateKey = keyPair.getPrivate();
//ключи в строку
final String encodedPublicKey = Base64.encodeToString(publicKey.getEncoded(),0);
final String encodedPrivateKey = Base64.encodeToString(privateKey.getEncoded(),0);
//обратно в байты
byte [] decodedPublicKey = Base64.decode(encodedPublicKey, 0);
byte[] decodedPrivateKey = Base64.decode(encodedPrivateKey,0);
//из байт в ключи
SecretKey originalPublicKey = new SecretKeySpec(decodedPublicKey, 0, decodedPublicKey.length, "RSA");
SecretKey originalPrivateKey = new SecretKeySpec(decodedPrivateKey, 0, decodedPrivateKey.length, "RSA");
Попробуйте как в коде ниже. Дело в том, что конструкторы SecretKeySpec не знают ничего о внутреннем формате ключей. Для этого нужно использовать X509EncodedKeySpec и PKCS8EncodedKeySpec:
KeyPairGenerator pairGenerator = KeyPairGenerator.getInstance("RSA");
KeyPair keyPair = pairGenerator.generateKeyPair();
Key publicKey = keyPair.getPublic();
Key privateKey = keyPair.getPrivate();
final byte[] encodedPublicKeyBytes = Base64.getEncoder().encode(publicKey.getEncoded());
final byte[] encodedPrivateKeyBytes = Base64.getEncoder().encode(privateKey.getEncoded());
final String encPubKey = new String(encodedPublicKeyBytes);
final String encPrivKey = new String(encodedPrivateKeyBytes);
System.out.println(encPubKey);
System.out.println(encPrivKey);
Cipher cipher = Cipher.getInstance("RSA");
byte[] decPubKey = Base64.getDecoder().decode(encodedPublicKeyBytes);
X509EncodedKeySpec X509pubKey = new X509EncodedKeySpec(decPubKey);
PublicKey pubKey = KeyFactory.getInstance("RSA").generatePublic(X509pubKey);
cipher.init(Cipher.ENCRYPT_MODE, pubKey);
byte[] rsaEncrypted = cipher.doFinal("test-test-test".getBytes());
cipher = Cipher.getInstance("RSA");
byte[] decPrivKey = Base64.getDecoder().decode(encodedPrivateKeyBytes);
PKCS8EncodedKeySpec encodedKeySpec = new PKCS8EncodedKeySpec(decPrivKey);
PrivateKey privKey = KeyFactory.getInstance("RSA").generatePrivate(encodedKeySpec);
cipher.init(Cipher.DECRYPT_MODE, privKey);
byte[] rsaDecrypted = cipher.doFinal(rsaEncrypted);
System.out.println(new String(rsaDecrypted));
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости