zkcrescent 的木屋

在 golang & js 中 的 aes-256-gcm

在 golang & js 中 的 aes-256-gcm

  • 编写时间: 2019-12-12(今天双十二呢-。 -
  • 以下说到的 gcm 均指 aes-256-gcm

来源

最近在做了一个基于 aes-256-gcm 加密算法的Http通信,一开始 server, client 都是用golang写的, 引入同一个pkg,加解密没问题,后来 改用 js 写 client, 用了原生的 crypto pkg 做加解密,OK,问题前述就是这样

中间过程

    const cipher = crypto.createCipheriv('aes-256-gcm', key, iv);

在 js 中, crypto 这个包在生成cipher的时候,传入三个参数,第一个是算法名,第二个是 key, gcm 中使用的是 32 byte, 早期的 aes-128-gcm 使用的是 16 byte, 中间还有个 aes-192-gcm golang 的gcm返回值只有一个[]byte,而js的返回应该是两个,一个是 cipher.Update + cipher.final 的buff(text 加密结果) 以及 gcm 的tag,为了对比 golang 的结果排列顺序,传入同一个 iv, 然后 print 结果的buff, 对比值,知道了 golang 的结果是 iv + encodedText +tag 返回的

  • 中间遇到的一个小问题: golang 的 base64.RawStdEncoding 和 js 的base64 表象不一样, golang base64.StdEncoding = js base64 encode,所以一开始两边完成后加解密出现问题
  • 问题二:在翻看 golang aes 源代码的时候, 发现结果的table是 256 长度的,一度误导了我以为golang 的 gcm 是 aes-256-gcm, 所以陷入了 怎么用 16 byte 的 key 做到 256的 -。 -,这是一个很弱智的问题,其实人家后面都是空位- -不过一开始在没有阅读aes算法的前提下确实让我走了好些弯路试图去理解这个
  • 同时还学到了 golang simbbly 文件, // go: noescape 这个 marker,虽然我不会写汇编和阅读汇编,至少让我了解了更多的关于 golang 的一些东西

相关

思考

中间虽然花费了较大的功夫去阅读元代码,但是让我对aes的了解就比单纯的看看文档理解多了很多,同时也间接的了解了golang中的一些小case, 还是学到了很多东西