如何互换ED25119键

2021-04-23 20:56:47

在这里向java 15的指针以及转换ED25119公共密钥的Go代码在短文本字符串和关键对象之间转换为验证签名。代码不是很大或复杂,但我花了很多工作和时间弄清楚,并导致令人惊讶的尘土飞扬和古老的途径。发布以帮助需要做到这一点的人,也许可以提供轻度娱乐。

他们称之为现代加密“公钥”;因为钥匙是公开的,人们可以在互联网上发布它们,所以其他人的代码可以使用它们,例如验证签名。

我怎么样,我想知道,你会去做吗?好消息是,在Go和Java 15中,至少有很好的核心库支持,用于执行必要的咒语,无需采取任何外部依赖项。

如果你不关心历史和怪异,那么这里的代码和这里是Java ..

我甚至应该这样做吗? ·“不要写自己的加密!”他们说。而且我从未被诱惑过。但我想知道是否有一种变体形式,说“甚至没有使用专制的加密图书馆和傻瓜与keypairs傻瓜,除非你知道你在做什么!”

因为当我偶然地通过灌木丛中偶然发现了这种东西,通过谷歌和stackoverflow,我没有说服我所关注的道路是正确的。我想知道是否有一个不对称加密的拐子身体,如果我曾经研究过,我会知道我正在尝试的正确方法。并且由于我没有研究过,我应该把这种东西留给那些有的人。我在这里不是讽刺或讽刺,我真的很想知道。

让我们试一试·我正在建造与我的@bluesky身份方案相关的斑点和软件。我希望一个人能够发布一个“零知识证据”,其中包括公钥和签名,所以其他人可以检查签名 - 查看链接了解详情。我开始使用Go编程语言探索,它具有一个很好的通用加密包,然后是不同的钥匙味道的其他套餐,名称像AES和RSA和ED25519一样,即使是像我这样的加密农民才认识来。

ED25519·这是公共关键科技的新ISH热度。它快速且非常安全,并产生小键和签名。它也荣幸地摆脱了必要的旋钮,例如你不必考虑哈希函数。它不是量子安全,但对于这个特定的应用程序,这是一个完整的非问题。我很喜欢它。

无论如何,围绕互联网通常的部分地区展示了一点戳,表明,一个好的小耕作者想要是加密/ ed25519。有一段时间我想知道我是否需要支持其他算法;我们现在推动堆栈上。

Base64和Pem和Asn.1,哦,我! ·我记得这些东西通常在Base64中,用线条包裹,看起来像-----开始公钥---------------------------------------------有点谷歌曲让我想起这是PEM格式,从1985年开始发展为“Privacy-Enhanced Mail”。突然间,我觉得年轻!那么,让我们尊重过去。

Go有一个pem包来处理这些东西,就像你期望的那样。而且,我想知道,我可以在里面找到吗?

摘要语法符号一·每个人都说只是说ASN.1。它甚至比PEM年龄大,从1984年开始约会。我有点与ASN.1的关系,其中“有点关系”我的意思是,在我强烈讨厌它的那一天。它在开源前在时代,这意味着如果您想要处理ASN.1编码的数据,您必须购买昂贵,慢,越野车的解析器,具有敌对的API。我想我不尊重过去。而且我没有利益冲突;当我在烹饪XML的城市时,ASN.1被清楚地被视为问题的一部分。

尽管如此,当你有一个PEM时,你有ASN.1,如果你是一个Gopher,你有一个完美的Sane Asn1包,那就快速且自由。耶!

五哦九·事实证明你无法解析或生成ASN.1而不具有架构。对于公共钥匙(以及用于证书和许多其他东西),模式来自X.509,我猜这是相对现代的,于1988年推出。我对此知之甚少,但已经观察到在安全极客中,讨论X.509(后来在IETF中标准化为PKIX)通常伴随着头部摇动和悲伤的面孔。

关键味道·好的,我已经de-pem-ified的数据,并将结果喂给了Asn.1读者,现在我在我看起来像一个简单而基本的问题:这是什么样的键?也许是因为我想折腾不是ED25519的任何东西。也许是因为我想派遣右加密包。也许是因为我只是想吓坏这一袋比特声称是什么,一个问题互联网应该有一个答案。

