use*_*230 17 java encryption cryptography encryption-asymmetric public-key-encryption
我想做一个简单的公钥(非对称)加密.它没有安全感,我只是想了解它们背后的概念.例如,我知道可以使用XOR制作简单的对称密码.我在stackexchange的一个线程中看到你需要使用trapdoor函数,但是我找不到它们.我想说,取一组字节,并能够将它们分开以获得公钥/私钥.我得到了共同秘密的想法.比方说,我生成256的随机数(完全不是随机数:P),我把它分成200和56.如果我用200进行XOR,我只能用200解密.我希望能够分割数字随机的,这样能够不对称地做到这一点.
ole*_*rch 26
好的,只是一个简单的演示想法,基于添加/模运算.
假设我们有一个模数值,对于我们的例子256.这是一个众所周知的共同价值.
假设您在区间[1-255]中生成随机密钥私钥,例如,pri = 133.把密钥放在口袋里.
生成一个公钥,pub = 256 - pri = 123.这个公钥(123)可以分享给全世界.想象一下,第三方不知道如何从公众计算私钥.所以,他们只知道公钥(123).
公众中的某个人想要发送一个加密的ASCII字节.他得到了他的字节,并通过模256运算添加公钥:
encrypted = (input_value + pub) % modulto;
Run Code Online (Sandbox Code Playgroud)例如,我想以加密形式向您发送字母"X",ASCII码= 88.所以,我计算:
(88 + 123) % 256 = 211;
Run Code Online (Sandbox Code Playgroud)
我发送的值为211 - 加密字节.
您使用私钥通过相同的方案解密它:
decrypted = (input_value + pri) % 256 = (211 + 133) % 256 = 88;
Run Code Online (Sandbox Code Playgroud)当然,在这个例子中使用简单的生成对很弱,因为众所周知的公共生成私钥的算法,任何人都可以使用modulo和public轻松恢复私有.但是,在真正的密码学中,这种算法是未知的.但是,从理论上讲,将来可以发现它.
这是纯数学的一个领域,有一本书叫“密码的数学”它很短但很好的介绍。不过,我建议您不要实现自己的,尤其是在 Java 中(您需要一个编译器,该编译器针对涉及的数学类型的真实机器,并相应地进行优化)。您应该在数学或计算机科学堆栈交换中询问此问题。
我确实得到了反对票,所以我想澄清一下。我不是无情,但密码学在数学领域是坚定的,而不是编程(即使它是谨慎的数学,或者 comp-sci 的数学方面)它需要对代数结构有很好的理解,一些统计,这当然是一个迷人的领域,我鼓励你阅读。尽管如此,我的意思是,不要使用您制作的任何东西,“发明”这些密码的人比您或我所知道的忘记的更多,至多完全实施他们所说的。在 Java 中,您应该期望吞吐量非常低。涉及寄存器压力和分配的优化在密码吞吐量方面带来巨大收益。对于初学者来说,Java 是基于堆栈的。
附录(大约 6 年后)
Java 现在在某些方面有所改进(我有一个编译器迷恋,这很奇怪)但是回想起来我是对的但是由于某种错误的原因,Java 更容易通过时间攻击,我已经看到了一些很好的使用例如,依靠跟踪编译技术来确定正在使用的软件版本。对付不会很快消失的 Spectre 也真的很难(我喜欢缓存……我现在说这话很脏)
然而:最重要的是,不要自己做这件事!玩弄它- 它在数学领域非常重要,我必须说它可能最好在纸上完成,除非你喜欢欣赏一个数字遍布的终端。
| 归档时间: |
|
| 查看次数: |
11363 次 |
| 最近记录: |