2

I'm trying to implement AES in c# and I bumped into an error.

This is my code so far.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace aes1
{
class Program
{

    public byte[,] m_sbox = new byte[16, 16]   
           {{0x63 ,0x7c ,0x77 ,0x7b ,0xf2 ,0x6b ,0x6f ,0xc5 ,0x30 ,0x01 ,0x67 ,0x2b ,0xfe ,0xd7 ,0xab ,0x76}
           ,{0xca ,0x82 ,0xc9 ,0x7d ,0xfa ,0x59 ,0x47 ,0xf0 ,0xad ,0xd4 ,0xa2 ,0xaf ,0x9c ,0xa4 ,0x72 ,0xc0}
           ,{0xb7 ,0xfd ,0x93 ,0x26 ,0x36 ,0x3f ,0xf7 ,0xcc ,0x34 ,0xa5 ,0xe5 ,0xf1 ,0x71 ,0xd8 ,0x31 ,0x15}
           ,{0x04 ,0xc7 ,0x23 ,0xc3 ,0x18 ,0x96 ,0x05 ,0x9a ,0x07 ,0x12 ,0x80 ,0xe2 ,0xeb ,0x27 ,0xb2 ,0x75}
           ,{0x09 ,0x83 ,0x2c ,0x1a ,0x1b ,0x6e ,0x5a ,0xa0 ,0x52 ,0x3b ,0xd6 ,0xb3 ,0x29 ,0xe3 ,0x2f ,0x84}
           ,{0x53 ,0xd1 ,0x00 ,0xed ,0x20 ,0xfc ,0xb1 ,0x5b ,0x6a ,0xcb ,0xbe ,0x39 ,0x4a ,0x4c ,0x58 ,0xcf}
           ,{0xd0 ,0xef ,0xaa ,0xfb ,0x43 ,0x4d ,0x33 ,0x85 ,0x45 ,0xf9 ,0x02 ,0x7f ,0x50 ,0x3c ,0x9f ,0xa8}
           ,{0x51 ,0xa3 ,0x40 ,0x8f ,0x92 ,0x9d ,0x38 ,0xf5 ,0xbc ,0xb6 ,0xda ,0x21 ,0x10 ,0xff ,0xf3 ,0xd2}
           ,{0xcd ,0x0c ,0x13 ,0xec ,0x5f ,0x97 ,0x44 ,0x17 ,0xc4 ,0xa7 ,0x7e ,0x3d ,0x64 ,0x5d ,0x19 ,0x73}
           ,{0x60 ,0x81 ,0x4f ,0xdc ,0x22 ,0x2a ,0x90 ,0x88 ,0x46 ,0xee ,0xb8 ,0x14 ,0xde ,0x5e ,0x0b ,0xdb}
           ,{0xe0 ,0x32 ,0x3a ,0x0a ,0x49 ,0x06 ,0x24 ,0x5c ,0xc2 ,0xd3 ,0xac ,0x62 ,0x91 ,0x95 ,0xe4 ,0x79}
           ,{0xe7 ,0xc8 ,0x37 ,0x6d ,0x8d ,0xd5 ,0x4e ,0xa9 ,0x6c ,0x56 ,0xf4 ,0xea ,0x65 ,0x7a ,0xae ,0x08}
           ,{0xba ,0x78 ,0x25 ,0x2e ,0x1c ,0xa6 ,0xb4 ,0xc6 ,0xe8 ,0xdd ,0x74 ,0x1f ,0x4b ,0xbd ,0x8b ,0x8a}
           ,{0x70 ,0x3e ,0xb5 ,0x66 ,0x48 ,0x03 ,0xf6 ,0x0e ,0x61 ,0x35 ,0x57 ,0xb9 ,0x86 ,0xc1 ,0x1d ,0x9e}
           ,{0xe1 ,0xf8 ,0x98 ,0x11 ,0x69 ,0xd9 ,0x8e ,0x94 ,0x9b ,0x1e ,0x87 ,0xe9 ,0xce ,0x55 ,0x28 ,0xdf}
           ,{0x8c ,0xa1 ,0x89 ,0x0d ,0xbf ,0xe6 ,0x42 ,0x68 ,0x41 ,0x99 ,0x2d ,0x0f ,0xb0 ,0x54 ,0xbb ,0x16}};

    public byte[,] SubBytes(byte[,] input)
    {
        byte[,] output = new byte[4, 4];

        for (int j = 0; j <= 3; j++)
        {
            for (int k = 0; k <= 3; k++)
            {
                output[k, j] = Sbox(input[k, j]);
            }
        }
        return output;
    }

    public byte Sbox(byte input)
    {
        return m_sbox[input / 16, input % 16];
    }


    public static byte[] Str2ByteArray(string str)
    {
        System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding();
        return encoding.GetBytes(str);
    }

    static void Main(string[] args)
    {
        byte[,] state = new byte[4, 4];
        //byte[,] input = new byte[4, 4];
        byte[,] input = new byte[4, 4] {
                                        { 0xd4, 0xe0, 0xb8, 0x1e },
                                        { 0xbf, 0xb4, 0x41, 0x27 },
                                        { 0x5d, 0x52, 0x11, 0x98 },
                                        { 0x30, 0xae, 0xf1, 0xe5 } 
                                      };
        //string text = "abcd";
        //byte[] input = Str2ByteArray(text);

        state = SubBytes(input);
    }
}
}

