Проблема с расшифровкой и шифрованием RSA и AES - PullRequest
5 голосов
/ 13 сентября 2010

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

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

Поэтому я должен сделать следующее: - расшифровать ключ AES - расшифровать строку с помощью полученного ключа 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 я использую:

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.Что я делаю неправильно ?

Ответы [ 2 ]

3 голосов
/ 17 сентября 2010

Ну, дело в том, что расшифрованный ключ был длиной 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;   
        }
0 голосов
/ 13 сентября 2010

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

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