编辑:已解决。 zvbra似乎是正确的。只给4个字符加密就会导致问题。要知道为什么会这样,因为我被告知getline丢弃了最后一个角色......
伙计堆垛机你好。
我想首先说我试图自己调试并解决我的问题但是(可能是由于我对装配知识不足以及几乎所有的事情)我没有这样做。 所以我来到这里是希望你能帮助我:)。
我决定编写一个简单的(我认为)加密程序,更多的是测试而不是其他任何东西。
它分为两部分:
Alghorithm.h(是的,我知道它拼错了。)其中包含“Crypter”类
#include <iostream>
#include <cmath>
using namespace std;
class Crypter
{
private:
char Crypt[4];
public:
Crypter()
{
getCrypt:
cout<<"\nEnter a 4 character password: ";
cin.getline(Crypt,5);
if (cin.fail())
{
cout<<"\n\nError while reading password. 4 CHARACTERS MAXIMUM.\n\n";
cin.sync(); cin.clear();
goto getCrypt;
}
}
void Encrypt(string& data)
{
for (int i=0; i<data.size();i++)
{
int offset=i;
if (offset>5)
{
while (offset>5)
{
offset-=6;
}
}
float base = 2.0f;
int testbit=pow(base,offset);//gets bit to test. Ex: if offset= 1 (2^1=2=binary 10) test bit is the 2nd least significant bit
if (data[i]!=(data[i]^testbit)) //if testbit is 1 (tested using xOR)
{
data[i]= data[i]^Crypt[2]; //-> encrypt using xOR Crypt[2]
testbit=pow(base,offset+2);
if(data[i]!=data[i]^testbit)// then if testbit is 1 (tested using xOR)
{
data[i]=(data[i]^Crypt[0])+Crypt[3]; //-> encrypt using xOR Crypt[0] then adding crypt[3]
}
else
{
data[i]=(data[i]^Crypt[1])+Crypt[1];//-> encrypt using xOR Crypt[1] then adding crypt[1]
}
}
else
{
data[i]=((data[i]^Crypt[3])^Crypt[0])+Crypt[2];//-> encrypt using xOR Crypt[1] then xOR Crypt[0] and finally adding crypt[1]
}
}
return;
}
};
和main.cpp
#include "Alghorithm.h"
int main()
{
string data="This sentence is going to be encrypted";
Crypter Crypter;
cout<<"\nEncrypting...";
Crypter.Encrypt(data);
cout<<"\n\nEncryption Successful\n\nEncrypted string: "<<data<<endl;
cin.sync(); cin.clear();
}
现在,编程专家必须考虑我的算法是多么笨拙 并且大多数部分甚至对加密算法都没有意义(这是可能的) 但假装它是一个很好的算法,完全有道理。
这是问题所在:
它编译。它运行。它加密句子并打印加密的 版。但是在程序结束之前(在截图中你可以看到我忘了 在main中返回一个值,但是我已经解决了这个问题并且问题没有改变一点)一条消息弹出 up(在编译器中运行时)在调试模式下[检查屏幕截图]和3在发布模式下;
他们中的大多数都警告说,由于Crypter'变量'周围的堆栈损坏而导致错误。
我甚至没有被认为是一位经验丰富的程序员,所以我来到这里寻求你的帮助。
由于错误只在程序结束时弹出,这是否意味着清理有问题?
我完全迷失在这里。任何回复都表示赞赏。
注意:我还包括te调试器提供的部分汇编代码(相关部分); 希望它有一些用处(检查我对错误的'位置'的asm代码的内联注释);
随意批评我糟糕的代码:)(似乎有问题,因为生成的加密字符串从调试到发布模式不同?:/?。
-João
屏幕:
在我按ENTER(调试)之前程序的样子:http://i44.tinypic.com/3ert2.png
在按ENTER(发布)之前程序的样子 http://i42.tinypic.com/2nld45f.png
按ENTER(调试)后显示错误 http://i41.tinypic.com/bhltoy.png
按ENTER(释放)后显示第1个错误 http://i42.tinypic.com/28lchac.png
按下ENTER(释放)后显示第二个错误 http://i40.tinypic.com/2h3ttmw.png
按ENTER(释放)后显示第3错误 http://i41.tinypic.com/2lc5suw.png
由debbuger提供的ASM代码 http://pastebin.com/TTXUn0T2
答案 0 :(得分:2)
至少有一个错误:您需要为Crypt
变量保留5个字符:您需要额外的空格来终止字符串。