ich will einen String mit einem passwort verschlüsseln und später mit
diesem passwort wieder entschlüsseln. man sollte meinen, so was gibt's
schon in hülle und fülle. aber bisher hab ich nix einfaches gefunden
... :-(
public byte[] encrypt(String text, char[] password);
public String decrypt(byte[] encryptedText, char[] password);
sowas würde mir ja schon reichen.
danke + gruß
matze
> hi,
>
> ich will einen String mit einem passwort verschlüsseln und später mit
> diesem passwort wieder entschlüsseln. man sollte meinen, so was gibt's
> schon in hülle und fülle. aber bisher hab ich nix einfaches gefunden
> ... :-(
>
> public byte[] encrypt(String text, char[] password);
> public String decrypt(byte[] encryptedText, char[] password);
>
Ich habe mir da zwei Funktionen selbst gebaut:
public static byte[] DES(byte[] key, byte[] value, boolean encrypt)
{
try
{
Cipher cipher = Cipher.getInstance("DES");
SecretKeyFactory skf = SecretKeyFactory.getInstance("DES");
SecretKey secretKey = skf.generateSecret(new DESKeySpec(key));
if (encrypt) cipher.init(Cipher.ENCRYPT_MODE, secretKey);
else cipher.init(Cipher.DECRYPT_MODE, secretKey);
return cipher.doFinal(value);
}
catch (Exception e)
{
System.err.println(e);
}
return null;
}
public static String DES(String key, String value, boolean encrypt)
{
try
{
return new String(DES(key.getBytes(UTF_8),value.getBytes(UTF_8),encrypt),UTF_8);
}
catch(UnsupportedEncodingException ex)
{
return null;
}
}
Sascha Broich
--
Wer den Teufel an die Wand malt, spart Tapete.
> ich will einen String mit einem passwort verschlüsseln und später mit
> diesem passwort wieder entschlüsseln. man sollte meinen, so was gibt's
> schon in hülle und fülle.
Stichworte sind Java Crypto Architecture bzw. API und PBE (password
based encryption). Hilfe einer java.crypto.spec.PBEKeySpec kannst du
einen geheimen Schlüssel definieren, den du dann einem
java.crypto.Cipher mit dem Algorithmus deiner Wahl, z.B.
"PBEWithSHA1AndDESede", initialisierst, auf das du dann den Cipher
benutzt, um deinen Text zu ver- bzw. zu entschlüsseln.
Hier ->
http://java.sun.com/j2se/1.5.0/docs/guide/security/jce/JCERefGuide.html
findest du Beispiele.
Stefan
danke für den beispielcode.
ich bekomm da aber noch eine exception:
java.security.NoSuchAlgorithmException: Cannot find any provider
supporting DES
da brauch ich wohl noch einen provider, gibt's da auch freie anbieter ?
welchen benutzt du ?
gruß
matze
DES ist standardmäßig in Suns Java enthalten. Was für eine
Java-Version hast du. Unter
http://java.sun.com/j2se/1.5.0/docs/guide/security/jce/JCERefGuide.html#AppA
kannst du nachschauen, welche Algorithmen standardmäßig vorhanden
sind.
Stefan
Stefan
über commandline geht's ...
bleibt nur noch die frage, wie krieg ich's hin, dass eclipse dieses
verhalten ablegt.
die checkbox 'Use system libraries' gibt's im 3.2 nicht mehr ...
mist !
Ich nutze den Code auch mit Eclipse 3.2. Das allein kanns nicht sein.
Sascha Broich
--
Heute verlierst du.
Morgen gewinnen die Anderen.
oder liegt es vielleicht an der jre-version - aber dann dürfte es
über commandline auch nicht gehen ..oder ?
gruß
matze
ps: nette sprüche übrigens :-)
Möglicherweise musst du noch die jce.jar aus dem /lib Verzeichnis der
JRE extra einbinden.
Gruß,
-Wanja-
--
"Gewisse Schriftsteller sagen von ihren Werken immer: 'Mein Buch, mein
Kommentar, meine Geschichte'. [..] Es wäre besser, wenn sie sagten:
'unser Buch, unser Kommentar, unsere Geschichte'; wenn man bedenkt, dass
das Gute darin mehr von anderen ist als von ihnen." [Blaise Pascal]
heißt also, dass das jce.jar eingebunden ist, nicht aber
sunjce_provider.jar
aber miteinbinden bringt irgendwie auch nichts, weder von noch nach dem
jre.
Vielleicht hilft dir das hier weiter, ist zwar Blowfish, statt DES, aber
das Beispiel funktioniert bei mir:
public class PMTextCrypter {
private static final String ALGORITHM = "Blowfish";
SecretKey skey;
public PMTextCrypter(){
try{
System.out.println("Generating Key");
final KeyGenerator kgen = KeyGenerator.getInstance(ALGORITHM);
skey = kgen.generateKey();
System.out.println("Key generated");
}
catch(Exception e){
e.printStackTrace();
}
}
public String encrypt(final String uncrypted, final String password){
try{
final byte[] raw = skey.getEncoded();
final SecretKeySpec skeySpec = new SecretKeySpec(raw, ALGORITHM);
final Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
final byte[] encrypted = cipher.doFinal(uncrypted.getBytes());
return new String(encrypted);
}
catch(Exception e){
e.printStackTrace();
return null;
}
}
public String decrypt(final String encrypted, final String password){
try{
final byte[] raw = skey.getEncoded();
final SecretKeySpec skeySpec = new SecretKeySpec(raw, ALGORITHM);
final Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, skeySpec);
final byte[] decrypted = cipher.doFinal(encrypted.getBytes());
return new String(decrypted);
}
catch(Exception e){
e.printStackTrace();
return null;
}
}
public static void main(final String[] args){
final PMTextCrypter crypter = new PMTextCrypter();
final String pwd = "jackass1";
final String original = "Hello World";
System.out.println(original);
final String encrypted = crypter.encrypt(original, pwd);
System.out.println(encrypted);
final String decrypted = crypter.decrypt(encrypted, pwd);
System.out.println(decrypted);
}
}
(ja, ich weiß: String statt byte[] ist böse)
danke für dein beispiel, leider bleibt das problem bei mir:
java.security.NoSuchAlgorithmException: Blowfish KeyGenerator not
available
at javax.crypto.KeyGenerator.<init>(DashoA12275)
at javax.crypto.KeyGenerator.getInstance(DashoA12275)
...
irgendwas muss wohl an meinem eclipse nicht passen ..
danke trotzdem :-)
gruß
matze
> ich binde die jre (1.5.0_01) explizit in den launch ein.
> vielleicht ist es das ?
Du kannst doch bei Eclipse diverse JREs definieren und dann das
entsprechende JRE für Run auswählen. Dann sollten auch die diversen
System-Jars mit dabei sein.
> ps: nette sprüche übrigens :-)
Siehe unten ;-)
Sascha Broich
--
Ich bin niedlich, ich darf das. (Sam & Max)
vielleicht ein bug im eclipse 3.2 ? ach nee, du nutzt das ja auch ...
> sind sie nur leider nicht.
> auch wenn ich sie explizit dazu nehme haben sie keine wirkung ...
Örks, das klingt ja sehr merkwürdig.
Schaun mer mal, was die Konfiguration bei mir sagt:
(Ich habe nur ein JDK und ein JRE definiert, beides die 1.5.0_06)
Run->Run...->Configuration gewählt->JRE->Project JRE
Window->Preferences->"jre"->JDK gewählt->Edit->JRE System libraries:
(Jeweils der Pfad "D:\programme\java\jdk1.5.0\jre\lib\" vornedran)
rt.jar
jsse.jar
jce.jar
charsets.jar
ext\sunjce_provider.jar
(jmf,java3d,...)
Schau doch mal bei dir nach, ob das alles da ist.
Ansonsten würde ich auf defektes/schlecht übernommenes Projekt tippen.
Das hatte ich mal, als ich eine neue Eclipse-Version einfach drüberkopiert
hatte.
danke für eure hilfe !
jetzt kann ich mich endlich mit dem jce auseinandersetzen :-)