Ich möchte dem User in diesem Programm die Möglichkeit geben, die Ausgabedatei zu verschlüsseln und mit enem Passwort zu versehen, außerdem wollte ich ihm die Möglichkeit geben, den Algorithmus selbst zu wählen.
Ich kenne mich mit java.security nicht sonderlich aus, allerdings hatte ich gehofft, das mit Hilfe dieser Beispiele hinzubekommen: http://javaalmanac.com/egs/javax.crypto/pkg.html
Dadurch bin ich zu folgendem Code gekommen:
Wenn ich das recht verstanden habe, müsste ich da jetzt den SecretKey aus dem KeySpec machen. Da kann ich ja auch den Algorithmus angeben, den der User gewählt hat, nur passt der (PBE)KeySpec da ja nicht immer dazu... Ist das überhaupt möglich, das dynamisch zu machen, jede beliebige Verschlüsselung - und mit Passwort? Oder muss ich mich da zur Compilezeit festlegen?
Ich kenne mich mit java.security nicht sonderlich aus, allerdings hatte ich gehofft, das mit Hilfe dieser Beispiele hinzubekommen: http://javaalmanac.com/egs/javax.crypto/pkg.html
Dadurch bin ich zu folgendem Code gekommen:
Code:
class SecuritySettings extends JPanel
{
JCheckBox encrypt;
JComboBox jcb;
JPasswordField pass;
public SecuritySettings()
{
//Gui anordnen, das ist hier nicht so wichtig...
}
// This method returns the available implementations for a service type
// ComboBox wird mit getCryptoImpls ("Cipher") befüllt
public static String[] getCryptoImpls(String serviceType) {
Set<String> result = new HashSet<String>();
// All all providers
Provider[] providers = Security.getProviders();
for (int i=0; i<providers.length; i++) {
// Get services provided by each provider
Set<Object> keys = providers[i].keySet();
for (Iterator<Object> it=keys.iterator(); it.hasNext(); ) {
String key = it.next().toString();
key = key.split(" ")[0];
if (key.startsWith(serviceType+".")) {
result.add(key.substring(serviceType.length()+1));
} else if (key.startsWith("Alg.Alias."+serviceType+".")) {
// This is an alias
result.add(key.substring(serviceType.length()+11));
}
}
}
return result.toArray(new String[result.size()]);
}
public boolean getEncrypt()
{
return encrypt.isSelected();
}
public String getAlgorithm()
{
return jcb.getSelectedItem().toString();
}
public char[] getPassPhrase()
{
return pass.getPassword();
}
}
...
//andere Klasse, es soll gespecihert werden
FileOutputStream fos = new FileOutputStream (saveIn);
JarOutputStream jos = new JarOutputStream(fos);
OutputStream os = jos;
if (ss.getEncrypt()){
try{
KeySpec keySpec = new PBEKeySpec(ss.getPassPhrase(), salt, iterationCount);
SecretKey sk = //???
}catch (Exception ex){
ex.printStackTrace();
JOptionPane.showMessageDialog(XJarCreator.this, "Encryption failed.
Output file won't be encrypted.", ex.toString(), JOptionPane.ERROR_MESSAGE);
os = jos;
}
}
Wenn ich das recht verstanden habe, müsste ich da jetzt den SecretKey aus dem KeySpec machen. Da kann ich ja auch den Algorithmus angeben, den der User gewählt hat, nur passt der (PBE)KeySpec da ja nicht immer dazu... Ist das überhaupt möglich, das dynamisch zu machen, jede beliebige Verschlüsselung - und mit Passwort? Oder muss ich mich da zur Compilezeit festlegen?