Ja das ist ja auch nicht falsch was die C# Bibliothek macht. Je nach Definition des Paddingverfahrens können noch viel mehr Daten angehangen werden.
In diesem Falle ist es so:
- wenn Nachricht Mehrfaches der Blockgröße ist dann hänge einen weiteren Block aus lauter 0'en hinten dran
- wenn Nachricht 1 Bytes länger ist als Blockgröße dann verschlüssele diese Block mit Zufall aufgefüllt und hänge einen weiteren Block mit 1'en aufgefüllt hinten dran
- wenn 2 bytes zu lang, dann im letzten Paddingblobk alles mit 2'en aufgefüllt
Es wird bei diesem Padding also immer minimal x Bytes der Blockgröße des Cipher angehangen.
An Hand der Bytewerte im Paddingblock kann bei der Entschlüsselung bestimmt werden wiviele Bytes vom letzten Datenblock real wichtig sind.
Nun, das Problem des Paddings entsteht durch die Entwicklung von Blockcipher mit > 1 Bytes Blockgröße. Und dies auf Computern/Programmiersystemen die 1 Byte als kleinste Recheneinheit addressieren können.
So hat man die Feedback-Modis eingeführt. Es gibt welche die aus einem Blockcipher mit zb. 8 bytes nativer Rechenblockgröße einen bauen mit 1 Bytes Blockgröße. Das bedeutet natürlich das diese Modis in diesem Fall zb. 8 mal langsammer sind. Aber die kryptographische Sicherheit eines 8 Bytes Blockciphers der zb. im CBC-8Bit (CBC mit 1 Byte Feedback) verschlüsselt wurde basiert einzigst auf der Sicherheit die dieser Cipher im 8 Bytes Feedback, also nativ, realisiert.
Man benutzt Modis wie CBC-8Bytes = Blockgröße des Ciphers, weil sie die höchste Performance aus dem Cipher rausholen können, also Datendurchsatz in Bytes/sec.
Statt nun logisch betrachtet in einem System das den letzten Block padden muß vom CBC-8Byte-Blockmodus in den CBC-1Bytes-Modus zu wechseln, hat man lange versucht eine irgendwie geartete Nachrichtenexpansion zu benutzen um auch bei den letzten 1-8 Bytes die Performance der einfachen Blockverschlüsselung zu erhalten. Die meisten Paddings sind also nicht aus kryptographischen Erwägungen entstanden sondern aus technischen Problemen heraus. Darunter zähle ich auch den Versuch auf Bit-Ebene Feebackmodis zu benutzen.
Nun,
DEC in der aktuellen Version hat zu jedem Block-Cipher-Mode einen der mit x Bytes = Blockgröße Cipher arbeitet und einen der im 1 Bytes Feedback arbeitet. Wenn der Cipher im xBytes Blockmodus arbeitet und ein Datenblock mit < Blockgröße verschlüsseln soll dann wechselt der Cipher in den 1 Bytes Modus und verbleibt auch dort. Es wird eine
Exception gerissen wenn man über die Länge des letzten Blockes hinaus verschlüsseln möchte. Kryptographisch ist das diejenige Lösung die von Hause aus bewiesen sicher ist da sie ausschlielich auf schon bewiesenen Komponenten (Cipher und Feedbackmode) zurückgreift und keine zusätzlichen auswertbaren Informationen in das Sytem einbaut wie bei vielen anderen Paddings (die deswegen wieder einiges an Hirnschmlaz benötigen damit nicht neue Angriffe möglich werden, man baut also eine weitere Variable in die Gesamt-Sicherheits-Formel mit ein, die eigentlich unnötig ist).
Gruß Hagen