如何将C++无符号字符* 转换为 C#

How to convert C++ unsigned char* to C#?

本文关键字:转换 字符 无符号 C++      更新时间:2023-10-16

我在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)

最简单的方法是传递偏移量:

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 void AddRoundKey(byte* state, byte* roundKey)
    {
        for (int i = 0; i < 16; i++)
            state[i] = (byte)(state[i] ^ roundKey[i]);
    }

然后在调用它时使用 fixed:

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

状态扩展键为字节 [] 时。