получение ошибки javax.crypto.IllegalBlockSizeException: длина ввода должна быть кратна 8 при дешифровании с добавленным шифром - PullRequest
0 голосов
/ 11 апреля 2019

все.Я в основном пытаюсь зашифровать и расшифровать пароль типа String.Я получаю сообщение об ошибке javax.crypto.IllegalBlockSizeException: длина ввода должна быть кратна 8 при расшифровке с использованием шифра с добавлением.

Я пытаюсь сделать другие алгоритмы с указанным заполнением, например, AES / CBC /NoPadding.но получая другую ошибку, которая является java.security.InvalidKeyException: неверная длина ключа AES: 5 байт.

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


public class Encrpyt {




public static void main(String[] args) throws Exception
{
    // TODO code application logic here

    String userName="jimmy";
    String password="chen";       
    String encryptedPassword=encrypt(password,userName);
    System.out.println("this is encrypted password:"+encryptedPassword+"");



    String decrptedPassword=decrypt(encryptedPassword,userName);
    System.out.println("this is decrpted password is :"+decrptedPassword);
}



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

try {
    SecretKeySpec skeyspec=new SecretKeySpec(strKey.getBytes(),"Blowfish");
    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();
    throw new Exception(e);
}
return strData;
    }

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

try {

    SecretKeySpec skeyspec=new SecretKeySpec(strKey.getBytes(),"Blowfish");
    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();
    throw new Exception(e);
}
return strData;
  }


  }

1 Ответ

0 голосов
/ 11 апреля 2019

вам нужно заполнить текстовые байты, как показано ниже: (Пожалуйста, смотрите комментарий для встроенного отступа.)



    public static final String BLOWFISH_CIPHER = "Blowfish/ECB/NOPADDING";
    public static final String BLOWFISH_SECRET_KEY_SPEC = "Blowfish";

    public static String toHexString(byte[] array) {
        return DatatypeConverter.printHexBinary(array);
    }

    public static byte[] toByteArray(String s) {
        return DatatypeConverter.parseHexBinary(s);
    }

    public static byte[] pad(byte[] bytes) {
        int remainder = bytes.length % 8;
        if(remainder == 0){
            return bytes;
        }
        int padding = 8 - remainder;
        int newLength = padding+bytes.length;
        byte[] newBytes = new byte[newLength];
        Arrays.fill(newBytes,(byte)0);
        System.arraycopy(bytes,0,newBytes,padding,bytes.length);
        return newBytes;
    }

    public static String encryptBF(String string, String key) throws GeneralSecurityException {

        Cipher cipher = Cipher.getInstance(BLOWFISH_CIPHER);
        SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), BLOWFISH_SECRET_KEY_SPEC);
        cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);

        return toHexString(cipher.doFinal(pad(string.getBytes())));
    }

    public static String decryptBF(String string, String key) throws GeneralSecurityException {

        Cipher cipher = Cipher.getInstance(BLOWFISH_CIPHER);
        SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), BLOWFISH_SECRET_KEY_SPEC);
        cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);

        return new String(cipher.doFinal(toByteArray(string)));
    }
...