Что я делаю, чтобы вызвать непоследовательный вывод из этой программы? - PullRequest
0 голосов
/ 21 декабря 2011

Итак, я создал простую программу шифрования xor, которая запрашивает строку пароля и использует ее для заполнения ISAAC

Затем он запрашивает зашифрованную строку и отправляет ее через ISAAC. По некоторым причинам это приводит к непоследовательным результатам для тех же двух строк. Это проблема с моим кодом или вывод на консоль? Я делаю что-то, чтобы сделать это очевидно очевидным? Вот мой код, я использую класс шаблона, предоставленный на сайте ISAAC:

#include <iostream>
#include <cstdlib>
using std::malloc;
using std::free;
#include "isaac.hpp"
#include <time.h>
#include <cmath>
#include <string>
#include <sstream>

using namespace std;

QTIsaac<8,int> derp;



char trand(){
    int rando=0;
    rando=derp.rand();
    rando=abs(rando);
    rando=rando%256;
    char re=rando;
    return re;
}

int main()
{
    cout << "What is your password string?\n";
    string get;
    getline(cin,get);
    int length=get.size();
    int seedWithMe[length];
    for(int i=0;i<length;i++){
        seedWithMe[i]=(int)get[i];
    }
    derp.srand(1,1,1,seedWithMe);
    cout << "What is your string to be encrypted? \n";
    getline(cin,get);
    length=get.size();
    char table[length];
    char table3[length];
    for(int i=0;i<length;i++){
        table[i]=trand();
    }
    for(int i=0;i<length;i++){
        table3[i]=(char)table[i]^(char)get[i];
    }

    cout << table3 << "\n";



    return 0;
}

Редактировать: неважно, все это только я был глупым

Итак, я попытался исправить то, что дал мне Дэвид Шварц, но потом, когда я попытался хэшируйте пароль, он снова работает. Функция, которую я использую для хэш входная строка:

string shaOfPass(string digestThis){
  string digest;
  CryptoPP::SHA256 hash;
 CryptoPP::StringSource foo(digestThis, true,
   new CryptoPP::HashFilter(hash,
      new CryptoPP::HexEncoder (
         new CryptoPP::StringSink(digest))));
  return digest;
} And this code results in inconstant output:
cout << "What is your password string?\n";
  string get;
  getline(cin,get);
  string hashOfPass=shaOfPass(get);
  int seedWithMe[256];
  for(int i=0;i<256;i++){
      seedWithMe[i]=(int)get[i%256];
  }

1 Ответ

1 голос
/ 21 декабря 2011

Функция srand, когда ей передается указатель, требует, чтобы указатель содержал как минимум 2 ^ N байтов данных (вы установили N на 8).Таким образом, вы заполняете некоторые случайные, ненужные данные, когда длина вашей строки меньше 256 символов.

Вот исправление:

int length=get.size();
char seedWithMe[256];
for(int i=0;i<256;i++){
    seedWithMe[i]=get[i%length];
}
derp.srand(1,1,1,seedWithMe);
...