【问题标题】:Xor with unsigned char与无符号字符异或
【发布时间】:2021-05-23 01:10:54
【问题描述】:

我正在尝试在 64 位密钥和 64 位无符号字符数组之间执行 Xor,但我不断得到非常奇怪的输出。数据类型或操作顺序有问题吗?

#include <iostream>

using namespace std;

int main() {
    unsigned char inputText = '7';
    unsigned char key = 'a';

    cout << "(input: 0x";
    cout << " " << inputText << ") ^ (";

    cout << "key: 0x";
    cout << " " << key << ") = ";

    cout << "0x ";
    cout << (inputText ^ key);
    cout << endl;
    return 0;
}

这是输出:

(input: 0x 7) ^ (key: 0x a) = 0x 86

如您所见,xor 生成大整数,并且没有证据表明十六进制值是 xor'd。 xor 的正确输出应该是:

0x d

【问题讨论】:

  • 次要,但K 变量的意义何在?你可以消除它,只使用w。
  • 它是更大的加密算法的一部分,其中变量具有重要意义
  • 为了可读性我把它拿出来
  • 这并没有解决问题,但不要将变量的值与屏幕上该值的表示混淆。您所追求的只是对两个变量中的 values 进行异或操作。 “十六进制值”是它们(有时)向世界展示的方式。编译器不在乎它们输入的是十六进制、八进制、文本还是其他任何内容。
  • 是的,这对我来说确实是个问题,因为我更好地理解了解决方案。谢谢皮特贝克尔

标签: c++ arrays char xor unsigned


【解决方案1】:

您不是异或十六进制数字,而是字符的ascii values。

输入:'7'、'3'、'6'、'5'

ASCII:55、51、54、53

键:'0'、'f'、'f'、'a'

ASCII:48、102、102、97

结果:55 ^ 48, 51 ^ 102, 54 ^ 102, 53 ^ 97

结果:7、85、80、84

【讨论】:

  • 我可以解决这个问题,让它改为十六进制值吗?
  • @steve 这是另一个问题,但请参阅char - Hex character to int in C++ - Stack Overflow
  • @steve 您是否需要将十六进制值存储为 ascii 字符?如果不是,最直接的解决方案是用uint16_t inputText[4] = { 0x7365, 0x6375, 0x7269, 0x7479 }; 和uint16_t key[4] = { 0x0ffa, 0x331c, 0xc876, 0x5ddd }; 替换您的数组。然后异或会做你想做的事,你可以使用std::hex、std::setw和std::setfill操纵器(或std::printf与%04x格式)以所需的格式打印它们。
  • 我尝试将密钥更改为不同的十六进制值字符串,并且得到完全相同的输出,因此它不是对 ascii 值进行异或运算。
  • @steve 我怀疑是因为你忘了重新编译程序。
猜你喜欢
  • 2010-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-30
  • 2012-08-10
  • 1970-01-01
  • 1970-01-01
  • 2011-03-04
相关资源
最近更新 更多