2017-10-24 4 views
0

Im machen App zum Verschlüsseln und Entschlüsseln von Text im AES/CBC-Modus. In AES/CBC/PKCS5Padding (und PKCS7Padding) funktioniert alles gut, aber wenn ich den Algorithmus auf AES/CBC/NoPadding setze bekomme ich "error" String als Ausgabe. Was ist das Problem?Verschlüsselung ohne Padding funktioniert nicht

Klasse enthält, Verschlüsseln und Entschlüsseln von Funktionen:

public class CriptographyUtils 
{ 
    private static final String INIT_VECTOR = "fedcba"; 
    private static final String ALGORITHM = "AES/CBC/NoPadding"; 

    public static String aesEncrypt(String key, String text) // encrypts text (get bytes -> encrypt -> encode -> to String) 
    { 
     String result; 

     try 
     { 
      IvParameterSpec iv = new IvParameterSpec(INIT_VECTOR.getBytes()); 
      SecretKeySpec myKey = new SecretKeySpec(fixKey(key).getBytes("UTF-8"), "AES"); 

      Cipher cipher = Cipher.getInstance(ALGORITHM); 
      cipher.init(Cipher.ENCRYPT_MODE, myKey, iv); 

      byte[] encryptedBytes = cipher.doFinal(text.getBytes("UTF-8")); 

      result = Base64.encodeToString(encryptedBytes, Base64.DEFAULT); 
     } 
     catch (Exception ex) 
     { 
      ex.printStackTrace(); 
      result = "error"; 
     } 

     return result; 
    } 

    public static String aesDecrypt(String key, String text) // decrypts text (get bytes -> decode -> decrypt -> to String) 
    { 
     String result; 

     try 
     { 
      IvParameterSpec iv = new IvParameterSpec(INIT_VECTOR.getBytes("UTF-8")); 
      SecretKeySpec myKey = new SecretKeySpec(fixKey(key).getBytes("UTF-8"), "AES"); // create new KEY in utf-8 

      Cipher cipher = Cipher.getInstance(ALGORITHM); // create new cipher 
      cipher.init(Cipher.DECRYPT_MODE, myKey, iv); // set cipher into decrypt mode using my KEY 

      byte[] decryptedBytes = cipher.doFinal(Base64.decode(text, Base64.DEFAULT)); // get bytes -> decode -> decrypt 

      result = new String(decryptedBytes); // convert decrypted text to String 
     } 
     catch (Exception ex) 
     { 
      ex.printStackTrace(); 
      result = "error"; 
     } 

     return result; 
    } 

    private static String fixKey(String key) 
    { 
     if (key.length() < 16) // less than 128 bits 
     { 
      int numPad = 16 - key.length(); 

      for (int i = 0; i < numPad; i++) 
       key += "0"; //0 pad to len 16 bytes 
     } 
     else if (key.length() > 16) 
      key = key.substring(0, 16); //truncate to 16 bytes 

     return key; 
    } 
} 

Usage:

verschlüsselnde:

CriptographyUtils.aesEncrypt(key, textToEncrypt) 

Decrypting:

CriptographyUtils.aesDecrypt(key, textToDecrypt)); 

Der Schlüssel ist:

private static final String key = "1234123412341234"; 

Antwort

0

AES ein Blockverschlüsselungsalgorithmus ist, und als solches muß seine Eingabe ein Vielfaches der Blockgröße sein, 16-Bytes für AES. Daher muss ein Padding hinzugefügt werden, wenn die Daten nicht garantiert ein Vielfaches der Blockgröße sind.

Padding verwenden: PKCS # 7 ist das allgemein verwendete Padding für AES, PKCS # 5 ist im Wesentlichen dasselbe.

Die PKCS # 5-Kennung ist nur für AES, weil die Programmierer zu faul waren Unterstützung für die PKCS # 7-Kennung hinzuzufügen. Siehe PKCS#7 padding:

PKCS # 5 Padding ist identisch mit PKCS # 7 Padding, außer dass es nur für Blockchiffren definiert wurde, die eine 64-Bit (8 Byte) Blockgröße verwenden. In der Praxis können die beiden austauschbar verwendet werden..

Verwandte Themen