这个加密/解密算法哪里出了问题

Where is this encryption/decryption algorithm going wrong?

本文关键字:问题 算法 加密 解密      更新时间:2023-10-16

我一直在C++中研究一种基本的字符串加密/解密算法(来源如下:http://pastebin.com/MLnn8D82)

我遇到的问题是它没有正确解密。加密方程式为:

strInput[nPos]=(((strInput[nPos])+(nPos+1))*2);

解密方程式是:

strPassword[nPos]=(((strPassword[nPos])-(nPos+1))/2);

当我尝试只使用加法/减法运算符时,它可以完美地工作。但当我在加密中相乘,在解密中除法时,我会得到一个看似随机的字符串输出。

起初,我认为这可能是因为密码在解密之前被写入文件并从文件中检索,但我尝试直接从主函数输出,最终得到了相同的结果。

字符串的除法/乘法有问题吗?它以前使用C样式(char数组)字符串,但我想这可能有所不同。

感谢您的帮助!

编辑:谢谢你到目前为止的回答。我知道这是不安全的,我不应该使用它;我这么做只是为了练习。

此外,这不是内存问题。我在加密阶段尝试过除法而不是乘法,但我仍然得到一个随机字符串,而不是原始字符串。

很可能您的乘法中有一些字符溢出,这意味着您的除法将永远无法恢复原始值。

顺便说一句,你为什么自己编写加密算法?如果你要把它用于任何真实的事情,而不仅仅是学习,你最好使用一个由密码学专家编写的安全库。像Keyczar这样的东西是个好主意,因为它的设计很难出错(在密码学方面,这很容易以非常微妙的方式做到)。

这个算法有很多问题:

  1. 这只是对标准Vigenère密码的一个基本更改,众所周知,Vignère加密非常不安全。除了给女朋友写信以外,不要用它做其他学生不应该读的事情。即使是一个有点不错的数学老师也能很容易地破译它。

  2. 除非你拥有数论或密码学博士学位,否则永远不要试图发明密码算法。即使拥有这些领域的学位,编写一个相当安全的密码算法也是一项非常艰巨的任务。即使你找到了一个算法,也不要试图自己实现它,而是试图找到一个已经可用的实现。你可能会犯很多错误,这可以从各种安全缺陷中看出,这些缺陷是由糟糕的加密算法引起的。

  3. 您的算法中不支持密码短语。这意味着,任何知道算法的人都可以轻松地解密你的加密数据。通常,加密算法将密码短语作为输入,然后用于解密数据。通过这种方式,算法可以公开,并且只有密码短语必须保密。如果算法是保密的,这被加密社区认为是一个致命的缺陷。

  4. 您的乘法运算可能会溢出,以防产生比存储在char中的结果更大的结果。在这种情况下,部门将无法检索原始数据。其他人也指出了这一点。

  5. 操作顺序错误。在加密步骤中,先加后乘。看看结果方程式。求解输入的方程式意味着您还必须更改顺序。在你的情况下,这意味着,你必须先除法,然后减法。然而,在您的代码中,您首先是减法,然后是除法。

这些都是我现在可以告诉你的。这并不是为了阻止你尝试这种东西。我年轻的时候写过很多类似的算法。你只需要非常清楚,他们不会很安全。

这里有两个问题。

其中一个似乎源于字符串和输入/输出流的使用。如果您设置了一个断点并逐步通过它,您会意识到在fRetrieve函数中,strPassword[nPos]的值可能是负数。你本质上是在把二进制数据读入一个字符串,并试图对它采取行动

您应该做的是将字符串处理到二进制数据缓冲区中。例如char数组。它只存储字节。然后在解密过程中,您将获得纯二进制数据,并可以将其转换为字符串。这将确保在写入/读取文件时数据的完整性。使用字符串和高ASCII值是要求对数据进行错误解释。

第二,是你的解密算法没有正确反转。所以,即使你正确地解密了它,你每次都会被1分。这是一个操作顺序问题。

例如,假设A(65)和nPos为0。加密:

65 + (0+1) = 66 * 2 = 132

然后反转:

132 - (0+1) = 131 / 2 = 65.5

由于它是一个整数数据类型,因此可能会对其进行舍入或截断。正确的反向是

(strPassword[nPos] / 2) - (nPos+1)