Как да зададете BlockSize и KeySize с помощта на AES криптиране в java

Опитвам се да задам BlockSize и KeySize в кода за криптиране на Java.
Ето моят код, който работи добре, но как да посоча aes.BlockSize=128 и aes.KeySize=128?
Имам препратка към Aes aes = AesManaged() в .NET, в който можем да зададем следния параметър, както следва

aes.BlockSize = 128;
aes.KeySize = 128;
CipherMode.ECB;
aes.Padding = PaddingMode.None;           

В кода по-долу съм задал следните три параметъра:

aes.Key = key
aes.Mode = CipherMode.ECB
aes.Padding = PaddingMode.None

но не мога да настроя

aes.BlockSize = 128
aes.KeySize = 128;

public static void main(String args[]) {

            byte[] keyForEncription = new byte[16];
            byte[] keyForDecription = new byte[16];
            long FixedKey = 81985526925837671L;
            long VariableKey = 744818830;

            for (int i1 = 0; i1 < 8; i1++) {

                keyForEncription[i1] = (byte) (FixedKey >> (8 * i1));
                keyForEncription[i1 + 8] = (byte) (VariableKey >> (8 * i1));
            }

            short[] data = new short[96];

            data[0] = 2;
            data[1] = 0;
            data[2] = 0;
            data[3] = 0;
            data[4] = 0;
            data[5] = 6;
            data[6] = 6;
            data[7] = 81;
            data[8] = 124;
            data[9] = 23;
            data[10] = 3;

            SecretKeySpec skeySpec = new SecretKeySpec(keyForEncription, "AES");
            Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");
            cipher.init(Cipher.ENCRYPT_MODE, skeySpec);

            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            CipherOutputStream cos = new CipherOutputStream(bos, cipher);
            DataOutputStream dos = new DataOutputStream(cos);

            byte[] byteArray_data = new byte[data.length];

            for (int i1 = 0; i1 < data.length; i1++)
                byteArray_data[i1] = (byte) data[i1];

                dos.write(byteArray_data, 0, 16);
            dos.close();

            byte[] ENCRYPTED_DATA = bos.toByteArray();

            for (int i1 = 0; i1 < 8; i1++) {

                keyForDecription[i1] = (byte) (FixedKey >> (8 * i1));
                keyForDecription[i1 + 8] = (byte) (VariableKey >> (8 * i1));
            }

            SecretKeySpec skeySpec_decryption = new SecretKeySpec(keyForDecription,
                    "AES");
            Cipher cipher1 = Cipher.getInstance("AES/ECB/NoPadding");
            cipher1.init(Cipher.DECRYPT_MODE, skeySpec_decryption);

                    ByteArrayInputStream bis = new ByteArrayInputStream(ENCRYPTED_DATA);
            CipherInputStream cis = new CipherInputStream(bis, cipher1);
            DataInputStream dis = new DataInputStream(cis);

            byte[] DECRYPTED_DATA = new byte[byteArray_data.length];
            dis.readFully(DECRYPTED_DATA, 4, 16);
            cis.close();

person Jivan    schedule 15.03.2013    source източник
comment
AES винаги е 128 бита и поддържа само 128, 192 и 256 битови ключове. Това, с което го бъркате, е Rijndael, който поддържа повече размери на ключове и различни размери на блокове. Очевидно .NET също ги обърква (но само ако не хвърля изключение при избор на параметри извън спецификацията на AES, което не мога да направя извод от вашия въпрос).   -  person Mark Jeronimus    schedule 06.03.2016


Отговори (1)


Тъй като инициализирате шифъра с ключ от 16 байта (128 бита), той неявно използва това като размер на ключа.

А по отношение на размера на блока, спецификацията на JCA казва:

AES е 128-битов блоков шифър, поддържащ ключове от 128, 192 и 256 бита.

Така че размерът на блока винаги е 128 бита.

person JB Nizet    schedule 15.03.2013