Как конвертировать C ++ без знака char * в C #? - PullRequest
0 голосов
/ 03 января 2019

У меня есть метод на C ++, созданный для шифрования AES 256, который работает:

void AES_Encrypt(unsigned char* message, unsigned char* expandedKey)
{
      unsigned char numOfRounds = 13;
      unsigned char* state = new unsigned char[16];

      AddRoundKey(state, expandedKey);
      for (int i = 0; i < numOfRounds; i++)
      {
          //bla bla
          AddRoundKey(state, expandedKey + (16 * (i + 1)));
      }

      // bla bla
      AddRoundKey(state, expandedKey + 224);
}

и

void AddRoundKey(unsigned char *state, unsigned char* roundKey)
{
    for (int i = 0; i < 16; i++)
        state[i] = state[i] ^ roundKey[i];
}

, но когда я перевожу его на C #:

private void AddRoundKey(byte[] state, byte[] roundKey)
{
    for (int i = 0; i < 16; i++)
        state[i] = (byte)(state[i] ^ roundKey[i]);
}

Я получаю ошибки в точной переведенной функции:

AddRoundKey(state, expandedKey + (16 * (i + 1)));
AddRoundKey(state, expandedKey + 224);

Как мне правильно перевести void AddRoundKey(unsigned char *state, unsigned char* roundKey) в этом случае?

1 Ответ

0 голосов
/ 03 января 2019

Простейшим способом будет смещение:

void AddRoundKey(byte[] state, byte[] roundKey, int offset)
    {
        for (int i = 0; i < 16; i++)
            state[i] = (byte)(state[i] ^ roundKey[i + offset]);
    }

тогда вы называете это:

        AddRoundKey(state, expandedKey, (16 * (i + 1)));
        ...
        AddRoundKey(state, expandedKey, 244);

Другое

Вы можете использовать ключевое слово unsafe (обратите внимание, чтобы включить небезопасный в настройках вашего проекта)

unsafe void AddRoundKey(byte* state, byte* roundKey)
    {
        for (int i = 0; i < 16; i++)
            state[i] = (byte)(state[i] ^ roundKey[i]);
    }

затем используйте фиксированный, когда вы звоните:

fixed (byte* state_pointer = state, expandedKey_pointer = expandedKey)
        {
            AddRoundKey(state_pointer, expandedKey_pointer + 244);
        }

когда состояние и extendedKey является байтом [].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...