Как реализовать алгоритм Blowfish CBC Space Padding - PullRequest
0 голосов
/ 24 сентября 2018

Я должен реализовать заполнение Java-шифра.Я пытаюсь написать как нравится реализация Perl-кода, где поддерживается режим Blowfish / CBC / space.Я не смог найти соответствующий режим в списке Java Cipher и поддерживает только PCK5Padding и NoPadding.Является ли Java поддержкой пробелов, если да, кто-нибудь может мне помочь.

1 Ответ

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

Space заполнение добавляет пробелы, поэтому длина, кратная 8, при шифровании или усечения пробелов после расшифровки.В Java вы можете использовать NoPadding и управлять интервалом самостоятельно.

Например, для шифрования в Perl и дешифрования в Java:

Perl:

use Crypt::CBC;

$cipher = Crypt::CBC->new(
    -literal_key => 1,
    -key => pack("H*",
      "11223344556677889900112233445566778899001122334"
      . "455667788990011223344556677889900112233445566"
      . "77889900112233445566"),
    -cipher => 'Blowfish',
    -header => 'none',
    -padding => 'space',
    -iv => pack("H*", '1234567812345678')
);

$ciphertext = $cipher->encrypt_hex("Message");
print(join('',unpack('H*',$cipher->iv())));
print $ciphertext;

Вывод: 1234567812345678e70b9ab0a4262ba8

Java:

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

import org.apache.commons.codec.Charsets;
import org.apache.commons.codec.binary.Hex;

public class Main {
    public static void main(String[] args) throws Exception {
        Cipher cipher = Cipher.getInstance("Blowfish/CBC/NoPadding");
        SecretKeySpec key = new SecretKeySpec(Hex.decodeHex(
            "11223344556677889900112233445566778899001122334"
              + "455667788990011223344556677889900112233445566"
              + "77889900112233445566"),
            "Blowfish");
        byte[] iv = Hex.decodeHex("1234567812345678");

        cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(iv));
        byte[] result = cipher.doFinal(Hex.decodeHex("e70b9ab0a4262ba8"));

        System.out.println(new String(result, Charsets.UTF_8).trim());
    }
}

Вывод: Message

...