我想做一个简单的公钥(非对称)加密。它并不是必须是安全的,我只是想理解它们背后的概念。例如,我知道简单的对称密码可以用XOR实现。我在stackexchange上的一个线程中看到,你需要使用trapdoor函数,但我找不到太多关于它们的信息。我想说,取一组字节,并能够以某种方式将它们拆分,以获得公钥/私钥。我得到了共享秘密的想法。比方说,我生成随机数256(根本不是随机的:P),然后把它分成200和56。如果我用200做XOR运算,我只能用200来解密。我希望能够随机拆分数字,这样就能够不对称地进行拆分。
发布于 2013-09-26 08:55:54
好的,这只是一个简单的演示,基于加法/模运算。
假设我们有一个模数值,在我们的例子中是256。
encrypted = (input_value + pub) % modulto;
例如,我想以加密的形式向您发送字母"X",ASCII码= 88。所以,我计算:
(88 + 123) % 256 = 211;已解密= (input_value + pri) % 256 = (211 + 133) % 256 = 88;
当然,在这个例子中使用简单的生成对是很弱的,因为众所周知的从公钥生成私钥的算法,并且任何人都可以使用模和公钥轻松地恢复私钥。但是,在真正的密码学中,这种算法是未知的。但是,从理论上讲,它可以在未来被发现。
发布于 2013-09-26 08:38:40
这是一个纯数学的领域,有一本书叫“密码的数学”,它很简短,但却是一个很好的介绍。我建议你不要实现你自己的,特别是在Java中(你想要一个编译器,针对涉及到的那种数学问题针对真实的机器,并进行相应的优化)。你应该在数学或计算机科学堆栈交换上询问这一点。
我确实得到了反对票,所以我想澄清一下。我不是冷酷无情,但cyphers是坚定的数学领域,而不是编程(即使它是谨慎的数学,或comp-sci的数学方面)它需要对代数结构的良好理解,一些统计,这当然是一个迷人的领域,我鼓励你阅读。我的意思是,不要使用你制造的任何东西,“发明”这些密码的人已经忘记了比你或我知道的更多,最多实现他们所说的话。在Java中,顺便说一句,你应该预料到吞吐量会非常低。涉及寄存器压力和分配的优化在cypher吞吐量方面带来了巨大的红利。对于初学者来说,Java是基于堆栈的。
附录(约6年后)
Java现在已经在某些方面有所改进(我有一个编译器狂热,这是适当的怪异)然而,回过头来看我是对的,但由于某种错误的原因,Java更容易通过计时来攻击,我已经看到了依靠跟踪编译技术来找出正在使用的软件版本的一些很好的用法。它也真的很难处理幽灵,它不会很快消失(我喜欢缓存...现在我觉得这么说很下流)
然而,:最重要的是,不要自己这么做!使用它至多-它非常属于数学领域,我必须说它可能更好地在纸上完成,除非你喜欢欣赏一个到处都是数字的终端。
发布于 2013-09-26 08:39:34
http://en.wikipedia.org/wiki/RSA_(algorithm)
是(整个)互联网所基于的标准
https://stackoverflow.com/questions/19017419
复制相似问题