C++ 使用密钥和掩码加密字符

C++ Encrypt Char with a Key and Mask

我需要编写一个代码,用一个特殊的密钥来加密一个字符。 我必须使用自己的密钥和掩码进行异或运算。 但是我对这个的理解和实现有问题。

首先,我创建了自己的密钥,用于加密一个字符。 This key is e.q number: 123456789. in binary representation number 123456789 is: 00010101 11001101 01011011 00000111. 我把它分成 4 x 8 位,因为我输入了一种字符。 我也必须使用它来用掩码加密我的字符。我的掩码是 0xFF,因为它重置了最旧的位,而剩下的最年轻的 8 位用于异或运算。 这意味着当我输入 char "a" 时,它应该使用此密钥和带有 XOR 操作的掩码对其进行加密。

此外,我想检查我的编译器在 key[0] 位置显示的内容。这意味着我有 "int key[0] = {00000111}" 因为我认为它应该显示数字 7 作为二进制数,但编译器显示数字 73。为什么?

如果有人能帮我解决这个问题,我将不胜感激。

这是我的代码:

#include <iostream>

using namespace std;


void encryption(char chars[], const int size);

int main() {
    const int size1 = 4;
    char chars1[size1];
    unsigned int keys = 123456789;
    int key[] = {00000111}; // why does it show number 73 instead of 7 ?

    cout << "Enter a char to encrypt: " << endl;
    cin >> chars1[0];


    return 0; }

void encryption(char chars[], const int size) {
    unsigned int keys = 123456789;
    unsigned int key[] = {00010101, 11001101, 01011011, 00000111};
    unsigned int mask = 0xFF;
    int temp[4] = {0};


        temp[0] = chars[0] ^ (keys & mask);
        temp[1] = chars[0] ^ ((keys >> 8) & mask);
        temp[2] = chars[0] ^ ((keys >> 16) & mask);
        temp[3] = chars[0] ^ ((keys >> 24) & mask);

}

问题是编译器不会将您的 00000111 解释为二进制文件。 C++ 11 不支持二进制文字。此外,任何以 0(又名 00000111)作为最高有效数字开头的数字都被认为是八进制的。在八进制中,111 等同于十进制中的 73

您需要将所有 "binary values" 转换为十进制,然后使用它们。或者你可以使用 boost, which has a utility that handles what you're looking to do.

有几个问题:

  1. unsigned int keys = 123456789 是十六进制 075bcd15
    00010101, 11001101, 01011011, 00000111 是十六进制 15cd5b07
    虽然两者都是 4 字节,但请注意字节的相反顺序,这是因为计算机对整数使用了所谓的小端字节顺序。因此,如果您通过转换为无符号字符来获取字节,您将获得与您期望的相反的字节顺序。

  2. unsigned int key[] 是一个 int 的数组,似乎是 32 位(4 字节)。

单个 unsigned int 使用
unsigned int keyBytes3 = {0x075bcd15};

对于 4 个数组 unsigned char:
unsigned char keyBytes[] = {0x07, 0x5b, 0xcd, 0x15};

个人而言,对于大小很重要的情况,我更喜欢使用 uint32_tuint8_t 类型,那么大小就很清楚了,int 可能比 32 位更大或更小,具体取决于在 CPU 上。