Given final block not properly padded

unam

Grünschnabel
Hi!
Bin neu hier, also erstmal hallo an alle!
Hoffe es kann kann mir hier wer weiterhelfen.
Mit folgendem versuche ich ein SealedObject mehrmals hintereinander zu verschlüsseln und dann wieder zu entschlüsseln:
PHP:
	@Override
	public Serializable decryptMessage(Serializable cipherText) throws EncryptionKeyNotInitialisedException, DecryptionFailedException {
		if( this.key == null )
			throw new EncryptionKeyNotInitialisedException(); 
		
		if(!( cipherText instanceof SealedObject))
			throw new DecryptionFailedException( "message no instance of SealedObject");

		SealedObject o = (SealedObject)  cipherText;
		
		
		Cipher cipher = null;
		try {
			cipher = Cipher.getInstance( "AES" );
		} catch (NoSuchAlgorithmException e) { throw new DecryptionFailedException(e);
		} catch (NoSuchPaddingException e) { throw new DecryptionFailedException(e);
		}
		try { 
			cipher.init( Cipher.DECRYPT_MODE, this.key );
		} catch (InvalidKeyException e) { e.getStackTrace(); throw new DecryptionFailedException(e);
		}

		Serializable plainText = null;
		try {
			plainText = (Serializable) o.getObject(cipher);
		} catch (IllegalBlockSizeException e) { throw new DecryptionFailedException(e);
		} catch (BadPaddingException e) { throw new DecryptionFailedException(e);
		} catch (IOException e) { throw new DecryptionFailedException(e);
		} catch (ClassNotFoundException e) {throw new DecryptionFailedException(e);
		} catch ( ClassCastException e){ throw new DecryptionFailedException(e); }
	
		return plainText;
		
	}
	
	@Override
	public Serializable encryptMessage(Serializable cipherText) throws EncryptionFailedException,
	EncryptionKeyNotInitialisedException  {
		if( this.key == null )
			throw new EncryptionKeyNotInitialisedException(); 
		
		Cipher cipher = null;
		try {
			cipher = Cipher.getInstance( "AES" );
		} catch (NoSuchAlgorithmException e) { throw new EncryptionFailedException( e );
		} catch (NoSuchPaddingException e) { throw new EncryptionFailedException( e ); 
		}
		
		try {
			cipher.init( Cipher.ENCRYPT_MODE, this.key );
		} catch (InvalidKeyException e) { throw new EncryptionFailedException( e ); 
		}
		
		try {
			return new SealedObject( cipherText, cipher );
		} catch (IllegalBlockSizeException e) {   throw new EncryptionFailedException(e);
		} catch (IOException e) { throw new EncryptionFailedException(e);
		}
	}

Beim entschlüsseln erhalte ich immer eine BadPaddingException die mir sagt "Given final block not properly padded". Ich kann mir nicht erklären, woher der Fehler kommt. Die Schlüssel sind definitiv richtig. Ich habe in irgendwo gelesen, dass das ganze ein Encoding-Problem sein soll, dass auftritt wenn man allzu leichtfertig Strings in byte[] umwandelt.
Kann es sein, dass das ganze in der SealedObject-Klasse falsch implementiert ist oder ist einfach nur irgendwo ein Fehler in meinem Code?

Danke schonmal!
 
Hallo nochmal!
Habe selber eine Lösung gefunden:
Der Grund für die Exception ist vermutlich, dass ich den default AES-Cipher verwende.
Wenn ich hier mit verschiedenene Keys verschlüssele, weiß der Cipher anscheinend nicht mehr wann er die RandomBytes die er beim Padding hinzunimmt wegschneiden muss.
Ein einfacher Work-Around ist es, einen "AES/CBC/NoPadding"-Cipher zu verwenden und in den zu verschlüsselnden Daten selber sicherstellt, dass sie die richtige Länge haben (z.B. muss das byte[].length bei AES 128bit Key durch 16 teilbar sein).

grüße
manu
 
Zurück