Так что я использую простое шифрование / дешифрование 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