【问题标题】:Simple encryption and decryption of a txt document一个txt文档的简单加解密
【发布时间】:2012-01-25 12:10:05
【问题描述】:

我正在制作一个应用程序,它编写一个包含 3 个字符串的小 txt 文件,然后将它们加载回应用程序中的列表小部件中。

这一切都很好,但现在我想使它的 txt 文件不是纯文本。我不需要任何复杂的密码或任何需要密钥来加密和解密的东西。我只是希望能够在保存时对其进行加密(保存不是纯文本的文档)并在将其加载回丢失的小部件之前对其进行解密。

以下是我用于写入和读取 txt 文件的代码。我只是想修改它,所以它不是纯文本,我不在乎它不安全,只是不是纯文本

QFile m_file("mytext.txt");
m_file.open(QFile::WriteOnly | QFile::Append);
QTextStream m_stream(&m_file);
m_stream << ui->txt_1->text() + "    " + ui->txt_2->text() + "    " + ui->txt_3->text()                         <<;
m_file.close(); 




QFile n_file("mytext.txt");
n_file.open(QFile::ReadOnly);
QTextStream n_stream(&n_file);
int i=0;
while (!n_stream.atEnd())
{
    ui->listWidget->addItem(n_stream.readLine());
    i++;
}

【问题讨论】:

  • 如果你想要的只是最低限度,你总是可以在保存时对所有字节进行异或,然后在重新加载数据时再次对它们进行异或。这会阻止那些认为打开记事本中的文件是“黑客”,当然任何对密码学有所了解的人都会很快弄清楚。
  • @JeremyFriesner 用什么异或字节?
  • 感谢我在不同论坛上看到的评论,但我不知道该怎么做
  • @erickson:如果你对它们进行异或运算,你就有了一个很好的自我保护的变量密码。
  • @erickson:一些任意数字,而不是零。最好小于 32,这样所有可打印的字符都可以打印。

标签: c++ qt encryption text-files


【解决方案1】:

我知道你不想听到这个,但加密是你不想自己做的事情。最简单的方法就是为此使用一个好的库,例如 Crypto++

如果你真的觉得有必要自己做点什么,Vignère cipher 是一个非常简单的算法,编码也非常简单。

【讨论】:

  • @user 有什么意义?如果您不想要安全性,请保持原样。你为什么要假装保护它?
【解决方案2】:

也许?

void cyptStr(char *str){
    if(!str){
        return;
    }
    char *end = str + (strlen(str) - 1);
    for(;str < end;str++){
        if (*str != ' ')
            *str ^= 1;
    }
}
void ucyptStr(char *str){
    if(!str){
        return;
    }
    char *end = str + (strlen(str) - 1);
    for(;str < end;str++){
        if (*str != ' ')
            *str ^= 1;
    }
}

【讨论】:

  • 这将从字符串中删除任何! 字符。你最好实际异或 - 将两个循环体更改为*str ^= 1(或其他值)。
  • 这不是异或。它看起来像 ROT1。
  • @MikeSeymour:我自己偏爱 XOR 0x42
  • 这样更好,但它仍然只是将字符向上或向下旋转一个。使用不同的常量,它可以保留字符的可打印性,但有点难以弄清楚。
【解决方案3】:

我从您的问题和 cmets 假设,您不希望任何外部库来完成这个简单的任务。 以下是替代方案:

1- 使用自己的加密/解密功能。那么,简单来说,写的时候调用encrypt函数,读的时候调用decrypt函数。 这是用于此目的的可用代码。 (与 enc/dec 相同的函数,有点 hacky)

string encryptDecrypt(string toEncrypt) {
    char key[3] = {'K', 'C', 'Q'}; //Any chars will work, in an array of any size
    string output = toEncrypt;

    for (int i = 0; i < toEncrypt.size(); i++)
        output[i] = toEncrypt[i] ^ key[i % (sizeof(key) / sizeof(char))];

    return output;
}

int main(int argc, const char * argv[])
{
    string encrypted = encryptDecrypt("kylewbanks.com");
    cout << "Encrypted:" << encrypted << "\n";

    string decrypted = encryptDecrypt(encrypted);
    cout << "Decrypted:" << decrypted << "\n";

    return 0;
}

2- 为了绝对安全和更标准的代码使用密码算法。使用密码算法的最佳方法是选择最先进的加密库,例如 Crypto++Qt Cryptographic Architecture (QCA)

选择是你的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-01
    • 2014-06-28
    • 2017-12-20
    • 1970-01-01
    • 2020-01-31
    相关资源
    最近更新 更多