【问题标题】:Encrpyt/Decrpyt program using functions c++使用函数c ++加密/解密程序
【发布时间】:2017-03-30 04:29:55
【问题描述】:

你好,这里的业余爱好者,过去两个月一直在学习 c++。我对函数的理解并不那么敏锐,对于 c++ 中的一些运算符(如 xor)更是如此。我正在编写一个程序,它将从用户那里获取一个字符串,使用 ^ 运算符对其进行加密,然后对其进行解密。我想我已经打下了基础,但我得到了一些奇怪的输出,我认为这与我的 for 循环有关,或者可能与我对 XOR 的使用有关。我的程序如下,任何帮助将不胜感激。

#include <iostream>
#include <string>
#include <cmath>
using namespace std;

const short SIZE = 132;
class deer
{

public:
char inputdata();
char encryptdata(char inputbuffer[SIZE], char encryptbuffer[SIZE]);
char inputbuffer[SIZE];
char encryptbuffer[SIZE];
char decryptbuffer[SIZE];
char decrpytdata(char n[], char p[]);
long e;
long count;


};

int main()
{
deer obj;
obj.inputdata();
obj.encryptdata(obj.inputbuffer, obj.encryptbuffer);
obj.decrpytdata(obj.encryptbuffer, obj.decryptbuffer);

system("pause");
return 0;
}

char deer::inputdata()
{
cout << "please enter your text to be encrpyted" << endl;
cin.getline(inputbuffer, SIZE);
cin.gcount();
count =cin.gcount();
count--;
cout << inputbuffer << endl;
return 0;


}

char deer::encryptdata(char inputbuffer[], char encryptbuffer[])
{
short key = 0xAC;
int i = 0;
for (int i = 0; i <= count; i++) {

    inputbuffer[i] = encryptbuffer[i] ^= key;
    cout << encryptbuffer << endl;

}
return *encryptbuffer;


}

char deer::decrpytdata(char encryptbuffer[], char decryptbuffer[])
{
int i = 0;
for (int i = 0; i <= count; i++) {

    encryptbuffer[i] ^= decryptbuffer[i];

}
cout << decryptbuffer << endl;

return decryptbuffer;
}

【问题讨论】:

  • 往下看,这行不应该是decryptbuffer[i] ^= encryptbuffer[i];吗?在 C 和 C++ 中,约定是将第一个参数作为结果,为了防止此类错误,您应该将输入数组声明为const,即char const encryptbuffer[]
  • 好的,我会修正我的格式。我没有提到我不允许在这个程序中使用任何全局变量或常量,保存第一个 SIZE 常量。感谢您的意见!

标签: c++ xor


【解决方案1】:

使用 XOR 的加密和解密需要相同的密钥(代码中说 0xAC)。 encryptbuffer 是通过对inputbuffer 与密钥进行异或运算生成的,decryptbuffer 是通过对encryptbuffer 与密钥进行异或运算生成的。因此,key需要是deer的成员。

由于inputbufferencryptbufferdecryptbuffer是鹿类的成员,所以在调用成员函数enctyptdatadecryptdata时不需要将它们作为参数。

加密函数:

char deer::encryptdata()
{
    for (int i=0; i&lt;count; ++i)
    {
        encryptbuffer[i] = inputbuffer[i] ^ key;
    }
    cout &lt;&lt; encryptbuffer &lt;&lt; endl;
}

解密函数:

char deer::decryptdata()
{
    for (int i=0; i&lt;count; ++i)
    {
        decryptbuffer[i] = encryptbuffer[i] ^ key;
    }
    cout &lt;&lt; decryptbuffer &lt;&lt; endl;
}

鹿类:

class deer
{
    static const char key = 0xAC;
    ...
};

【讨论】:

  • 嘿伙计!这是很大的帮助,我仍然得到一些疯狂的输出,例如当我输入我的字符串时,让我们说“你好,有一个美好的一天”,它用一堆奇怪的图标淹没了我的屏幕。不确定这是有意的,因为我认为它只会加密它从字符串中读取的位数。无论如何,非常感谢您抽出宝贵时间提供帮助,这无疑将我推向了正确的方向!
  • encryptbuffer 中奇怪图标的显示是合理的,因为异或字符的值可能不是字母数字。验证加密/解密的方法是检查encryptdata 的输出。如果decryptbuffer 的值等于inputbuffer,那么方法是可以的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-22
相关资源
最近更新 更多