我的解密在哪里出错了

时间:2015-12-06 21:56:21

标签: c++ visual-c++ encryption

我正在尝试解密.bin文件,我不知道回答这个问题的关键是我们在课堂上给出的:  8)假设您不知道您在6)中使用的“密钥”的值。你还可以解密加密文件吗?如果是这样写一个程序,将执行此操作。 (没有标记,这只是为了好玩!) Proof

int main(int argc, char* argv[]) {                               
uint8_t c, key = 0, uintOutput = 0;
string Encrypted, everything[255];
char b, charOutput;
int x = 0;
while ((b = getchar()) != EOF) {
    Encrypted = Encrypted + b;                  //read in chars from file and add them to a string (still encrypted)
}

我尝试了几种方法,我真的认为这种方法可行。

for (int i = 0; i < Encrypted.length(); i++) //for the length of the encrypted string
        {
            x = 0;                              //resets the string it is entering into; Array position 0
            for (key = 0; key < 255; key++)     //key used must be a lowercase letter
            {

                c = (uint8_t)Encrypted[x];                      //convert char 'x' of encrypted string to a byte
                uintOutput = (c ^ key);                         //XOR with current key guess
                charOutput = (char)uintOutput;                  //convert byte back to char again
                everything[x] = everything[x] + charOutput;     //add xor'd char to currently selected string
                x++;                                            //move to next array position; to next string
            }

        }

其中一切都是字符串数组 - 一切[255],key是表示加密/解密密钥的字节。

            for (int y = 0; y < (255* Encrypted.length()); y++)     //print out for number of possibilities
        {
            cout << everything[y] << endl << endl;
        }

return 0;

} 要运行该程序,我使用带文件重定向的.bat文件,在我的情况下,bat文件包含:program.exe < EncryptedText.bin >> ciphertext.bin 其中EncryptedText.bin是使用未知密钥加密的文件,ciphertext.bin是输出解密文本的位置。

程序构建正常,文件重定向很好,因为我已经将它用于另一个程序,该程序猜到了只有一个字符的密钥 - 而不是无限制的长度。

我遇到的主要问题是运行.bat文件时弹出的错误消息

  

Debug Assertion失败!

     

程序:C:WINDOWS \ SYSTEM32 \ MSVCP140D.ddl

     

文件i:\ microsoft visual studio \ vc \ include \ xstring

     

行:1681

     

表达式:字符串下标超出范围

     

...(在这里重试等)

我真的很感激任何有关这方面的见解,我只是看不出我出错的地方而且我已经把这个问题弄乱了好几个小时

2 个答案:

答案 0 :(得分:0)

看起来真的像这样:

for (int y = 0; y < (255* Encrypted.length()); y++)

索引超出everything[255]

答案 1 :(得分:0)

这是你出错的地方(只有相关的代码行):

for (int i = 0; i < Encrypted.length(); i++)
{
       x = 0;
       for (key = 0; key < 255; key++)
       {
                c = (uint8_t)Encrypted[x];

                // Some code here that's not relevant

                x++;
       }
}

由于显而易见,您的代码将尝试通过Encrypted[0]访问Encrypted[254],因此,除非您的Encrypted字符串长度为254个字符,否则会导致未定义的行为。