【问题标题】:C++ Encrypt Char with a Key and MaskC++ 使用密钥和掩码加密字符
【发布时间】:2016-04-17 23:38:35
【问题描述】:

我需要编写一个用特殊密钥加密字符的代码。 我必须使用自己的密钥和掩码进行异或运算。 但我对此的理解和实施存在问题。

首先,我创建了自己的密钥,用于加密字符。这个密钥是 e.q 数字:123456789。在二进制表示中,数字 123456789 是:00010101 11001101 01011011 00000111。我将其划分为 4 x 8 位,因为我输入了一种 char。 我也必须用它来用掩码加密我的字符。我的掩码是 0xFF,因为它会重置最旧的位,而最年轻的 8 位则留给进行 XOR 操作。 这意味着当我输入 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);

}

【问题讨论】:

  • @user4581301 是的,当然。但我只是一个初学者,在我的课堂上我们有一个简单的例子来使用自己的密钥。谢谢你的回答。

标签: c++ encryption codeblocks


【解决方案1】:

有几个问题:

  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 可能会更大或更小,具体取决于 CPU 的 32 位。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 有十六进制,它比十进制更接近二进制。 00010101, 11001101, 01011011, 00000111 -> 15, cd, 5b, 07.
    • 那是十六进制文字,仍然不是二进制文字。
    • 从来没有说过?但是 OP 想使用二进制文字,所以我的回答反映了这一点。
    • @zaph 感谢您提供这些信息,但是我是否以正确的实现方式编写了它?我可以将这个 temp[0], temp[1].. 连接到一个数组吗?
    猜你喜欢
    • 2011-05-09
    • 1970-01-01
    • 2015-07-31
    • 1970-01-01
    • 2014-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多