Загружаю ключ из памяти телефона, декодирую из 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));
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Добрый день, уважаемые разработчикиСтолкнулся с задачей выбора способа реализации серверной части для android-приложения
Есть Map<Entity,List<Integer>, также имеется Mapper для entity->dto и обратноКак из первой Map получить Map<Dto,List<Integer>> при помощи лямбд?
Имеется приложение, часть которого работает по типу будильника
Всем привет! Не могу решить проблему, при которой CastomTabsIntent открывает окно выбора браузераХочется как то пропустить этот момент, что бы сразу...