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

时间:2016-04-16 20:44:17

标签: c++ encryption codeblocks

我需要编写一个用特殊密钥加密char的代码。 我必须使用自己的密钥和掩码与XOR操作。 但是我对理解和实施这个问题有所了解。

首先,我创建了自己的密钥,用于加密char。该密钥是e.q编号:123456789。二进制表示编号123456789是:00010101 11001101 01011011 00000111.我将其分为4 x 8位,因为我输入了一种char。 我必须使用它来加密我的字符也用掩码。我的掩码是0xFF,因为它复位最旧的位,最小的8位用于XOR操作。 这意味着当我输入char“a”时,它应该使用此键和带有XOR操作的掩码对其进行加密。

更重要的是,我想检查我的编译器用键[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);

}

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

有几个问题:

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

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

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

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

    就个人而言,我更喜欢使用uint32_tuint8_t类型的情况,个别情况下,大小明确,int可能会大于或小于32位,具体取决于中央处理器。