Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > java crypto


Автор: sergioK1 18.12.2012, 11:50
вот пример кода (код не мой)

Код


   byte[] input = "   www.java2s.com ".getBytes("UTF-8");
            
            System.out.println(" size of block  : "+ input.length);
            byte[] keyBytes = new byte[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
               0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17 };

           // byte[] keyBytes=new byte[24];
            //keyBytes="12345678".getBytes();
            
            SecretKeySpec key = new SecretKeySpec(keyBytes, "AES");
        
           Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");
        
            System.out.println("input text : " + new String(input));

            // encryption pass

            byte[] cipherText = new byte[input.length];
            cipher.init(Cipher.ENCRYPT_MODE, key);
            int ctLength = cipher.update(input, 0, input.length, cipherText, 0);
            
         //  ??
            ctLength += cipher.doFinal(cipherText, ctLength);
            System.out.println("cipher text: " + new String(cipherText) + " bytes: " + ctLength);

            // decryption pass

            byte[] plainText = new byte[ctLength];
            cipher.init(Cipher.DECRYPT_MODE, key);
            int ptLength = cipher.update(cipherText, 0, ctLength, plainText, 0);
            ptLength += cipher.doFinal(plainText, ptLength);
            System.out.println("plain text : " + new String(plainText) + " bytes: " + ptLength);


ругается на Exception in thread "main" javax.crypto.IllegalBlockSizeException: Input length not multiple of 16 bytes
    at com.sun.crypto.provider.SunJCE_f.a(DashoA13*..)
    at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..)
    at com.sun.crypto.provider.AESCipher.engineDoFinal(DashoA13*..)
    at javax.crypto.Cipher.doFinal(DashoA13*..)
    at com.SecretKey.main(SecretKey.java:45)



вопрос что нужно сделать чтобы работало с любым текстом, а не только кратным 16, из документации я не понимаю что делает этот метод и для какой цели он нужен? если его убрать то исключения нет

вопрос что нужно сделать чтобы работало с любым текстом, а не только кратным 16, из документации я не понимаю что делает этот метод и для какой цели он нужен? если его убрать то исключения нет

с security столкнулся впервые

Автор: MisterCleric 18.12.2012, 22:27
You need padding: http://stackoverflow.com/questions/10935068/what-are-the-cipher-padding-strings-in-java
And a bit theory  smile: http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation

Автор: sergioK1 19.12.2012, 00:34
Цитата(MisterCleric @ 18.12.2012,  21:27)
You need padding: http://stackoverflow.com/questions/10935068/what-are-the-cipher-padding-strings-in-java
And a bit theory  smile: http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation

c IV разобрался, если кому интересно завтра на работе выложу код,
но есть другая проблема хочеться чтобы keyBytes мог быть 256, 512 и  1024,

Код

                    byte[] keyBytes=new byte[256];
                    SecretKeySpec key = new SecretKeySpec(keyBytes, "AES");


валиться,

в этой версии решено (если не найдеться способ) оставить так , а хочеться его найти,
у меня такое ошущении,  что java, у меня 1.6.30, это не реализует
и возможно это либо есть в версии 7, но семерку архитекты пока не хотят внедрять, 
либо есть платные либы, какие?  JCA от оракла отпадает, т,к заказчик хочет FIPS 140-2, 
какие есть варианты, крайний срок еще день, от силы два, т,е нужны не ссылки на теорию а пример рабочего кода ,
с меня бутылка  smile 

Автор: MisterCleric 19.12.2012, 16:35
Привет
А то, что гугл говорит, не устраивает: https://www.google.com.ua/search?q=java+fips+140-2 ?

Автор: sergioK1 19.12.2012, 18:30
Цитата(MisterCleric @ 19.12.2012,  15:35)
Привет
А то, что гугл говорит, не устраивает: https://www.google.com.ua/search?q=java+fips+140-2 ?

да это то не проблема 

у меня есть
Код



  private byte[] key=new byte[16];
  spec = new SecretKeySpec(key, KEY_ALGORITHM);

а хочется поддерживать больший размер ключа 


все что не 16 , (32,64,....1024) валиться
Код

[color=red]java.security.InvalidKeyException: Illegal key size
    at javax.crypto.Cipher.a(DashoA13*..)
    at javax.crypto.Cipher.init(DashoA13*..)
    at javax.crypto.Cipher.init(DashoA13*..)
    at com.ccih.base.crypto.CryptographyAESImpl.encrypt(CryptographyAESImpl.java:110)
    at com.ccih.base.crypto.CryptographyAESImpl.main(CryptographyAESImpl.java:57)[/color]


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)