AES Verschlüsselung mit Base64URL Kodierung

  • Antworten:16
Thor93
  • Forum-Beiträge: 487

23.08.2012, 09:14:30 via Website

Moin Leute,

Ich hätte da mal eine Frage zum Thema AES Verschlüsselung und einer Base64 Kodierung.
Wenn ich in meiner App einen Cleartext angebe der 32 Zeichen Lang ist und einen genau so langen Schlüssel.
Wie kann es sein das am Ende dar Wert 48 Zeichen lang ist????

Meine Funktion sieht so aus:
Quelle: http://stackoverflow.com/questions/6788018/android-encryption-decryption-with-aes

1String cleartext = "00112233445566778899aabbccddeeff" ;
2String key = "000102030405060708090a0b0c0d0e0f";
3String returnvalue = "-1";
4
5
6public final String encrypt()
7 {
8
9 byte[] row = key.getBytes();
10 SecretKeySpec skeySpec = new SecretKeySpec(row, "AES");
11
12 try
13 {
14 Cipher cipher = Cipher.getInstance("AES");
15 cipher.init(Cipher.ENCRYPT_MODE,skeySpec);
16 byte[] encrypted = cleartext.getBytes();
17 encrypted = cipher.doFinal(encrypted);
18
19
20
21 }
22 catch(Exception e)
23 {
24 e.printStackTrace();
25 }
26 return returnvalue;
27 }

Gruß Thor93

— geändert am 29.08.2012, 14:33:26

Jedem das Seine, doch Mir das Meine

Antworten
Markus B.
  • Forum-Beiträge: 636

23.08.2012, 10:33:34 via Website

Hi,
ganz einfach Wikipedia hilft dir weiter. Der Platzbedarf berechnet sich für Base64 wie folgt:

(n + 2 - ((n + 2) % 3)) / 3 * 4, mit n Anzahl der Zeichen.

Gruß,
Markus

— geändert am 23.08.2012, 11:03:07

Antworten
Thor93
  • Forum-Beiträge: 487

23.08.2012, 11:19:32 via Website

erstmal danke für die schnellen Antworten

Markus B.
Hi,
ganz einfach Wikipedia hilft dir weiter. Der Platzbedarf berechnet sich für Base64 wie folgt:

(n + 2 - ((n + 2) % 3)) / 3 * 4, mit n Anzahl der Zeichen.

Gruß,
Markus
.
dann würde bei meiner Rechnung 44 rauskommen 8o (ich habe 48 Zeichen)aber da ich es mit einem Windows Taschenrechner gerechnet habe würde ich mich nicht zwingend drauf verlassen.

Gruß Thor93

Jedem das Seine, doch Mir das Meine

Antworten
Thor93
  • Forum-Beiträge: 487

23.08.2012, 12:48:50 via Website

ich teste meine Funktion mit diesem String
1String cleartext = "00112233445566778899aabbccddeeff" ;

Lasse ich das eine f hinten weg geht das seltsammer weise 8o

— geändert am 23.08.2012, 12:49:25

Jedem das Seine, doch Mir das Meine

Antworten
Thor93
  • Forum-Beiträge: 487

28.08.2012, 10:11:17 via Website

Hey Leute,
die Verschlüsselung klappt soweit ganz gut.

wie schaut das ne jetzt mit der Entschlüsselung aus ? geht das auf dem gleichen weg?
Nur das man diee Parameter ändern muss?

1String cleartext = "00112233445566778899aabbccddeeff" ;
2String key = "000102030405060708090a0b0c0d0e0f";
3String returnvalue = "-1";
4
5
6public final String decrypt()
7 {
8
9 byte[] row = key.getBytes();
10 SecretKeySpec skeySpec = new SecretKeySpec(row, "AES");
11
12 try
13 {
14 Cipher cipher = Cipher.getInstance("AES");
15 cipher.init(Cipher.DECRYPT_MODE,skeySpec);
16 byte[] decrypted = cleartext.getBytes();
17 decrypted = cipher.doFinal(decrypted);
18
19 returnvalue = new String(Base64.decode(decrypted, Base64.URL_SAFE));
20
21 }
22 catch(Exception e)
23 {
24 e.printStackTrace();
25 }
26 return returnvalue1;
27 }

— geändert am 28.08.2012, 10:11:39

Jedem das Seine, doch Mir das Meine

Antworten
Markus B.
  • Forum-Beiträge: 636

28.08.2012, 10:22:07 via Website

Hi, da es sich bei AES um ein symmetrisches Algorithmus handelt drehst du einfach alles um.
Verschlüsselter Text + Schlüssel in die dercpt-Methode und fertig.

Gruß,
Markus

Ps.: Du musst natürlich erst Base64 decrypten und dann AES. Du gibt bei encrypt ja auch den Base64 String raus.

