AES-Verschlüsselung mit openssl command line tool und entschlüsseln in Java
Habe ich ein bash-Skript, dass verwendet das tool openssl zu verschlüsseln.
#!/bin/bash
key128="1234567890123456"
iv="1234567890123456"
openssl enc -aes-128-cbc -in test -out test.enc -K $key128 -iv $iv
- Und Java-code, der versucht die Datei zu entschlüsseln, hergestellt durch das Skript.
public class crypto {
public static void main( String[] args )
{
try {
File f = new File("test.enc");
Cipher c;
Key k;
String secretString = "01020304050607080900010203040506";
String ivString = "01020304050607080900010203040506";
byte[] secret = hexStringToByteArray(secretString);
byte[] iv = hexStringToByteArray(ivString);
c = Cipher.getInstance("AES/CBC/PKCS5Padding");
k = new SecretKeySpec(secret, "AES");
c.init(Cipher.DECRYPT_MODE, k, new IvParameterSpec(iv));
CipherInputStream cis = new CipherInputStream(new FileInputStream(f), c);
BufferedReader br = new BufferedReader(new InputStreamReader(cis));
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
br.close();
} catch (IOException e) {
System.out.println(e.getMessage());
} catch (NoSuchAlgorithmException e) {
System.out.println(e.getMessage());
} catch (NoSuchPaddingException e) {
System.out.println(e.getMessage());
} catch (InvalidKeyException e) {
System.out.println(e.getMessage());
} catch (InvalidAlgorithmParameterException e) {
System.out.println(e.getMessage());
}
}
public static byte[] hexStringToByteArray(String s) {
int len = s.length();
byte[] data = new byte[len / 2];
for (int i = 0; i < len; i += 2) {
data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
+ Character.digit(s.charAt(i+1), 16));
}
return data;
}
}
33,1 71%
Wenn ich den Java-code, es muss nicht alles drucken. Gibt es eine Diskrepanz zwischen dem Skript und Java-code?
Eine sekundäre Frage ist, ob ich das umschreiben kann, diese zu verwenden-Passwort anstelle des-Schlüssel/iv. Um dies zu tun, gibt es eine Möglichkeit zu wissen, die iv, die openssl verwendet, die für ein Kennwort?
- Für einen start,
1234567890123456
ist nicht das gleiche wie0x01020304050607080900010203040506
. Dasselbe gilt für die IV. - openssl behandelt jedes Zeichen als hex-Wert, in der Erwägung, dass der Java-code ist auf der Suche auf ein paar Zeichen.
- Ja, und 0x12 ist nicht das gleiche wie 0x0102.
- Sie sind richtig, danke. Ich bin überrascht, dass openssl nicht beschweren, ich war mit nur 64 bits für den Schlüssel und iv.
- Es wäre interessant zu sehen, wenn Sie waren so glücklich, dass Sie haben eine gültige PKCS#5-padding nach dem verschlüsseln mit, dass der falsche Schlüssel/iv. Bekommt man keine Ausgabe, wenn Sie ändern Sie die nur-text (wie einer Polsterung bezogen Ausnahme eingewickelt in eine IOException ausgelöst?) Verwenden Sie etwas, das stellt die Integrität/Authentizität, um loszuwerden, diese Art von Problemen!
- Antwort ist hier: stackoverflow.com/a/55884564/2873507
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als @Polynom oben erwähnt, die Schlüssel und die iv 's don' T match zwischen dem bash-script und Java-code. Die änderung der bash-Skript, die der folgenden das problem löst.
Wenn openssl ausgeführt wird, in der folgenden Weise zu verwenden, wird Sie ein Kennwort ein und drucken Sie die-Taste und iv verwendet. Dass Schlüssel und iv ersetzt werden kann in dem Java-Programm vor.