【问题标题】:XOR encrypting of a float-array in cc中浮点数组的异或加密
【发布时间】:2016-09-06 14:21:00
【问题描述】:

我想加密一个浮点型数组并使用相同的函数再次对其进行解码。我在网上阅读了几个主题,但我找不到让我开心的解决方案。 我尝试将浮点类型指针转换为 char* 并使用我的 char 类型键对结果进行异或。 这是我的编码功能:

const char* key = "mykey";
int keylen = sizeof(key) / sizeof(key[0]);

void encodeData(float *data, int size)
{
    int bytes = (int)(sizeof(float)/sizeof(char));

    for(int i=0; i<size; i++)
    {
        for(int j=0; j<bytes; j++)
        {
            data[i] = *(((char *)&data[i]) + j) ^ (key[(bytes*i)%keylen]);
        }
    }
}

编译工作,但编码和解码后我没有得到相同的结果。我做错了什么?

【问题讨论】:

  • 当你在指针上使用sizeof 时,你得到的是指针的大小,而不是它所指向的大小。要么使用strlen 获取字符串的长度,要么将key 设为一个数组。
  • 作业的左侧是错误的。而不是data[i] = 应该是*(((char *)&amp;data[i]) + j) =
  • 另外,sizeof(char) 由 C 标准规范定义为始终为 1。
  • 另外,key[(bytes*i)%keylen] 可能不是你想要的。
  • 最后,如果您使用指向char 的临时指针,例如char *tmp = (char *) data;,您只需要一个 类型转换。然后您可以使用tmp 代替循环中的指针算术和强制转换。并且只有一个循环。

标签: c encryption floating-point bit-manipulation xor


【解决方案1】:

固定:

void encodeData(float *data, int size) 
{ 
     int bytes = (int)(sizeof(float)/sizeof(char)); 
     char *tmp = (char *) data; 
     for(int i=0; i<bytes*size; i++) 
     { 
         *(tmp+i) = *(tmp+i) ^ key[i%keylen]; 
     } 
     data = (float*) tmp; 
 }

【讨论】:

  • 不要将回复作为答案发布。您可以更新问题正文,将其标记为更新。
  • 提示:float* 的转换应该在调用者中完成。这将使您的函数可以处理任何事情。
  • data = (float*) tmp; 毫无用处。建议放弃。 /sizeof(char) 也没什么价值。
  • 1) 使用unsigned char 比使用char 更便携。 2) size_t 是对象大小和数组索引的最佳类型。不过float 没有太大问题。
  • 不清楚为什么代码使用带有*(tmp+i) 的指针添加以及在同一行中使用[] 和key[i%keylen]。考虑tmp[i] ^= key[i%keylen];
猜你喜欢
  • 2020-08-12
  • 1970-01-01
  • 1970-01-01
  • 2021-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多