Hallo zusammen, ein paar generelle Fragen zur asymetrischen Verschlüsselung mit Java:
Ist es korrekt, dass
1) was mit dem privatekey verschlüsselt wurde, nur mir dem publickey entschlüsselt werden kann?
2) was mit dem publickey verschlüsselt wurde, nur mir dem privatekey entschlüsselt werden kann? (wie oben, nur andersherum)
Ich habe mich bis zu folgendem Beispiel vorgearbeitet:
import java.security.KeyPairGenerator;
import java.security.KeyPair;
import java.security.PublicKey;
import java.security.PrivateKey;
import javax.crypto.Cipher;
public class ASymCipher {
private static byte[] encrypt(byte[] inpBytes, PublicKey key,
String xform) throws Exception {
Cipher cipher = Cipher.getInstance(xform);
cipher.init(Cipher.ENCRYPT_MODE, key);
return cipher.doFinal(inpBytes);
}
private static byte[] decrypt(byte[] inpBytes, PrivateKey key,
String xform) throws Exception{
Cipher cipher = Cipher.getInstance(xform);
cipher.init(Cipher.DECRYPT_MODE, key);
return cipher.doFinal(inpBytes);
}
public static void main(String[] unused) throws Exception {
String xform = "RSA";
// schlüsselpaar basteln
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(1024); // das ist die keysize.
KeyPair kp = kpg.generateKeyPair();
PublicKey pubk = kp.getPublic();
PrivateKey prvk = kp.getPrivate();
String s = "Turning and turning in the widening gyre, the falcon cannot hear the falconer";
byte[] dataBytes =s.getBytes();
byte[] encBytes = encrypt(dataBytes, pubk, xform);
byte[] decBytes = decrypt(encBytes, prvk, xform);
// verschlüsselten String ausgeben
System.out.println(decBytes);
boolean expected = java.util.Arrays.equals(dataBytes, decBytes);
System.out.println("Test " + (expected ? "SUCCEEDED!" : "FAILED!"));
}
}
Ausgabe:
[B@1b10d42
Test SUCCEEDED!
Kann das sein?
Der zu verschlüsselnde String ist um ein Vielfaches länger als die verschlüsselte Version... (gehen da nicht Informationen verloren?)
Wenn die Verschlüsselte Version so kurz ist, würde es sich ja beinahe lohnen, einfach alle Strings der Länge 10 durchzuprobieren....
Ausserdem: wenn ich einen längeren String als 117 bytes verschlüsseln möchte, bekomme ich folgendes:
Exception in thread "main" javax.crypto.IllegalBlockSizeException: Data must not be longer than 117 bytes
at com.sun.crypto.provider.RSACipher.a(DashoA13*..)
at com.sun.crypto.provider.RSACipher.engineDoFinal(DashoA13*..)
at javax.crypto.Cipher.doFinal(DashoA13*..)
at ASymCipher.encrypt(ASymCipher.java:14)
at ASymCipher.main(ASymCipher.java:46)
Wie kann ich längere Strings verschlüsseln?
Dank im Voraus