我需要编写一个用特殊密钥加密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);
}
答案 0 :(得分:0)
问题是编译器没有将您的00000111
解释为二进制文件。 C ++ 11不支持二进制文字。此外,任何以0(也称为00000111
)作为最高有效数字的数字都被视为八进制数。在八进制中,111
相当于十进制的73
。
您需要将所有“二进制值”转换为十进制,然后使用它们。或者您可以使用boost, which has a utility that handles what you're looking to do.
答案 1 :(得分:0)
有几个问题:
unsigned int keys = 123456789
为十六进制075bcd15
00010101, 11001101, 01011011, 00000111
为十六进制15cd5b07
虽然两个都是4字节通知字节的相反顺序,这是因为计算机使用了所谓的小端字节顺序的整数。因此,如果通过转换为无符号字符来获取字节,您将获得与预期相反的字节顺序。
unsigned int key[]
是int
的数组,似乎是32位(4字节)。
单个unsigned int
使用
unsigned int keyBytes3 = {0x075bcd15};
对于4 unsigned char
的数组:
unsigned char keyBytes[] = {0x07, 0x5b, 0xcd, 0x15};
就个人而言,我更喜欢使用uint32_t
和uint8_t
类型的情况,个别情况下,大小明确,int
可能会大于或小于32位,具体取决于中央处理器。