1
- using System . Net . Mime ;
1
+ using System . Security . Cryptography ;
2
+ using System . Net . Mime ;
2
3
using System . Linq ;
3
4
using System . Diagnostics ;
4
5
using System ;
@@ -9,7 +10,8 @@ namespace Padding_Oracle_Attack
9
10
{
10
11
class PaddingOracleAttack
11
12
{
12
- private static RemoteServerMock server = new RemoteServerMock ( ) ;
13
+ private static RemoteServerMock server = new RemoteServerMock ( PaddingMode . PKCS7 ) ;
14
+ private static PaddingOracleDecryptor decryptor = new PaddingOracleDecryptor ( server ) ;
13
15
14
16
public static void Main ( String [ ] args )
15
17
{
@@ -36,7 +38,7 @@ public static void Main(String[] args)
36
38
{
37
39
stopwatch . Start ( ) ;
38
40
39
- string decryptedPlaintext = DecryptBlock ( blocks [ blockIndex ] , blocks [ blockIndex - 1 ] ) ;
41
+ string decryptedPlaintext = decryptor . DecryptBlock ( blocks [ blockIndex ] , blocks [ blockIndex - 1 ] ) ;
40
42
41
43
stopwatch . Stop ( ) ;
42
44
@@ -57,15 +59,17 @@ private static void HandleConfigurationArguments(String[] args)
57
59
{
58
60
OptionSet arguments = new OptionSet ( ) ;
59
61
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
+ {
61
64
arguments . WriteOptionDescriptions ( Console . Out ) ;
62
65
Environment . Exit ( 0 ) ;
63
66
} ) ;
64
67
65
68
try
66
69
{
67
70
var rest = arguments . Parse ( args ) ;
68
- if ( rest . Count == 0 ) {
71
+ if ( rest . Count == 0 )
72
+ {
69
73
return ;
70
74
}
71
75
Console . WriteLine ( "Unrecognized arguments: {0}" , String . Join ( "," , rest ) ) ;
@@ -78,38 +82,5 @@ private static void HandleConfigurationArguments(String[] args)
78
82
arguments . WriteOptionDescriptions ( Console . Out ) ;
79
83
Environment . Exit ( 1 ) ;
80
84
}
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
- }
114
85
}
115
86
}
0 commit comments