шифрование с использованием предоставленного ключа с использованием DES с дополнением

Я хочу зашифровать фрейм с помощью DES, используя заданный ключ.

Я использую стиль заполнения PKCS5Padding. Это дополняет строку 02 02, если нужно добавить 2 байта, и 03 03 03, если нужно добавить 3 байта, чтобы сделать кратным 8. Но мое требование состоит в том, чтобы дополнить строку моими конкретными байтами. например, если 2 байта должны быть добавлены, то 30 30 и 3 байта должны быть добавлены, затем 30 30 30 (в шестнадцатеричном значении 0 равно 30). Кроме того, я должен знать, сколько дополненных байтов было добавлено. Какой технике заполнения следует следовать и как ее использовать?

Ниже мой код для шифрования:

byte[] keyValue = new byte[]{(byte) 0x30, (byte) 0x30, (byte) 0x30, (byte) 0x30, (byte) 0x30, (byte) 0x16,(byte) 0x05, (byte) 0x12};
myKeySpec = new DESKeySpec(keyValue);
mySecretKeyFactory = SecretKeyFactory.getInstance("DES");
key = mySecretKeyFactory.generateSecret(myKeySpec);


Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
IvParameterSpec iv2 = new IvParameterSpec(new byte[8]);
cipher.init(Cipher.ENCRYPT_MODE, key, iv2);
byte[] plainText = function.HexStringToByteArray(payloadRecv);
byte[] encryptedText = cipher.doFinal(plainText);

person java2485    schedule 17.05.2012    source источник


Ответы (1)


Не выбирайте PKCS5Padding в спецификации шифра. Выберите NoPadding. Вам нужно будет добавить дополнение к данным перед их шифрованием. После его расшифровки (также без заполнения) вам нужно будет проверить последний байт, чтобы узнать, сколько байтов заполнения нужно удалить, и удалить его самостоятельно.

По сути, просто кодируйте именно то, что вы описали.

person David Schwartz    schedule 17.05.2012
comment
Это правильно, но я надеюсь, что ваши данные не заканчиваются на 30h, потому что отличить данные от заполнения будет невозможно. Я никогда не слышал о механизме заполнения, который описывает спрашивающий, поэтому он не будет включен ни в один криптографический API. - person Maarten Bodewes; 17.05.2012
comment
@Robert: ну да, если вы всегда добавляете отступы, они будут отступами. Как это относится к моему комментарию? - person Maarten Bodewes; 17.05.2012
comment
@Robert: Какая бы схема заполнения не использовалась, она должна позволять дешифратору различать реальные данные и заполнение. Если реальные данные заканчиваются на 30H, то как узнать, где заканчиваются реальные данные и начинается заполнение? Предположим, дешифратор расшифровывает последний блок и видит 30H 30H. Какие байты заполняются, а какие являются данными? - person President James K. Polk; 17.05.2012
comment
Если я правильно понимаю исходный вопрос, он определяет количество добавляемых байтов заполнения, а затем устанавливает значение каждого байта в 16 раз больше этого числа. Итак, если последний байт равен 0x40, то есть 4 байта заполнения. - person David Schwartz; 17.05.2012