Я думаю, что какой-то вариант этого вопроса задавался миллион раз, но я не могу найти ответ, который, кажется, решает мою проблему.
Я унаследовал кусок кода. Он хорошо работает со строкой XXXX100, но не с XXXX1000. Он зашифровывает (генерирует строку без ошибок), хорошо работает с обоими, но не может расшифровать более длинную строку. Выдает:
javax.crypto.IllegalBlockSizeException: длина ввода должна быть кратна 8 при дешифровании с использованием зашифрованного шифра
Нужно ли делать что-то еще для дешифруемого входного текста, установить параметр где-нибудь ... или что-то еще?
package projectlocal.encryptionutilities;
import java.io.UnsupportedEncodingException;
import java.security.GeneralSecurityException;
import java.util.Base64;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.PBEParameterSpec;
public class SimpleCrypt {
/** encryption master password */
private static final char[] AUTHENTIC = "8zrahH9HiDeJM60W0gmZ".toCharArray();
/** encryption algorithm */
//private static final String ALGORITHM = "PBEWithMD5AndDES";
private static final String ALGORITHM = "PBEWithMD5AndDES";
/** charset */
private static final String UTF8_CHARSET = "UTF-8";
/** encryption seed */
private static final byte[] SALT = {
(byte) 0xde, (byte) 0x33, (byte) 0x10, (byte) 0x12,
(byte) 0xde, (byte) 0x33, (byte) 0x10, (byte) 0x12,
};
/** create private constructor to prevent instantiation */
private SimpleCrypt() {/* ignore */}
public static String encrypt(final String property) throws GeneralSecurityException, UnsupportedEncodingException {
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM);
SecretKey key = keyFactory.generateSecret(new PBEKeySpec(AUTHENTIC));
Cipher pbeCipher = Cipher.getInstance(ALGORITHM);
pbeCipher.init(Cipher.ENCRYPT_MODE, key, new PBEParameterSpec(SALT, 20));
return Base64.getMimeEncoder().encodeToString(pbeCipher.doFinal(property.getBytes()));
}
public static String decrypt(final String property) throws UnsupportedEncodingException, GeneralSecurityException {
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM);
SecretKey key = keyFactory.generateSecret(new PBEKeySpec(AUTHENTIC));
Cipher pbeCipher = Cipher.getInstance(ALGORITHM);
pbeCipher.init(Cipher.DECRYPT_MODE, key, new PBEParameterSpec(SALT, 20));
return new String(pbeCipher.doFinal(Base64.getMimeDecoder().decode(property)), UTF8_CHARSET);
}
}