Шифрование в Java с помощью BlowFish: слишком длинный результат - PullRequest
0 голосов
/ 25 октября 2018

Я должен зашифровать и расшифровать, используя один и тот же секрет BlowFish, используя C, Perl и Java.Хотя C-pgm и Perl дают одинаковые результаты, результирующая строка в Java слишком длинная.Здесь сначала шифруем и дешифруем с помощью pgm, написанного на C:

$ ./enc key Valentin
block: [Valentin]
0a2dc7c9bf82264d
$ ./dec key 0a2dc7c9bf82264d
Valentin

А теперь то же самое написано на Java:

$ java -classpath . BlowFishTest key Valentin
length of pw: 8
length of crypted: 16
0a2dc7c9bf82264dd83df76a225413c1

Интересно, что первая часть результата на Java содержитте же шестнадцатеричные значения, что и в C, но длина 16 байтов.

Код Java:

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

public class BlowFishTest {

    public static void main(String[] args) throws Exception  {
    String key = args[0];
        String clear = args[1];

    encrypt(key, clear);
    }

    private static void encrypt(String key, String password) throws Exception {

    byte[] KeyData = key.getBytes("UTF-8");
    SecretKeySpec KS = new SecretKeySpec(KeyData, "Blowfish");
    Cipher cipher = Cipher.getInstance("Blowfish");
        cipher.init(Cipher.ENCRYPT_MODE, KS);

    byte[] pw = password.getBytes("UTF-8");
        System.out.println("length of pw: " + pw.length);

        byte[] crypted = cipher.doFinal(pw);
        System.out.println("length of crypted: " + crypted.length);
    StringBuilder sb = new StringBuilder();
        for (byte b : crypted) {
           sb.append(String.format("%02X", b));
        }
        System.out.println(sb.toString().toLowerCase());
    }

}

1 Ответ

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

Использование только Blowfish шифра Java неявно означает Blowfish/ECB/Pkcs5padding (это может отличаться в зависимости от используемой платформы).Вы должны всегда указывать шифр в форме алгоритма / режима / заполнения.Размер блочного шифра составляет 64 бита (8 байт).Поэтому Java автоматически добавляет один пустой блок заполнения.

Если вы не хотите использовать какие-либо отступы, вы можете указать Blowfish/ECB/NoPadding.Я бы сказал, что, к счастью, вы шифруете данные одного блока (8 байт), попробуйте разные длины, и вы увидите

...