Как контролировать длину зашифрованной строки (Криптография - Шифрование) - PullRequest
0 голосов
/ 16 октября 2018

Например, я хотел бы передать строку "abc", тогда выходная зашифрованная строка должна быть длиной 32 байта, а когда я хотел бы передать "abcdef", то вывод также должен быть размером 32 байта.Другими словами, я хочу фиксировать длину зашифрованного вывода.Я знаю свой верхний предел.Как я знаю, моя строка никогда не превысит 8 символов.Он должен содержать не более 8 символов или короче 8. Он никогда не будет превышать 8.

Если кто-нибудь поделится кодом в java Cipher, то это будет здорово.

Ответы [ 2 ]

0 голосов
/ 20 октября 2018

Это зависит от алгоритма шифрования, режима и размера блока.

Например, AES использует фиксированный размер блока 128 бит (16 байтов), режимы CBC и ECB будут возвращать фиксированную длину, эта длина будетбыть кратным 128.

Если вы используете режим ECB и длина входного массива байтов равна 10, то для завершения блока необходимо добавить 6 байтов заполнения.

Существует много способовчтобы дополнить блок, вы можете использовать PKCS5 или PKCS7.

В Java вы можете использовать библиотеку Bouncy Castle https://www.bouncycastle.org/ Убедитесь, что вы используете безопасный IV и производный ключ шифрования

В следующем примере обрабатывается заполнениепо библиотеке

public byte[] genIV() {
    byte[] iv = new byte[16];
    new SecureRandom().nextBytes(iv);
    return iv;
}


public byte[] encrypt(byte[] plaintext, byte[] secretKey, byte[] iv) throws NoSuchPaddingException, NoSuchAlgorithmException, NoSuchProviderException, BadPaddingException, IllegalBlockSizeException, InvalidAlgorithmParameterException, InvalidKeyException {
    Cipher in = Cipher.getInstance("AES/ECB/PKCS5Padding", "BC");
    Key key = new SecretKeySpec(secretKey, "AES");
    in.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(iv));
    return in.doFinal(plaintext);
}


public byte[] decrypt(byte[] ciphertext, byte[] secretKey, byte[] iv) throws InvalidAlgorithmParameterException, InvalidKeyException, NoSuchPaddingException, NoSuchAlgorithmException, NoSuchProviderException, BadPaddingException, IllegalBlockSizeException {
    Key key = new SecretKeySpec(secretKey, "AES");
    Cipher out = Cipher.getInstance("AES/ECB/PKCS5Padding", "BC");
    out.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(iv));
    return out.doFinal(ciphertext);
}

Имейте в виду, что каждый символ в строке, в зависимости от кодировки, имеет длину не менее 8 бит, в вашем примере "abcdef" по крайней мере 6длина байта

0 голосов
/ 17 октября 2018

Вы должны применить схему заполнения. Заполнение схемы предназначены для заполнения открытого текста, чтобы они могли вписаться в размер блока блочного шифра.

Вы задали 32 байта, это означает, что для двухблочного шифрования AES.Вы не указали тип безопасности, поэтому я рассмотрю режим работы C TR , для которого потребуется передача IV.

  • Пусть XX XX XX XX XX XX XX XXпредставляет вашу 8-байтовую строку

, например, схему заполнения ANSI X.923, добавьте 0 и в конце длину вашего сообщения.Тогда

XX XX XX XX XX XX XX XX 00 00 00 00 00 00 00 08

будет вашим открытым текстом.08 - длина байта вашего открытого текста.

например, схема заполнения PKCS # 5 и PKCS # 7, добавьте длину вашего сообщения с повторением, тогда

XX XX XX XX XX XX XX XX 08 08 08 08 08 08 08 08 

будет вашимоткрытый текст.

Эти прокладки рассчитаны на один блок.Они расширяют следующий блок, если блок уже заполнен.


Решения;

  1. Повторно добавьте заполненное сообщение, что вы получите два блока.
  2. Зашифруйте зашифрованное сообщение в CTR с увеличенным счетчиком.
  3. Создайте заполнение для себя.
...