Hallo!
Ich versuche derzeit ein Programm zu schreiben welches Daten verschlüsselt in einer DB speichert. In diesem Fall muss ich dann die verschlüsselten Daten auch wieder entschlüsseln können.
Ich habe mir dabei folgendes Konzept überlegt:
Die Anwendung hat einen öffentlichen Schlüssel der als Datei gespeichert wird. Der private Schlüssel wird zusammen mit den verschlüsselten Daten in zwei verschiedenen Tabellen in der Datenbank gespeichert. Nach einigen Recherchen habe ich dann folgenden Code erstellt (der auch fast vollständig funktioniert):
Mein Problem ist nun, dass ich zwar ohne Probleme einen String verschlüsseln kann, aber bei der Entschlüsselung hackt es, hier bekomme ich keine Ergebnis zurück.
Daher meine Fragen:
- Funktioniert das überhaupt, dass ich den verschlüsselten Text als String zurückgebe bzw. kann ein String überhaupt genutzt werden um verschlüsselte Daten zu "speichern". Ich habe den Eindruck, dass bei der Konvertierung von ByteArray in String bzw. von String zu ByteArray etwas verloren geht und daher die Entschlüsselungsmethode nicht funktioniert. Wenn das so ist, als was speichere ich einen ByteArrayOutputStream in einer Tabelle?
Danke für eure Hilfe!
Florian
Ich versuche derzeit ein Programm zu schreiben welches Daten verschlüsselt in einer DB speichert. In diesem Fall muss ich dann die verschlüsselten Daten auch wieder entschlüsseln können.
Ich habe mir dabei folgendes Konzept überlegt:
Die Anwendung hat einen öffentlichen Schlüssel der als Datei gespeichert wird. Der private Schlüssel wird zusammen mit den verschlüsselten Daten in zwei verschiedenen Tabellen in der Datenbank gespeichert. Nach einigen Recherchen habe ich dann folgenden Code erstellt (der auch fast vollständig funktioniert):
Java:
public class Crypter {
private KeyPair keyPair;
private String cryptMode = "RSA";
private Cipher cipher;
public Crypter() {
try {
KeyPair loadedKeyPair = this.LoadKeyPair(cryptMode);
System.out.println("Loaded Key Pair");
this.dumpKeyPair(loadedKeyPair);
// Store the the key pair in the variable
this.keyPair = loadedKeyPair;
this.cipher = Cipher.getInstance(cryptMode);
}
catch(java.io.FileNotFoundException e) {
try {
KeyPairGenerator keyGen = KeyPairGenerator.getInstance(cryptMode);
keyGen.initialize(1024);
KeyPair generatedKeyPair = keyGen.genKeyPair();
System.out.println("Generated Key Pair");
this.dumpKeyPair(generatedKeyPair);
this.SaveKeyPair(generatedKeyPair);
// Store the the key pair in the variable
this.keyPair = generatedKeyPair;
}
catch (Exception innerE) {
innerE.printStackTrace();
return;
}
}
catch (Exception e) {
e.printStackTrace();
return;
}
}
public String crypt(String data) {
try {
cipher.init(Cipher.ENCRYPT_MODE, keyPair.getPublic());
ByteArrayOutputStream baosEncryptedData = new ByteArrayOutputStream();
CipherOutputStream cos = new CipherOutputStream(baosEncryptedData,
cipher);
cos.write(data.getBytes("UTF-8"));
cos.flush();
cos.close();
System.out.println("Array: "+baosEncryptedData);
String result = new String(baosEncryptedData.toByteArray(),"UTF-8");
System.out.println("Encrypted data: "+result );
return result;
} catch(InvalidKeyException e){
e.printStackTrace();
return null;
} catch(UnsupportedEncodingException e){
e.printStackTrace();
return null;
} catch(IOException e){
e.printStackTrace();
return null;
}
}
public String decrypt(String cryptedData){
try {
System.out.println("String: "+cryptedData);
cipher.init(Cipher.DECRYPT_MODE, keyPair.getPrivate());
CipherInputStream cis = new CipherInputStream(new ByteArrayInputStream(cryptedData.getBytes("UTF-8")), cipher);
ByteArrayOutputStream baosDecryptedData = new ByteArrayOutputStream();
byte[] buffer = new byte[8192];
int len = 0;
while((len = cis.read(buffer))> 0){
baosDecryptedData.write(buffer,0,len);
}
baosDecryptedData.flush();
cis.close();
System.out.println("Array: "+baosDecryptedData);
String result = new String(baosDecryptedData.toByteArray(),"UTF-8");
System.out.println("Decrypted data: "+result );
return result;
} catch(InvalidKeyException e){
e.printStackTrace();
return null;
} catch(UnsupportedEncodingException e){
e.printStackTrace();
return null;
} catch(IOException e){
e.printStackTrace();
return null;
}
}
private void dumpKeyPair(KeyPair keyPair) {
PublicKey pub = keyPair.getPublic();
System.out.println("Public Key: " + getHexString(pub.getEncoded()));
PrivateKey priv = keyPair.getPrivate();
System.out.println("Private Key: " + getHexString(priv.getEncoded()));
}
private String getHexString(byte[] b) {
String result = "";
for (int i = 0; i < b.length; i++) {
result += Integer.toString((b[i] & 0xff) + 0x100, 16).substring(1);
}
return result;
}
private void SaveKeyPair(KeyPair keyPair) throws IOException {
PrivateKey privateKey = keyPair.getPrivate();
PublicKey publicKey = keyPair.getPublic();
// Store Public Key.
X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(
publicKey.getEncoded());
FileOutputStream fos = new FileOutputStream("public.key");
fos.write(x509EncodedKeySpec.getEncoded());
fos.close();
// Store Private Key.
PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(
privateKey.getEncoded());
fos = new FileOutputStream("private.key");
fos.write(pkcs8EncodedKeySpec.getEncoded());
fos.close();
}
private KeyPair LoadKeyPair(String algorithm)
throws IOException, NoSuchAlgorithmException,
InvalidKeySpecException {
// Read Public Key.
File filePublicKey = new File("public.key");
FileInputStream fis = new FileInputStream("public.key");
byte[] encodedPublicKey = new byte[(int) filePublicKey.length()];
fis.read(encodedPublicKey);
fis.close();
// Read Private Key.
File filePrivateKey = new File("private.key");
fis = new FileInputStream("private.key");
byte[] encodedPrivateKey = new byte[(int) filePrivateKey.length()];
fis.read(encodedPrivateKey);
fis.close();
// Generate KeyPair.
KeyFactory keyFactory = KeyFactory.getInstance(algorithm);
X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(
encodedPublicKey);
PublicKey publicKey = keyFactory.generatePublic(publicKeySpec);
PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(
encodedPrivateKey);
PrivateKey privateKey = keyFactory.generatePrivate(privateKeySpec);
return new KeyPair(publicKey, privateKey);
}
}
Mein Problem ist nun, dass ich zwar ohne Probleme einen String verschlüsseln kann, aber bei der Entschlüsselung hackt es, hier bekomme ich keine Ergebnis zurück.
Daher meine Fragen:
- Funktioniert das überhaupt, dass ich den verschlüsselten Text als String zurückgebe bzw. kann ein String überhaupt genutzt werden um verschlüsselte Daten zu "speichern". Ich habe den Eindruck, dass bei der Konvertierung von ByteArray in String bzw. von String zu ByteArray etwas verloren geht und daher die Entschlüsselungsmethode nicht funktioniert. Wenn das so ist, als was speichere ich einen ByteArrayOutputStream in einer Tabelle?
Danke für eure Hilfe!
Florian