Как установить 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