I've created the SubBytes function which works correctly. I know that the type of state has to be the same as the type of input.

The last line gives me "An object reference is required for the non-static field, method, or property" error. Why am I getting this? What am I doing wrong?

user2864740
  • 60,010
  • 15
  • 145
  • 220
Andrei Cristian Prodan
  • 1,114
  • 4
  • 17
  • 34
  • possible duplicate of [Error: “an object reference is required for the non-static field, method or property…”](http://stackoverflow.com/questions/2505181/error-an-object-reference-is-required-for-the-non-static-field-method-or-prop) – Conrad Frix Nov 02 '11 at 15:00
  • Just in case you are inadvertently re-inventing the wheel : http://msdn.microsoft.com/en-us/library/system.security.cryptography.rijndael.aspx – Matt Evans Nov 02 '11 at 15:04
  • Also http://stackoverflow.com/q/7016437 , http://stackoverflow.com/q/860370 , http://stackoverflow.com/q/2505181 , http://stackoverflow.com/q/3775721 , http://stackoverflow.com/q/2051558 , http://stackoverflow.com/q/1302835 , http://stackoverflow.com/q/279306 – Conrad Frix Nov 02 '11 at 15:05

5 Answers5

6

SubBytes is declared as an instance method, rather than a static method. This is an issue because you're calling it from a static context -- the Main method.

Change the definition of the method to this, and you should be fine:

public static byte[,] SubBytes(byte[,] input)
Donut
  • 110,061
  • 20
  • 134
  • 146
  • I used static for all my functions and now I'm getting the same error at return m_sbox[input / 16, input % 16]; – Andrei Cristian Prodan Nov 02 '11 at 15:03
  • @AndreiCristianProdan You also need to declare your `m_sbox` array as static -- `public static byte[,] m_sbox = new byte[16, 16]` – Donut Nov 02 '11 at 15:04
  • 1
    Amazing how 2 minutes of asking on stackoverflow can save you over 30 minutes of wasted time. Why did I have to make them static? – Andrei Cristian Prodan Nov 02 '11 at 15:07
  • @AndreiCristianProdan `static` members of a class are accessible even when no instance of that class has been created. Without declaring the array and these methods as `static`, you would have needed to create an instance of the `Program` class, e.g., `new Program().SubBytes(...)` – Donut Nov 02 '11 at 15:13
5

Your methods are instance methods.
They require an instance of the Program class to work on.

However, you should not do this at all.
Use System.Security.Cryptography.RijndaelManged; don't reinvent the wheel (especially in crypto).

SLaks
  • 868,454
  • 176
  • 1,908
  • 1,964
1

You have to make SubBites static

BlackBear
  • 22,411
  • 10
  • 48
  • 86
1

This is because your Main method is static.

You need to declare a new instance of Program to access the method like this:

state = new Program().SubBytes(input);

Or declare the methods also as static (which is nice because they don't access any member data).

Wouter de Kort
  • 39,090
  • 12
  • 84
  • 103
0

Try making the SubBytes method static:

public static byte[,] SubBytes(byte[,] input)
harriyott
  • 10,505
  • 10
  • 64
  • 103