【问题标题】:Where is this encryption/decryption algorithm going wrong?这个加密/解密算法哪里出错了?
【发布时间】:2012-02-29 13:48:17
【问题描述】:

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

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

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

而解密方程为:

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

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

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

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

感谢任何帮助!

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

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

【问题讨论】:

  • 如果计算结果的值大于 char 可以容纳的值会怎样?
  • 创建自己的算法而不是使用标准算法已经是错误的了。

标签: c++ algorithm encryption


【解决方案1】:

你的乘法很可能溢出了某些字符,这意味着你的除法将永远无法恢复原来的值。

顺便说一句,您为什么要自己编写加密算法?如果您打算将它用于任何实际的事情,而不仅仅是学习,那么使用由已知安全的密码学专家编写的库会更好。像Keyczar 这样的东西会是一个好主意,因为它被设计成很难出错(在涉及密码学时很容易以非常微妙的方式做到这一点)。

【讨论】:

  • 对不起,我刚刚注意到我在 C++ 方面
【解决方案2】:

这个算法有很多问题:

  1. 这只是对标准Vigenère Cipher 的基本更改,众所周知,它非常不安全。除了给女朋友写信之外,不要将它用于其他学生不应该阅读的信。即使是一个有点体面的数学老师也能很容易地破译它。

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

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

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

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

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

【讨论】:

    【解决方案3】:

    这里有两个问题。

    其中一个似乎源于字符串和输入/输出流的使用。如果您设置断点并逐步执行此操作,您将意识到在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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-09-27
      • 1970-01-01
      • 2013-02-06
      • 1970-01-01
      • 2010-10-12
      • 1970-01-01
      • 2016-08-31
      相关资源
      最近更新 更多