Проблемы с расшифровкой и шифрованием RSA и AES

Я создал на своем приложении Android пару ключей RSA.

Я получаю от веб-службы – ключ AES, зашифрованный открытым ключом RSA – строкой, закодированной с помощью ключа AES.

Поэтому я должен сделать следующее: – расшифровать AES Key – расшифровать строку с помощью полученного ключа AES.

Чтобы создать RSA-ключи, я сделал:

keyGen = KeyPairGenerator.getInstance("RSA"); keyGen.initialize(size); keypair = keyGen.genKeyPair(); privateKey = keypair.getPrivate(); publicKey = keypair.getPublic(); 

В RSA-расшифровке я использую:

 public static byte[] decryptRSA( PrivateKey key, byte[] text) throws Exception { byte[] dectyptedText = null; Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); cipher.init(Cipher.DECRYPT_MODE, key); dectyptedText = cipher.doFinal(text); return dectyptedText; } 

В AES decrypt я использую:

 public static byte[] decryptAES(byte[] key, byte[] text) throws Exception { SecretKeySpec skeySpec = new SecretKeySpec(key, "AES"); Cipher cipher = Cipher.getInstance("AES/ECB/PKCS1Padding"); cipher.init(Cipher.DECRYPT_MODE, skeySpec); byte[] decrypted = cipher.doFinal(text); return decrypted; } 

Итак, в моем коде, чтобы получить расшифрованный ключ AES, я делаю

 byte[] decryptedAESKey = sm.decryptRSA(key, Base64.decode(ReceivedBase64EncryptedAESKey)); byte[] decryptedString = sm.decryptAES(decryptedAESKey, Base64.decode(ReceivedEncryptedAESString)); 

В конце я получаю нуль для decryptedString. Что я делаю не так ?

Ну, дело в том, что ключ расшифровал 8 бит, и я должен был сделать его 16 байт, чтобы быть совместимым с AES 128 бит

Итак, я сделал способ его преобразования

  private static byte[] GetKey(byte[] suggestedKey) { byte[] kRaw = suggestedKey; ArrayList<Byte> kList = new ArrayList<Byte>(); for (int i = 0; i < 128; i += 8) { kList.add(kRaw[(i / 8) % kRaw.length]); } byte[] byteArray = new byte[kList.size()]; for(int i = 0; i<kList.size(); i++){ byteArray[i] = kList.get(i); } return byteArray; } 

И переписанный метод расшифровки:

  public static byte[] decryptAES(byte[] key, byte[] text) throws Exception { SecretKeySpec skeySpec = new SecretKeySpec(GetKey(key), "AES"); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding","BC"); byte [] iv = new byte[cipher.getBlockSize()]; for(int i=0;i<iv.length;i++)iv[i] = 0; IvParameterSpec ivSpec = new IvParameterSpec(iv); cipher.init(Cipher.DECRYPT_MODE, skeySpec, ivSpec); byte[] decrypted = cipher.doFinal(text); return decrypted; } 

Я не уверен, какой язык или библиотеки вы используете (выглядит как Java?), Но некоторые действительно общие вещи, чтобы попробовать:

  1. Вы получили зашифрованную строку, хорошо? Проверьте длину ReceivedEncryptedAESString и вывод Base64.decode чтобы проверить, что они выглядят хорошо.
  2. Дешифрование AES не может потерпеть неудачу, поэтому это должно быть проблемой в инициализации библиотеки. Проверьте значение / состояние cipher после этапа построения и этапа инициализации.
  3. Попробуйте более простой тест: игнорируйте шифрование RSA и просто попробуйте что-то расшифровать с помощью вашего объекта Cipher.