API безопасности Java и шифрования — Неверный пароль для восстановления секрета.Учитывая, что конечный блок неправильно заполнен

#java #security #encryption

Вопрос:

Я создаю файл хранилища ключей с помощью Java API, т. е. эквивалентной команде java

 keytool -genseckey -alias some.alias -keyalg AES -keysize 128 -keypass lt;an encrypted byte stringgt; -storetype JCEKS -keystore lt;filenamegt; –storepass lt;some_pwdgt;  

код : …

 key=get128MD5(strToHash);  System.out.println(String.format("Hashing value : '%s' ", Hex.toHexString(key)));    try {   KeyStore.ProtectionParameter protParam =  new KeyStore.PasswordProtection("XXXXX".toCharArray ());   javax.crypto.SecretKey mySecretKey=new SecretKeySpec(key,"AES");   KeyStore.SecretKeyEntry skEntry =  new KeyStore.SecretKeyEntry(mySecretKey);  ks.setEntry(alias, skEntry, protParam);    try (FileOutputStream fos = new FileOutputStream("filename")) {  ks.store(fos, "XXXXX".toCharArray ());  fos.close();   }  catch (FileNotFoundException e1) {  e1.printStackTrace();  }  } catch (KeyStoreException e1) { ...  above error happens when trying to load from keystore file :  public static Key getKey(String keyalias,byte[] keypassbyte) throws KeyStoreException {  Key key = null;  try{   if(ks!=null){  log.info("Getting key from Keystore.");  key =ks.getKey(keyalias, Hex.toHexString(keypassbyte).toCharArray());   }    if(key==null){  throw new KeyStoreException("Failed to get secret key entry.");  }  }catch (NoSuchAlgorithmException nsae) {  throw new KeyStoreException("Algorithm for recovering the secret key cannot be found."   nsae.getMessage());  ` }catch (UnrecoverableEntryException uee) {  throw new KeyStoreException("Invalid entry password to recover secret."   uee.getMessage());  }catch (KeyStoreException kse) {  throw new KeyStoreException("Failed to get secret key entry."   kse.getMessage());  }catch(NullPointerException ex){  throw new NullPointerException("NullPointerException "   ex.getMessage());  } catch (RuntimeException e) {  throw new RuntimeException("Failed to get secret key."  e.getMessage());  }  return key;  

Есть идеи, где что-то идет не так ? Я пробовал разные варианты метода «ks.setKey» и включал параметр длины, который не помог. Я использую WIN10 и Eclipse/Java 1.8

Спасибо

Ответ №1:

 key =ks.getKey(keyalias,  Hex.toHexString(keypassbyte).toCharArray())  

Пытаетесь использовать шестнадцатеричную форму пароля? Почему? Просто используйте то же самое, что и при создании ключа