Ключ шифрования не подходит

151
03 декабря 2017, 12:58

Загружаю ключ из памяти телефона, декодирую из 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");
Answer 1

Попробуйте как в коде ниже. Дело в том, что конструкторы 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));
READ ALSO
Серверная часть для android-приложения на Java?

Серверная часть для android-приложения на Java?

Добрый день, уважаемые разработчикиСтолкнулся с задачей выбора способа реализации серверной части для android-приложения

173
Как преобразовать один Map в другой?

Как преобразовать один Map в другой?

Есть Map<Entity,List<Integer>, также имеется Mapper для entity->dto и обратноКак из первой Map получить Map<Dto,List<Integer>> при помощи лямбд?

145
Android. Иногда устройство не пробуждается

Android. Иногда устройство не пробуждается

Имеется приложение, часть которого работает по типу будильника

142
Custom Chrome Tabs без выбора браузера

Custom Chrome Tabs без выбора браузера

Всем привет! Не могу решить проблему, при которой CastomTabsIntent открывает окно выбора браузераХочется как то пропустить этот момент, что бы сразу...

162