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

C++ C++;使用密钥和掩码加密字符,c++,encryption,codeblocks,C++,Encryption,Codeblocks,我需要写一个用特殊密钥加密字符的代码。 我必须使用自己的密钥和掩码进行异或操作。 但我在理解和实施这一点上有问题 首先,我创建了自己的密钥,用于加密字符。这把钥匙是e.q号码:123456789。在二进制表示中,数字123456789是:00001011001101 01011011 00000111。我将其分为4 x 8位,因为我输入了一种字符类型。 我必须用这个来加密我的字符与面具了。我的掩码是0xFF,因为它会重置最早的位,而最年轻的8位则留给XOR操作。 这意味着当我输入char“a”时

我需要写一个用特殊密钥加密字符的代码。 我必须使用自己的密钥和掩码进行异或操作。 但我在理解和实施这一点上有问题

首先,我创建了自己的密钥,用于加密字符。这把钥匙是e.q号码:123456789。在二进制表示中,数字123456789是:00001011001101 01011011 00000111。我将其分为4 x 8位,因为我输入了一种字符类型。 我必须用这个来加密我的字符与面具了。我的掩码是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);

}
#包括
使用名称空间std;
无效加密(字符[],常量int size);
int main(){
常数int size1=4;
字符1[size1];
无符号整数键=123456789;
int key[]={00000111};//为什么它显示的是数字73而不是7?
coutchars1[0];
返回0;}
无效加密(字符[],常量int size){
无符号整数键=123456789;
无符号整数键[]={0000101、11001101、01011011、00000111};
无符号整数掩码=0xFF;
int temp[4]={0};
临时[0]=字符[0]^(键和掩码);
temp[1]=字符[0]^((键>>8)和掩码);
temp[2]=字符[0]^((键>>16)和掩码);
temp[3]=字符[0]^((键>>24)和掩码);
}

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


您需要将所有的“二进制值”转换为十进制,然后使用它们。或者可以使用

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


您需要将所有的“二进制值”转换为十进制,然后使用它们。或者您可以使用

有几个问题:

  • unsigned int keys=123456789
    为十六进制
    075bcd15

    0001010110110101101100000111
    为十六进制
    15cd5b07

    虽然两者都是4字节,但请注意字节的顺序相反,这是因为计算机对整数使用了称为小端字节顺序的方法。因此,如果您通过强制转换为无符号字符来获得字节,您将获得与预期相反的字节顺序

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

  • 对于单个
    无符号整数
    使用
    unsigned int-keyBytes3={0x075bcd15}

    对于4个
    无符号字符的数组

    unsigned char keyBytes[]={0x07,0x5b,0xcd,0x15}


    就我个人而言,对于大小很重要的情况,我更喜欢使用
    uint32\u t
    uint8\u t
    类型,那么很明显,大小,
    int
    可能大于或小于32位,具体取决于CPU

    有几个问题:

  • unsigned int keys=123456789
    为十六进制
    075bcd15

    0001010110110101101100000111
    为十六进制
    15cd5b07

    虽然两者都是4字节,但请注意字节的顺序相反,这是因为计算机对整数使用了称为小端字节顺序的方法。因此,如果您通过强制转换为无符号字符来获得字节,您将获得与预期相反的字节顺序

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

  • 对于单个
    无符号整数
    使用
    unsigned int-keyBytes3={0x075bcd15}

    对于4个
    无符号字符的数组

    unsigned char keyBytes[]={0x07,0x5b,0xcd,0x15}


    就我个人而言,对于大小很重要的情况,我更喜欢使用
    uint32\u t
    uint8\u t
    类型,那么很明显,大小,
    int
    可能大于或小于32位,具体取决于CPU

    @user4581301当然可以。但我只是一个初学者,在我的课堂上,我们有一个简单的例子来使用自己的钥匙。谢谢您的回答。@user4581301当然可以。但我只是一个初学者,在我的课堂上,我们有一个简单的例子来使用自己的钥匙。谢谢你们的回答。有十六进制,比十进制更接近二进制。0001010101100110110011011,00000111->15,cd,5b,07。那么这是一个十六进制文字,仍然不是二进制文字。从来没有说过是吗?但是OP想要使用二进制文字,所以我的回答反映了这一点。@zaph谢谢你提供的这些信息,但是我写的是正确的实现吗?我可以连接这个温度[0],温度[1]。。一个数组有十六进制,它比十进制更接近二进制。0001010101100110110011011,00000111->15,cd,5b,07。那么这是一个十六进制文字,仍然不是二进制文字。从来没有说过是吗?但是OP想要使用二进制文字,所以我的回答反映了这一点。@zaph谢谢你提供的这些信息,但是我写的是正确的实现吗?我可以连接这个温度[0],温度[1]。。到一个数组?