— geändert am 28.08.2012, 10:23:33

Antworten
Thor93
  • Forum-Beiträge: 487

29.08.2012, 13:01:19 via Website

ok das ist ein guter Hinweis danke.

nach mehrfachen probieren will das immer noch nicht klappen :cold:
es kommt immer -1 zurück

Jedem das Seine, doch Mir das Meine

Antworten
Thor93
  • Forum-Beiträge: 487

29.08.2012, 14:29:31 via Website

Okay ich habe es so versucht.

1String Test;
2
3String returnvalue1 = "-1";
4
5String key = "000102030405060708090a0b0c0d0e0f";
6
7tv.setText(decrypt());
8
9 public final String decrypt()
10 {
11 SecretKeySpec skeySpec = new SecretKeySpec(key, Test);
12 try
13 {
14
15 Test = new String(Base64.decode(Test, Base64.URL_SAFE));
16
17
18 Cipher cipher = Cipher.getInstance("AES");
19
20 byte[] decrypted = Test.getBytes();
21
22 cipher.init(Cipher.DECRYPT_MODE, skeySpec);
23
24 decrypted = cipher.doFinal(decrypted);
25
26 returnvalue1 = cipher.toString();
27
28 }
29 catch(Exception e)
30 {
31 e.printStackTrace();
32 }
33 return returnvalue1;

Jedem das Seine, doch Mir das Meine

Antworten
Thor93
  • Forum-Beiträge: 487

31.08.2012, 09:12:01 via Website

Ich weiß zwar das es falsch ist aber so falsch das überhaupt keine Anwort kommt. OMG :O:O

— geändert am 04.09.2012, 08:21:36

Jedem das Seine, doch Mir das Meine

Antworten
Markus B.
  • Forum-Beiträge: 636

31.08.2012, 12:26:47 via Website

Hi,
ich bin im Moment mit Arbeit zugepackt und habe somit wenig Zeit.
Folgende Dinge sind mir bei deiner Implementierung aufgefallen:

- Konvertiere nicht alles in Strings. Gerade wenn du mit Base64 arbeitest du das problematisch. Somit bleib auf byte ebene.
- Du verwendest du Schlüssel nicht optimal das geht besser. Da gibts genug Beispiele im Netz.
- Bei dir fliegt sicher eine javax.crypto.IllegalBlockSizeException: last block incomplete in decryption Exception.

Somit geh mal auf die Suche und dann bekommst du es schon hin. Mehr kann ich dir im Moment nicht bieten.

Gruß,
Markus

Antworten
Thor93
  • Forum-Beiträge: 487

04.09.2012, 08:44:39 via Website

Markus B.
Hi,

- Bei dir fliegt sicher eine javax.crypto.IllegalBlockSizeException: last block incomplete in decryption Exception.

Hallo Markus,

Ich bekommen die Exception: java.lang.IllegalArgumentException: bad base-64


Gruß Thor93

— geändert am 04.09.2012, 08:44:55

Jedem das Seine, doch Mir das Meine

Antworten
Thor93
  • Forum-Beiträge: 487

04.09.2012, 11:07:05 via Website

Würde es nicht auch so gehn?

1public String decrypt(String code) {
2 Thread.sleep(randomInt.nextInt(100));
3 if(code == null || code.length() == 0) {
4 return null;
5 }
6 byte[] decrypted = null;
7 try {
8 String iv64 = code.substring(0, IV_LENGTH*2);
9 String encrypted64 = code.substring(IV_LENGTH*2);
10 byte[] iv = Base64.decode(iv64, Base64.DEFAULT);
11 IvParameterSpec ivspec = new IvParameterSpec(iv);
12 cipher.init(Cipher.DECRYPT_MODE, getSecretKey(SecretKey), ivspec);
13 decrypted = cipher.doFinal(Base64.decode(encrypted64, Base64.DEFAULT));
14 }
15 catch (Exception e) {
16 return null;
17 }
18 return new String(decrypted, "UTF-8");
19 }

Quelle: http://codereview.stackexchange.com/questions/7297/secure-aes-encryption-and-decryption-in-android

Jedem das Seine, doch Mir das Meine

Antworten
Thor93
  • Forum-Beiträge: 487

26.07.2013, 14:15:01 via Website

Ich muss diesen Thread noch einmal auf werfen.

im laufe der zeit musste ich einige Funktionen ändern und nun geht garnichts mehr :angry:

im Prinzip wollte ich nur den ciphermode und den Paddingmode fest legen.

1private static final String CIPHER_ALGORITHM = "AES/CBC/PKCS7Padding";
2Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);

Geht aber krachen.

Gruß Thor93

Jedem das Seine, doch Mir das Meine

Antworten