Ich habe fast alle Themen hier zu diesem Thema gesucht, aber ich kann immer noch nicht herausfinden, was los ist. Ich habe 3 EditText
auf meiner Android-App erstellt: EditText
, wo Sie den Schlüssel/das Passwort zum Verschlüsseln und Entschlüsseln einfügen; EditText2
wo es den verschlüsselten Text angezeigt wird; EditText3
wo der entschlüsselte Text angezeigt wird.Blowfish auf Android-Studio für die Verschlüsselung/Entschlüsselung
Da es sich noch um einen frühen Test handelt, habe ich die Nachricht oder die Zeichenfolge in der App als Variable an Crypt übergeben.
Das Problem ist, dass die Verschlüsselung so etwas wie einen Blowfish-Algorithmus gibt, also kein Problem (es endet mit 2 == also ich denke, es funktioniert richtig). Ich habe auch versucht, die Schnur vor der Entschlüsselung zu entschlüsseln oder die rohe byte[]
von der Verschlüsselung ohne irgendein gutes Ergebnis zu verwenden. Die Entschlüsselung gibt nicht den ursprünglichen String-Text zurück, sondern gibt etwas größer als der verschlüsselte Text. Ich habe keine Vorliebe für den Modus von Blowfish, also fing ich einfach an wie Blowfish/CFB/NoPadding.
str_key
, str2
und str3
werden für jetzt öffentlich erklärt. str2
setzt den Text für EditText2
Feld und str3
wird den Text für EditText3
Feld festlegen. Ein Beispiel für Ausgabe: Example of output generated from the app
Hier ist der Code:
public void encrypt(){
//encrypt
EditText mEdit = (EditText)findViewById(R.id.editText);
str_key = (String) mEdit.getText().toString();
int iterationCount = 1000;
int keyLength = 256;
int saltLength = keyLength/8;
SecureRandom random = new SecureRandom();
byte[] salt = new byte[saltLength];
random.nextBytes(salt);
KeySpec keySpec = new PBEKeySpec(str_key.toCharArray(), salt,
iterationCount, keyLength);
SecretKeyFactory keyFactory = null;
try {
keyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
byte[] keyBytes = new byte[0];
try {
keyBytes = keyFactory.generateSecret(keySpec).getEncoded();
} catch (InvalidKeySpecException e) {
e.printStackTrace();
}
SecretKey key = new SecretKeySpec(keyBytes, "Blowfish");
Cipher cipher = null;
try {
cipher = Cipher.getInstance("Blowfish/CBC/PKCS5Padding");
} catch (NoSuchAlgorithmException | NoSuchPaddingException e) {
e.printStackTrace();
}
if (cipher == null || key == null) {
//throw new Exception("Invalid key or cypher");
str2="error";
}
else {
byte[] iv = new byte[cipher.getBlockSize()];
random.nextBytes(iv);
IvParameterSpec ivParams = new IvParameterSpec(iv);
try {
cipher.init(Cipher.ENCRYPT_MODE, key,ivParams);
} catch (InvalidKeyException | InvalidAlgorithmParameterException e) {
e.printStackTrace();
}
try {
raw = cipher.doFinal(message.getBytes("UTF-8"));
} catch (IllegalBlockSizeException | BadPaddingException | UnsupportedEncodingException e) {
e.printStackTrace();
}
str2 = Base64.encodeToString(raw,Base64.DEFAULT);
}
}
Hier ist die Entschlüsselungsfunktion:
public void decrypt(){
int iterationCount = 1000;
int keyLength = 256;
int saltLength = keyLength/8;
SecureRandom random = new SecureRandom();
byte[] salt = new byte[saltLength];
random.nextBytes(salt);
KeySpec keySpec = new PBEKeySpec(str_key.toCharArray(), salt, iterationCount, keyLength);
SecretKeyFactory keyFactory = null;
try {
keyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
byte[] keyBytes = new byte[0];
try {
keyBytes = keyFactory.generateSecret(keySpec).getEncoded();
} catch (InvalidKeySpecException e) {
e.printStackTrace();
}
SecretKey key = new SecretKeySpec(keyBytes, "Blowfish");
Cipher cipher2 = null;
try {
cipher2 = Cipher.getInstance("Blowfish/CBC/PKCS5Padding");
} catch (NoSuchAlgorithmException | NoSuchPaddingException e) {
e.printStackTrace();
}
iv = new byte[cipher2.getBlockSize()];
random.nextBytes(iv);
IvParameterSpec ivSpec = new IvParameterSpec(iv);
try {
cipher2.init(Cipher.DECRYPT_MODE, key, ivSpec);
} catch (InvalidKeyException | InvalidAlgorithmParameterException e) {
e.printStackTrace();
}
byte[] decryptedBytes = null;
byte[] app= Base64.decode(str2,Base64.DEFAULT);
try {
decryptedBytes = cipher2.doFinal(app);
} catch (IllegalBlockSizeException | BadPaddingException e) {
e.printStackTrace();
}
str3 = Base64.encodeToString(decryptedBytes,Base64.DEFAULT);
}
Vielen Dank für Ihre Antwort. Ich habe auch versucht, die Base64-Decodierung zu verwenden und auch das ursprüngliche "pre" codierte Byte-Array für die Entschlüsselung ohne Ergebnis zu verwenden. Kannst du ein Beispiel dafür machen, was ich tun soll? Sollte ich nur UTF-8 mit KDF.PBKDF2 ändern? Ich habe auch versucht, die IV zu generieren als: IvParameterSpec ivSpec = new IvParameterSpec (keySpec.getEncoded()); // in der Entschlüsselungsfunktion; aber ich bekomme Laufzeitfehler. Können Sie mir dafür ein Beispiel geben? – Micene
Wie kann ich HMAC verwenden, um zu vermeiden, den cipherText zu ändern? – Micene
Das ist alles, was Sie Google suchen können, Sie werden nichts lernen, wenn ich nur den Code für Sie schreibe! Wenn du es sogar mit dem Entschlüsseln des base64 versucht hast, dann hast du einfach nur etwas falsch gemacht. Versuchen Sie, den Code in Ihrem ursprünglichen Beitrag zu dem, was Sie versucht haben, zu bearbeiten, und ich helfe Ihnen von dort. –