我想做一个简单的公钥(非对称)加密。它没有安全性,我只想了解它们背后的概念。例如,我知道简单的对称密码可以用 XOR 生成。我在 stackexchange 上的一个线程中看到您需要使用陷门函数,但我找不到太多关于它们的信息。我想说,取一组字节,并能够以某种方式拆分它们以获得公钥/私钥。我得到了一个共享秘密的想法。说,我生成了 256 的随机数(根本不是随机数:P),然后我将它分成 200 和 56。如果我用 200 进行 XOR,我只能用 200 解密。我希望能够拆分数字随机等能够不对称地做到这一点。
3 回答
好的,只是一个简单的演示想法,基于加法/模运算。
假设我们有一个模值,例如 256。这是一个众所周知的通用值。
假设您在区间 [1-255] 内生成一个随机秘密私钥,例如 pri=133。把秘钥放在口袋里。
生成一个公钥,pub = 256 - pri = 123。这个公钥(123)可以分享给全世界。想象一下,第 3 方不知道如何从公共计算私钥。所以,他们只知道公钥(123)。
公众中的某个人想向您发送一个加密的 ASCII 字节。他得到他的字节,并通过模 256 运算将公钥添加到它:
encrypted = (input_value + pub) % modulto;
例如,我想以加密形式向您发送字母“X”,ASCII 码 = 88。所以,我计算:
(88 + 123) % 256 = 211;
我正在向您发送值 211 - 加密字节。
您使用您的私钥通过相同的方案解密它:
decrypted = (input_value + pri) % 256 = (211 + 133) % 256 = 88;
当然,在这个例子中使用简单的生成对是弱的,因为众所周知的从公钥生成私钥的算法,任何人都可以使用模数和公钥轻松恢复私钥。但是,在真正的密码学中,这种算法是未知的。但是,理论上,它可以在未来被发现。
这是一个纯数学领域,有一本书叫《密码学的数学》,很短,但是很好的介绍。不过,我确实建议您不要实现自己的,尤其是在 Java 中(您需要一个针对所涉及数学类型的真实机器的编译器,并相应地进行优化)。你应该在数学或计算机科学堆栈交换中询问这个问题。
我确实得到了反对票,所以我想澄清一下。我不是无情的,但密码坚定地属于数学领域,而不是编程(即使它是谨慎的数学,或 comp-sci 的数学方面)它需要对代数结构、一些统计数据有很好的理解,这肯定是迷人的领域,我鼓励你阅读。我的意思是上面的意思,不要使用你做的任何东西,“发明”这些密码的人忘记的比你或我知道的要多,最多只能实现他们所说的。在 Java 中,你应该期待一个非常糟糕的吞吐量顺便说一句。涉及注册压力和分配的优化为密码吞吐量带来了巨大的收益。对于初学者来说,Java 是基于堆栈的。
附录(大约 6 年后)
Java 现在在某些方面有所改进(我有一个编译器迷恋,这很奇怪)但是回想起来我是对的,但是由于某种错误的原因,Java 更容易通过时间攻击,我已经看到了一些很好的使用例如,依靠跟踪编译技术来确定正在使用的软件版本。处理不会很快消失的 Spectre 也非常困难(我喜欢缓存......我现在这么说很脏)
但是:最重要的是,不要自己这样做!最多玩弄它 - 它在数学领域非常重要,我必须说它可能最好在纸上完成,除非你喜欢欣赏一个满是数字的终端。
http://en.wikipedia.org/wiki/RSA_(算法)
是(整个)互联网所基于的标准