1- using System . Net . Mime ;
1+ using System . Security . Cryptography ;
2+ using System . Net . Mime ;
23using System . Linq ;
34using System . Diagnostics ;
45using System ;
@@ -9,7 +10,8 @@ namespace Padding_Oracle_Attack
910{
1011 class PaddingOracleAttack
1112 {
12- private static RemoteServerMock server = new RemoteServerMock ( ) ;
13+ private static RemoteServerMock server = new RemoteServerMock ( PaddingMode . PKCS7 ) ;
14+ private static PaddingOracleDecryptor decryptor = new PaddingOracleDecryptor ( server ) ;
1315
1416 public static void Main ( String [ ] args )
1517 {
@@ -36,7 +38,7 @@ public static void Main(String[] args)
3638 {
3739 stopwatch . Start ( ) ;
3840
39- string decryptedPlaintext = DecryptBlock ( blocks [ blockIndex ] , blocks [ blockIndex - 1 ] ) ;
41+ string decryptedPlaintext = decryptor . DecryptBlock ( blocks [ blockIndex ] , blocks [ blockIndex - 1 ] ) ;
4042
4143 stopwatch . Stop ( ) ;
4244
@@ -57,15 +59,17 @@ private static void HandleConfigurationArguments(String[] args)
5759 {
5860 OptionSet arguments = new OptionSet ( ) ;
5961 arguments . Add ( "d|delay=" , "oracle delay in milliseconds for each padding request" , ( uint d ) => server . OracleDelayMilliseconds = d ) ;
60- arguments . Add ( "h|help" , "displays this message" , _ => {
62+ arguments . Add ( "h|help" , "displays this message" , _ =>
63+ {
6164 arguments . WriteOptionDescriptions ( Console . Out ) ;
6265 Environment . Exit ( 0 ) ;
6366 } ) ;
6467
6568 try
6669 {
6770 var rest = arguments . Parse ( args ) ;
68- if ( rest . Count == 0 ) {
71+ if ( rest . Count == 0 )
72+ {
6973 return ;
7074 }
7175 Console . WriteLine ( "Unrecognized arguments: {0}" , String . Join ( "," , rest ) ) ;
@@ -78,38 +82,5 @@ private static void HandleConfigurationArguments(String[] args)
7882 arguments . WriteOptionDescriptions ( Console . Out ) ;
7983 Environment . Exit ( 1 ) ;
8084 }
81-
82- private static string DecryptBlock ( byte [ ] block , byte [ ] previousBlock )
83- {
84- byte [ ] decrypted = new byte [ block . Length ] ;
85- byte [ ] manipulatedPrevious = new byte [ 16 ] ;
86-
87- // in case of PKCS7 padding value is same as padding length
88- for ( int paddingLength = 1 ; paddingLength <= block . Length ; ++ paddingLength )
89- {
90- for ( int pos = block . Length - 1 ; pos >= block . Length - paddingLength ; -- pos )
91- {
92- int previousPaddingLength = paddingLength - 1 ;
93- manipulatedPrevious [ pos ] ^= ( byte ) ( previousPaddingLength ^ paddingLength ) ;
94- }
95- var found = false ;
96- for ( byte v = byte . MinValue ; v <= byte . MaxValue ; ++ v )
97- {
98- manipulatedPrevious [ block . Length - paddingLength ] = v ;
99- if ( server . IsPaddingCorrect ( ByteUtils . Concatenate ( manipulatedPrevious , block ) ) )
100- {
101- found = true ;
102- decrypted [ block . Length - paddingLength ] = ( byte ) ( previousBlock [ block . Length - paddingLength ] ^ paddingLength ^ v ) ;
103- break ;
104- }
105- }
106- if ( ! found )
107- {
108- throw new Exception ( "Decryption not possible. This function supports only AES/CBC/PKCS7" ) ;
109- }
110- }
111-
112- return Encoding . UTF8 . GetString ( decrypted , 0 , decrypted . Length ) ;
113- }
11485 }
11586}
0 commit comments