【问题标题】:What am I doing to cause inconsistent output from this program?我在做什么导致该程序的输出不一致?
【发布时间】:2011-12-20 21:28:41
【问题描述】:

所以我做了一个基本的异或加密程序,它要求输入密码字符串并用它来播种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;
}

编辑:没关系,所有这些只是我愚蠢

所以我尝试了 David Schwartz 给我的修复方法,但是当我尝试 哈希密码,它再次退出工作。我正在使用的功能 哈希输入字符串是:

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];
  }

【问题讨论】:

  • 这个程序是非法的 C++。您不能在 length 不是常量的情况下声明 char table[length]
  • 乍一看,问题是table 的值在每次运行时都会不同,因此您的输出将是不确定的。
  • @Alexandre C.: gcc 允许它(但你是对的,它不是标准的一部分)。
  • 模板类在哪里?我已经搜索了该站点,但找不到您正在使用的实际代码。

标签: c++ encryption bit-manipulation xor bitwise-xor


【解决方案1】:

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);

【讨论】:

  • 所以,如果我先用 sha256 对其进行哈希处理,就可以了? (crypto++ 实现在输出中留下原始字符串,未格式化为任何基数)我假设您找到了模板类。
  • 不完全。 SHA256 产生 256 个。您需要 256 个字节。如果需要,您可以对其进行 SHA256 哈希 8 次,在哈希之间稍作修改。 (例如,您可以对其进行散列,在其末尾附加一个“.”,再次对其进行散列,等等。)如果这是一个真正的加密应用程序,我建议您使用为此目的设计的算法,例如作为 RC4,它具有已知的安全密钥算法。 (或者至少是一个弱点被充分研究过的人。)
  • 啊,看错了。我假设它将每个字母计为一个字节,我可以将不同类型哈希的结果连接起来。
  • 另外,感谢您的修复,这是我永远不会得到的东西
猜你喜欢
  • 1970-01-01
  • 2021-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-11
  • 2016-08-24
相关资源
最近更新 更多