Verschlüsselung mit Pwd. - User soll Algorithmus wählen

Status
Nicht offen für weitere Antworten.

Illuvatar

Top Contributor
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:
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?
 
hängt halt vom Provider ab für welche Kombinationen von Digest
und Cipher er ein PBE anbietet (ich glaub im jdk ist die Auswahl eher mau)

bouncy castle:

PBEWithMD5And128BitAESCBCOpenSSL
PBEWithMD5And192BitAESCBCOpenSSL
PBEWithMD5And256BitAESCBCOpenSSL
PBEWithMD5AndDES
PBEWithMD5AndRC2
PBEWithRIPEMD160
PBEWithSHA
PBEWithSHA1AndDES
PBEWithSHA1AndRC2
PBEWithSHA256And128BitAESBC
PBEWithSHA256And192BitAESBC
PBEWithSHA256And256BitAESBC
PBEWithSHAAnd128BitAESBC
PBEWithSHAAnd128BitRC2
PBEWithSHAAnd128BitRC4
PBEWithSHAAnd192BitAESBC
PBEWithSHAAnd256BitAESBC
PBEWithSHAAnd40BitRC2
PBEWithSHAAnd40BitRC4
PBEWithSHAAndDES2Key
PBEWithSHAAndDES3Key
PBEWithSHAAndIDEA
PBEWithSHAAndTwofish
PBEWithTiger
 
D.h. ich kann nicht zu jedem Algorithmus oder Cipher (oder wie das alles heißt 😉 ) zur Runtime ein passendes KeySpec erstellen, sondern muss mich auf sagen wir PBEWithMD5AndDES festlegen, und kann dann eine PBEKeySpec verwenden?
 
Also, ich hake den Thread jetzt mal ab, und verwende einen festgelegten Algorithmus. Falls jemand noch etwas weiß, darf er das aber gerne auch noch schreiben.
 
Illuvatar hat gesagt.:
D.h. ich kann nicht zu jedem Algorithmus oder Cipher (oder wie das alles heißt 😉 ) zur Runtime ein passendes KeySpec erstellen, sondern muss mich auf sagen wir PBEWithMD5AndDES festlegen, und kann dann eine PBEKeySpec verwenden?

Nein, es ist aber praktischer wenn du es so machst

(PBE ist nur für ganz wenige Kombinationen wirklich in irgendeinem Dokument "spezifiziert", und das Vorgehen ist doch relativ einfach - man könnte auch von Hand irgendeinen Digest und irgendeinen Cipher kombinieren)
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben