Как получить ту же самую кодировку строки длины с Blowfish + Hex - PullRequest
0 голосов
/ 13 января 2020

Мы пытаемся кодировать несколько входных строк одинаковой длины (32), применяя кодирование Blowfi sh + Hex. Проблема в том, что не всегда конечные кодированные строки имеют ту же длину, что и мы ожидаем (32 строки длины). Ниже вы найдете используемый код. Пожалуйста, не могли бы вы подсказать, что не так?

public static String encrypt(String clear, String key)
{                          
    try
    {
        Security.setProperty("crypto.policy", "unlimited");
        byte [] keyBytes = key.getBytes("ASCII");//toByteArray(key);
        filelogger.info("Key coded in bytes "+keyBytes);
        SecretKeySpec skey = new SecretKeySpec(keyBytes, "Blowfish");
        byte [] clearBytes = clear.getBytes();//toByteArray(clear);
        filelogger.info("Input string coded in bytes "+clearBytes);
        Cipher ci = Cipher.getInstance("Blowfish");                            
        ci.init(Cipher.ENCRYPT_MODE, skey);

        // encrypt the clear bytes value
        byte[] encoded = ci.doFinal(clearBytes);
        filelogger.info("Blowfish output "+encoded);

        return Base64.getEncoder().encodeToString(encoded);
    }
    catch (Exception e)
    {
        filelogger.error("Error while encrypting: " + e.toString());
        logger.error("Error while encrypting: " + e.toString());

        return Base64.getEncoder().encodeToString(new byte[0]);
    }
}

С уважением

1 Ответ

0 голосов
/ 14 января 2020

Мы решили использовать следующее решение:

  1. Передача опции "Blowfish / ECB / NoPadding" в функцию getInstance.

    publi c byte [] encryptBlowfishECBNopadding (ключ byte [], byte [] dati) {byte [] output = null; try {SecretKeySpe c KS = new SecretKeySpe c (ключ, "Blowfi sh"); Cipher cipher = Cipher.getInstance ("Blowfish / ECB / NoPadding"); cipher.init (Cipher.ENCRYPT_MODE, KS); output = cipher.doFinal (dati); обратный вывод; } catch (Exception ee) {logger.error (ee.getMessage ()); filelogger.error (ee.toString ()); вернуть новый байт [0]; }}

  2. Кодирование результата метода, как показано ниже:

    byte [] encryptresult = encryptBlowfishECBNopadding (toByteArray (decriptedki), toByteArray (criptokeyhlr.getKeydata ()) ; String stringencriptedki = Hex.encodeHexString (encryptresult) .toUpperCase ();

Таким образом, каждая выходная строка имеет одинаковую длину.

Спасибо всем за поддержку!

...