密码学的主要真理之一是,如果您不是专业人士,则不应在此领域发明任何东西。 这在一定程度上是正确的,因为在信息技术领域,几十年来,所有最好的东西都已被发明,遭受和使用。 事实的另一面是,只有不断涌入新思想和原始解决方案,才能发展某些知识领域。
出于显而易见的原因,我们不会像AES这样的工业密码学巨头陷入困境,而是可以说,我们对二十一点和喜乐的密码学调查有所了解。
部分是因为它很有趣,部分是因为当您对自己的东西进行建模并将其与公认的标准进行比较时,您可以清楚地看到对比度,有效的解决方案和坦率的遗漏,您了解可以为提高效率而做出的努力。
但是已经很水了。
假设我们的Web应用程序是用php编写的,需要可逆加密,并且我们相信我们可以编写自己的密码系统。
因此,我们将编写自己的带有私钥和公钥的可逆加密系统,该系统将具有稍微更安全的加密算法的以下功能:
- 生成的密码中存在噪声字符。
- 发送方目的地的每个通道中的信息都将使用私钥进行加密,并且对应功能对于每个密钥都是唯一的。
- 每条消息将接收一个摘要代码-唯一代码,它是私钥和原始消息的功能。 为了实现对应功能“源字符<=>编码字符”的唯一性,不仅对于“发件人-目的地”通道,而且对于每个单独的消息,这都是必需的。
因此,即使我们想象通过使用密码分析(例如频率分析)使用特定消息匹配已编码字符和原始字符,在检查另一条消息时也不会产生任何偏好。 - 为了使频率分析复杂化,我们将使用两个密码符号对每个源消息符号进行编码。
那么发生了什么。
实际上,您可以在
此处看到最终结果
SymCoder类SymCoder类包含加密和解密方法。
通过code()方法执行加密,该方法在输入处接收原始消息。
在此,在生成的对应表中以tab_coded编码的消息创建了一条加密的消息,该消息被边缘和内部稀释,并带有噪声符号。
顺便说一句,噪声符号对于每个发送方目的地通道都是唯一的,因为它们是使用通道密钥生成的,但不是消息唯一的。 code_symbols中用于加密的字符是一些标点符号和诸如%,@等的字符。
对于每个编码字符,出于显而易见的原因,code_symbols中有两个字符,它们比编码字符少几倍。
create_tab_coded匹配表是通过将消息密钥哈希转换为元素数等于代码字符数组中元素数的数组构建的。 两个字符代码的绕过开始的位置也总是不同的,并且与通道键关联。 这样就可以确保绕过编码字符及其与代码字符的对应关系的算法总是(完全或经常保证)不同。
例如,正在编码的消息“ hello world”如下所示:
Digest-a00bf11d-&?==&!&?.@.@=!=-.?&1.#&?=:.:.1%!&-%@&@%~&1^#=?%%.!%+.?.~=?..&?%&&:%~.#%@&1&1.#=?.#.?.!&1==&=.-=!
这是再次编码相同的消息:
Digest-a00bf11d-=:.?=:&!.?.1&-=:=?.?.=.?.!&=%!=-%@=!%~.=^#.1%%.!%+=:.~.@..==%&&1%~.1%@=?.@.!&=.!&@=:&1.==:=!.1&:
可以看出,同一条消息的摘要是相同的,但是密码变得不同-噪声符号通过任意匹配和随机顺序添加到每个新的加密中。
消息具有冗余性,冗余度随着消息量的增加而降低,达到10%的噪声(对于最短的消息,噪声达到90%或更高的百分比),加密消息的最小长度为116个字符。 这种加密方法的几个缺点之一是编码消息的增加一倍。
解码是对“代码符号”形式的反向翻译,即“原始符号”,其中的噪声已从消息中消除。 关键是什么? 原则上,目标接收方类型的每对唯一的任何字符串。
例如,如果使用消息加密创建一个Messenger,在这种情况下,私钥的最简单版本可以是md5($ user_id_1。$ Salt。$ User_id_2),则该密钥对于每个消息通道都是唯一的。