这个加密/解密算法哪里出了问题
Where is this encryption/decryption algorithm going wrong?
我一直在C++中研究一种基本的字符串加密/解密算法(来源如下:http://pastebin.com/MLnn8D82)
我遇到的问题是它没有正确解密。加密方程式为:
strInput[nPos]=(((strInput[nPos])+(nPos+1))*2);
解密方程式是:
strPassword[nPos]=(((strPassword[nPos])-(nPos+1))/2);
当我尝试只使用加法/减法运算符时,它可以完美地工作。但当我在加密中相乘,在解密中除法时,我会得到一个看似随机的字符串输出。
起初,我认为这可能是因为密码在解密之前被写入文件并从文件中检索,但我尝试直接从主函数输出,最终得到了相同的结果。
字符串的除法/乘法有问题吗?它以前使用C样式(char数组)字符串,但我想这可能有所不同。
感谢您的帮助!
编辑:谢谢你到目前为止的回答。我知道这是不安全的,我不应该使用它;我这么做只是为了练习。
此外,这不是内存问题。我在加密阶段尝试过除法而不是乘法,但我仍然得到一个随机字符串,而不是原始字符串。
很可能您的乘法中有一些字符溢出,这意味着您的除法将永远无法恢复原始值。
顺便说一句,你为什么自己编写加密算法?如果你要把它用于任何真实的事情,而不仅仅是学习,你最好使用一个由密码学专家编写的安全库。像Keyczar这样的东西是个好主意,因为它的设计很难出错(在密码学方面,这很容易以非常微妙的方式做到)。
这个算法有很多问题:
-
这只是对标准Vigenère密码的一个基本更改,众所周知,Vignère加密非常不安全。除了给女朋友写信以外,不要用它做其他学生不应该读的事情。即使是一个有点不错的数学老师也能很容易地破译它。
-
除非你拥有数论或密码学博士学位,否则永远不要试图发明密码算法。即使拥有这些领域的学位,编写一个相当安全的密码算法也是一项非常艰巨的任务。即使你找到了一个算法,也不要试图自己实现它,而是试图找到一个已经可用的实现。你可能会犯很多错误,这可以从各种安全缺陷中看出,这些缺陷是由糟糕的加密算法引起的。
-
您的算法中不支持密码短语。这意味着,任何知道算法的人都可以轻松地解密你的加密数据。通常,加密算法将密码短语作为输入,然后用于解密数据。通过这种方式,算法可以公开,并且只有密码短语必须保密。如果算法是保密的,这被加密社区认为是一个致命的缺陷。
-
您的乘法运算可能会溢出,以防产生比存储在char中的结果更大的结果。在这种情况下,部门将无法检索原始数据。其他人也指出了这一点。
-
操作顺序错误。在加密步骤中,先加后乘。看看结果方程式。求解输入的方程式意味着您还必须更改顺序。在你的情况下,这意味着,你必须先除法,然后减法。然而,在您的代码中,您首先是减法,然后是除法。
这些都是我现在可以告诉你的。这并不是为了阻止你尝试这种东西。我年轻的时候写过很多类似的算法。你只需要非常清楚,他们不会很安全。
这里有两个问题。
其中一个似乎源于字符串和输入/输出流的使用。如果您设置了一个断点并逐步通过它,您会意识到在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)
- 算法问题:查找从堆栈中弹出的所有序列
- 到连接组件算法的问题(递归)
- 读取最后一行代码算法 - c++ 时出现问题
- 需要为 C++ 中的以下问题设计递归算法
- 我的C++语言蛮力算法有问题
- Coursera DSA 算法工具箱第 4 周第 2 个问题 - 分区纪念品
- 排序算法问题(购买商店物品)(崩溃)
- C++ 分而治之的算法问题
- 我对 std::unique(算法)C++有问题
- 对于这个问题,是否有更好的数据结构和算法选择
- 迭代快速排序方法的分区算法问题
- 这种快速排序算法有什么问题?
- 不确定我的排序算法出了什么问题
- 我的算法在 1D 数组中渲染矩形有什么问题
- 带有 std::vector 和 std::queue 的 Prim's 算法,我的代码有什么问题?
- 我的记忆动态规划算法有什么问题?
- 运行Dijkstra算法的问题
- 关于合并两个列表的算法的一些问题
- 函数以相反的顺序输出输入问题,并改进算法以解释相等的数字
- 分类算法和对象指针的问题