2016-04-27 3 views
0

У меня возникла проблема с шифрованием с использованием java AES/CBC/PKCS7Padding. Я уже искал и следил за ходом до использования провайдера BouncyCastle. Но я до сих пор не могу получить право шифрованияJAVA-шифрование с AES/CBC/PKCS7Padding

Пусть говорят, что требования:

Тип шифрования: Симметричный
Алгоритм: AES
Размер блока = 128bit (16 байт)
Cipher режим: CBC
режим Перетяжка : PKCS7
Шифрование длина ключа: 256 бит (32 байта)
вектор инициализации длина (IV): 128 бит (16 байт)

образец:

Plain данные = ABC123
Зашифрованные данные (в формате base64) = CtGtW4hJfXxilSfNR1xmrg ==

и мой код ...

public final class StringFunc { 
    final static String key = "jb2a19ou79rws6zknjlr803fvfgiyp1k"; 
    final static String algorithm = "AES/CBC/PKCS7Padding"; 
    final static String iv = "hod74ty97wr97g83"; 
    private static Cipher cipher = null; 
    private static SecretKeySpec skeySpec = null; 
    private static IvParameterSpec ivSpec = null; 

    private static void setUp(){ 
     try{ 
      Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); 
      skeySpec = new SecretKeySpec(key.getBytes(), "AES"); 
      ivSpec = new IvParameterSpec(iv.getBytes()); 
      cipher = Cipher.getInstance(algorithm); 
     }catch(NoSuchAlgorithmException | NoSuchPaddingException ex){ 
     } 
    } 

    public static String encrypt(String str){ 
     try{ 
      Integer strL = (int) Math.ceil(str.length()/8.0); 
      Integer strB = strL*8; 
      str = padRight(str, '', strB); 
      setUp(); 
      try { 
       cipher.init(Cipher.ENCRYPT_MODE, skeySpec, ivSpec); 
      } catch (InvalidAlgorithmParameterException ex) { 
       return ""; 
      } 
      byte[] enc = cipher.doFinal(str.getBytes()); 
      return new String(Base64.encodeBase64(enc)); 
     }catch(InvalidKeyException | IllegalBlockSizeException | BadPaddingException ex){ 
      return "";    
     } 
    } 

    public static String padRight(String msg, char x, int l) { 
     String result = ""; 
     if (!msg.isEmpty()) { 
      for (int i=0; i<(l-msg.length()); i++) { 
       result = result + x; 
      } 
      result = msg + result; 
     } 
     return result; 
    } 
} 

Я до сих пор не могу получить правильный шифрования. Кто-нибудь может помочь или дать предложение?

+0

В чем проблема? –

+0

Я проверил ваш код, и у меня есть исключение. вы проверили свой код? не исключение? –

+0

проблема, я просто не могу получить правильный результат, как тот, который мне дал. Код, уже сокращенный по этой причине, делает его коротким сэром, вы не можете просто скопировать вставку для его запуска. – lendir

ответ

0

Угадайте данные с данного ввода, вы должны столкнуться с ограничением Javas на длину ключа: Поскольку США не разрешают использование жестких ключей безопасности, Java ограничивается длиной ключа 128 бит по умолчанию.

Чтобы включить ключи> 128bit вы должны изменить политику вашей версии Java с OFFICAL «неограниченными» политиками (here for SE8)

переписав текущую политику в Lib/безопасность при загрузке должна быть достаточно.

+0

Я посмотрю, сэр, спасибо, я скоро обновлю прогресс. – lendir

Смежные вопросы