这种加密/解密算法在哪里出错了?

时间:2012-02-28 20:08:08

标签: c++ algorithm encryption

我一直在用C ++编写基本的字符串加密/解密算法(源代码在这里:http://pastebin.com/MLnn8D82

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

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

解密方程是:

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

当我只使用加法/减法运算符进行尝试时,它完美地运行。但是当我在加密中加倍并在解密中进行除法时,我得到一个看似随机的字符串输出。

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

分割/倍增字符串有问题吗?之前它使用过C-style(char数组)字符串,但我想这可能会有所不同。

感谢任何帮助!

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

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

3 个答案:

答案 0 :(得分:8)

对于某些角色来说,你的乘法很可能会溢出,这意味着你的师将永远无法恢复原作。

另外,为什么要自己编写加密算法?如果您打算将它用于任何真实的东西,而不仅仅是学习,那么使用已知为安全的加密专家编写的库会更好。像Keyczar这样的东西是个好主意,因为它的设计很难出错(在密码学方面非常容易做到非常微妙)。

答案 1 :(得分:1)

此算法存在多种问题:

  1. 这只是标准Vigenère Cipher的一个基本变化,众所周知,它是非常不安全的。不要将它用于给女朋友写信,而其他学生不应该阅读。即使是一位有点像样的数学老师也能轻易解读。

  2. 除非您拥有数论或密码学博士学位,否则不要尝试发明加密算法。即使拥有其中一个领域的学位,编写一个相当安全的加密算法也是一项非常艰巨的任务。即使您找到了算法,也不要尝试自己实现,而是尝试找到已经可用的实现。有很多你可能会出错,正如各种安全漏洞所证明的那样,这些漏洞是由于加密算法实施不当造成的。

  3. 您的算法中没有任何密码短语支持。这意味着,任何了解该算法的人都可以轻松解密您的加密数据。通常,加密算法将密码短语作为输入,然后用于解密数据。这样,算法可以公开,只有密码必须保密。如果算法保密,这被加密社区视为致命缺陷。

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

  5. 操作顺序错误。在加密步骤中,先添加,然后再乘以。看看结果方程式。解决输入的等式意味着您还必须更改顺序。在你的情况下,这意味着,你首先要划分,然后你必须减去。但是,在您的代码中,您首先要减去然后再进行划分。

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

答案 2 :(得分:1)

这里有两个问题。

似乎源于字符串和输入/输出流的使用。如果您设置断点并逐步执行此操作,您会发现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)