如何制作一个简单的公钥加密算法?[已关闭]

我想做一个简单的公钥(非对称)加密。它没有安全感,我只是想了解它们背后的概念。例如,我知道简单的对称密码可以用XOR制作。我在stackexchange上的一个线程中看到你需要使用陷阱门函数,但我找不到太多关于它们的信息。我想说的是,取一组字节,并能够以某种方式拆分它们以获得公钥/私钥。我得到了一个共同的秘密的想法。比方说,我生成随机数256(:P根本不随机),并将其分为200和56。如果我用200做一个XOR,我只能用200解密。我希望能够随机拆分数字,以便能够不对称地做到这一点。


答案 1

好的,只是一个简单的演示想法,基于加法/模运算。

  1. 假设我们有一个模值,对于我们的例子256。这是一个众所周知的通用值。

  2. 假设您在区间 [1-255] 中生成一个随机的秘密私钥,例如 pri=133。将密钥放在口袋里。

  3. 生成一个公钥,pub = 256 - pri = 123。这个公钥(123)你可以分享给全世界。想象一下,第三方不知道如何从公钥计算私钥。因此,他们只知道公钥(123)。

  4. 来自公众的某人想要向您发送加密的ASCII字节。他获取他的字节,并通过模256运算将公钥添加到其中:

    encrypted = (input_value + pub) % modulto;
    

例如,我想以加密形式向您发送字母“X”,ASCII代码= 88。所以,我计算:

(88 + 123) % 256 = 211;
  1. 我向您发送值211 - 加密字节。

  2. 您可以使用私钥通过相同的方案对其进行解密:

    decrypted = (input_value + pri) % 256 = (211 + 133) % 256 = 88;
    

当然,在这个例子中使用简单的生成对是很弱的,因为众所周知的从公钥生成私钥的算法,任何人都可以使用模和公共轻松恢复私有。但是,在真正的密码学中,这种算法是未知的。但是,从理论上讲,它可以在未来被发现。


答案 2

这是纯数学的一个领域,有一本书叫“密码的数学”,它很短,但很好的介绍。不过,我建议你远离实现自己的编译器,特别是在Java中(你想要一个编译器,它针对所涉及的数学类型,并相应地进行优化)。您应该在数学或计算机科学堆栈交换中询问此问题。

我确实得到了反对票,所以我想澄清一下。我不是无情的,但密码学牢牢地处于数学领域,而不是编程(即使它是谨慎的数学,或者comp-sci的数学方面),它需要对代数结构有很好的理解,一些统计学,这当然是一个迷人的领域,我鼓励你阅读。我的意思是上面,不要使用你做的任何东西,“发明”这些密码的人已经忘记了比你或我所知道的更多,实现他们最多所说的。在Java中,你应该期望一个非常差的吞吐量顺便说一句。涉及寄存器压力和分配的优化在密码吞吐量方面带来了巨大的回报。对于初学者来说,Java是基于堆栈的。


附录(约6年)

Java现在在某些领域已经有所改善(我有一个编译器的癖好,这很奇怪),但是回头看我是对的,但是由于各种错误的原因,Java更容易通过计时来攻击,我已经看到了依靠跟踪编译技术来计算出正在使用的软件版本。处理Spectre也非常困难,它不会很快消失(我喜欢缓存....我现在觉得这么说很脏)

但是:最重要的是,不要自己这样做!最多玩具 - 它非常在数学领域,我必须说它可能最好在纸上完成,除非你喜欢欣赏一个上面到处都是数字的终端。


推荐