Blowfish шифрование и дешифрование не работает - PullRequest
0 голосов
/ 09 мая 2019

Так что я использую простое шифрование / дешифрование Blowfish для приложения, которое я делаю. Иногда это работает, но не надежно.

Зашифрованный шаблон формы:

email@gmail.com

message

END

Это прекрасно работает, когда я использую электронную почту, такую ​​как test1@gmail.com или test2@gmail.com. Когда я использую свою личную электронную почту: tywemc@gmail.com, форма зашифрована, но когда она расшифрована, она возвращает î / ÅÝ®Îmail.comÄþ4œ ’> L / ND

Так что кажется, что он расшифровывает часть формы, но не все, и я не могу понять, почему. Кажется, что он расшифровывает другие формы частично с другими реальными электронными письмами, но все же не полностью. Для простоты я использую статический ключ в классе Crypto.java.

Я пытался убедиться, что из-за длинных электронных писем он не работал из-за размера блока или длины строки, но я не думаю, что это проблема.

Crypto.java

package core;

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

public class Crypto {

    private static String key = "key12345";

    public static String encrypt(String strClearText,String strKey) {
        String strData = "";

        try {
            SecretKeySpec skeyspec = new SecretKeySpec(key.getBytes(), "Blowfish");
            System.out.println("Ëncryption keyspec: " + skeyspec.toString());
            Cipher cipher = Cipher.getInstance("Blowfish");
            cipher.init(Cipher.ENCRYPT_MODE, skeyspec);
            byte[] encrypted = cipher.doFinal(strClearText.getBytes());
            strData = new String(encrypted);

        } catch (Exception e) {
            e.printStackTrace();
        }
        return strData;
    }


    public static String decrypt(String strEncrypted,String strKey) {
        String strData = "";

        try {
            SecretKeySpec skeyspec = new SecretKeySpec(key.getBytes(),"Blowfish");
            System.out.println("Decryption keyspec: " + skeyspec.toString());
            Cipher cipher = Cipher.getInstance("Blowfish");
            cipher.init(Cipher.DECRYPT_MODE, skeyspec);
            byte[] decrypted = cipher.doFinal(strEncrypted.getBytes());
            strData = new String(decrypted);

        } catch (Exception e) {
            e.printStackTrace();
        }
        return strData;
    }
}

Должен ли я использовать другой тип / метод шифрования или я что-то не так делаю? Заранее спасибо!

Обновленный код:

package core;

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

public class Crypto {

    private static String key = "key12345";

    public static byte[] encrypt(String strClearText, String strKey) {
        byte[] encrypted = null;

        try {
            SecretKeySpec skeyspec = new SecretKeySpec(key.getBytes(), "Blowfish");
            System.out.println("Ëncryption keyspec: " + skeyspec.toString());
            Cipher cipher = Cipher.getInstance("Blowfish");
            cipher.init(Cipher.ENCRYPT_MODE, skeyspec);
            encrypted = cipher.doFinal(strClearText.getBytes());
//          strData = new String(encrypted);

        } catch (Exception e) {
            e.printStackTrace();
        }
        return encrypted;
    }


    public static String decrypt(byte[] strEncrypted, String strKey) {
        String strData = "";

        try {
            SecretKeySpec skeyspec = new SecretKeySpec(key.getBytes(),"Blowfish");
            System.out.println("Decryption keyspec: " + skeyspec.toString());
            Cipher cipher = Cipher.getInstance("Blowfish");
            cipher.init(Cipher.DECRYPT_MODE, skeyspec);
            byte[] decrypted = cipher.doFinal(strEncrypted);
            strData = new String(decrypted);

        } catch (Exception e) {
            e.printStackTrace();
        }
        return strData;
    }
}

[B@164b077d - это то, что передается как strEncrypted.

Ошибка javax.crypto.IllegalBlockSizeException: Input length must be multiple of 8 when decrypting with padded cipher

...