女士们,先生们和其他人,当你问互联网“你如何确定这是什么样的公钥?”你上空了。或者至少我做过。最终我偶然发现了符合Bua' Blain Smith的JWTS签署JWTS,我欠了债务谢谢,因为它不认为你知道发生了什么,它只是逐步向你展示如何解压缩ED25519公钥的ASN.1的PEM。

事实证明,您需要做的是挖掘到ASN.1数据中并拔出“对象标识符”。当我的脸增白时,我的脸变白,因为我曾经喜欢自我描述的数据。所以我将“ASN.1对象标识符”键入谷歌,并良好,脱色集合。

我们必须更深入地·我写了一点Go程序,其输入是我发现的随机RSA-key Pem,我发现了来自Blain Smith的博客的Add25519示例。我从每个中提取了对象标识符,发现对象标识符是数字数组;对于RSA密钥,1.2.840.113549.1.1.1,以及椭圆曲线密钥,1.3.101.112。

所以我忘了那些字符串和“1.3.101.112”导致我的rfc8420的附录a,它具有一个很好的简单定义,并注意真正的规范参考是RFC8410,其第3节讨论了这个问题,但实际上并不包括实际字符串由ASN.1编码。

“哦,”我想,“这些价值观必须有一个有用的注册处!”有点是,我发现它通过将字符串值粘贴到谷歌中:非正式但合理地完成的OID存储库。坦率地说,哪个界面看起来不像你想要打赌你的未来。但确实证实1.2.840.113549.1.1.1表示RSA和1.3.101.112意味着ED25119。

所以我想我可以根据这些发现写入代码。但首先,我决定写这个。因为旅程并不完全充满信心。毕竟,公钥加密及其基础设施(通常是缩写“PKI”)是他妈的基础上他妈的互联网安全,这是我的意思是银行和支付和隐私,通常是真理。

我留下了希望在蜘蛛网上用仙女灰尘写的小道,我刚完成以下是最好的做法。

然后我醒来·此时我和一个加密的朋友谈了一下,并问“需要只需要ed25519,铁连的东西是可以进入协议,拒绝考虑其他任何东西?”他们说:“是的,因为首先,这些都是短暂的签名,而第二,如果ED25519失败,它会慢慢失败,有时间迁移到其他时间。”这大大简化了问题。

到目前为止,我明白交换这些东西的传统方式是PKIX指定数据结构的ASN.1序列化的Base64的编码。如果我的初始搜索曾经出现了一个页面,那就太好了。事实证明,有些东西可以做这些事情,并且它们内置于现代编程语言中,因此您不必采取依赖项。

G,遇见J·如此,我所做的是写两个小图书馆,每个图书馆都在go和java中,以在本机Progam对象和base64之间来回翻译公钥,无论是在开始/结束cruft中编码。

首先让我们从程序内的数据对象转到Base64字符串。你这样做:

创建一个结构类型,该结构类型对应于公钥的规范ASN.1结构。

使用填写的1.3.101.112类型指示器创建结构的一个实例,以及提供关键长度和实际公钥字节的字段。 (Go Public-Key类型只是[]字节。)

使用Go Asn1库的rsshal方法将其转换为一串字节,这些字节是结构的ASN.1序列化。 下一个任务是将该文本编码的公钥作为您可以使用的编程语言对象读取它来验证签名。 去: 如果您只有Base64表示,则需要将其包装在开始和结束标记中以使Go的PEM包快乐。 使用PEM包的解码方法将PEM字符转换为PEM.BLOCK STRUCT。 再次,您需要对应于公钥的规范ASN.1结构的结构类型。 使用ASN1 Package的Ummarshal将Block Struct的字节字段转换为ASN.1定义的结构。 解码剩余的Base64以产生一流的字节,这是数据结构的ASN.1序列化。

现在您需要一个ED25519专用的重点实例,其中有一个getInstance方法。 现在,您可以通过将ASN.1序列化字节送到其构造函数来进行新的X509EncodeDkeySpec。 现在,如果将x509送到其生成的方法,则可以生成公钥可以生成公钥。 你完成了! 其他语言? ·它可能是为社区提供服务,为别人抨击Python和Rust和JS以及其他任何其他东西,这将是一件好事,因为公共钥匙是一件好事,ED25519是一件好事。 ED25519在JDK 15中,从字节数组解析公钥并验证。 我觉得这个是一个炎热的烂摊子,但它有很高的谷歌果汁,所以考虑这个指针警告。 我最终没有做任何这些东西。