Web Crypto Api学习笔记 | Mayx的博客

21 November 2019 - 字数统计：1468 - 阅读大约需要5分钟 - Hits: Loading...

# Web Crypto Api学习笔记

by mayx

这是一篇创建于 天前的文章，其中的信息可能已经有所发展或是发生改变。

AI摘要

这篇文章是作者在学习Web Crypto API时的笔记，讲述了自己在制作分布式加密邮件系统的过程中遇到的挑战，特别是对JavaScript（特别是其对象系统和ArrayBuffer/Uint8Array等概念）的不适应。作者提到Javascript语法与自己习惯的Linux Shell语言对比存在差异，导致在处理Web Crypto API时感到困惑，尤其是其复杂的参数要求如密码长度和初始向量。通过Copy&Paste的方式，作者勉强完成了一个加密消息的示例代码，同时表达了继续学习的决心。整个过程中，作者流露出对学习过程的艰辛和对未来的期待。

- 学习前
- 学习过程
- 辣鸡代码
- 感想

感觉要爆炸了……

#
学习前

在四个月前，我作了制作分布式加密邮件系统的计划，不过现在来看，这怕是得变成五年计划了……

Javascript是真的垃圾，搞一堆对象，各种各样的对象让人无言以对，不过也可能因为我以前用的是Linux Shell语言，那个语言在我学了Python之后还是感觉很舒服，因为它不用管变量类型，Bash之类的解析器会把它们一律看作字符串，遇到要运算的部分才会转换为数字。除此之外，它连接字符串是什么都不用加，不需要考虑变量是什么类型，只要解析器能分辨变量，它就能正常工作，也不需要什么强制转换之类乱七八糟的东西，而且它更没有什么乱七八糟的对象之类的概念。 （跑题了:-P）

不过浏览器只支持Javascript语言……没办法，看来只能动用我的Copy&Paste大法了。不过国内用Web Crypto Api的人好少，找了半天也没有什么示例可以Copy……没办法，那我只好去抄官方示例了……

#
学习过程

我在大学中也加了那么一个社团/协会，在社团办公室里虽然没人能帮助我学习Javascript，不过那里有多余的屏幕！然后我就体验了一下双屏幕工作的感觉，那个感觉还是挺不错的（也可能是我的屏幕分辨率太低了，是1366x768的垃圾屏幕……）一个屏幕打代码，另一个看网页效果，还是挺不错的，至少不用不停的切换窗口了。

看着示例代码，我感觉真是要爆炸了，各种奇葩的对象，像什么ArrayBuffer还是什么Uint8Array啥的，还有一堆乱七八糟要求的格式，密码长度还必须是16的倍数？而且还有什么初始向量iv……真的是一言难尽……

不过我还是发挥了作为辣鸡程序员的特长——Copy&Paste大法，最终可算是拼凑出了一个看起来勉强能用的代码……

#
辣鸡代码

    function getByteLen(val) {
        var len = 0;
        for (var i = 0; i < val.length; i++) {
            if (val[i].match(/[^\x00-\xff]/ig) != null) len += 3;
            else len += 1;
        }
        return len;
    }
      function importSecretKey(rawKey) {
        return window.crypto.subtle.importKey(
          "raw",
          rawKey,
          "AES-GCM",
          true,
          ["encrypt", "decrypt"]
        );
      }
      async function encryptMessage(key) {
    	iv = window.crypto.getRandomValues(new Uint8Array(12));
        ciphertext = await window.crypto.subtle.encrypt(
          {
            name: "AES-GCM",
            iv: iv
          },
          key,
          encoded
        );

    console.log(ciphertext)
      }
        let secretKey;
    const enc = new TextEncoder();
    keyword="Mayx"
        while (getByteLen(keyword) % 16 != 0) {
            keyword = keyword + "\0";
        }
    const rawKey = enc.encode(keyword);

    const encoded = enc.encode("Mayx is Good");
    (async () => {
        secretKey = await importSecretKey(rawKey);
    	encryptMessage(secretKey);
    })();

#
感想

路漫漫其修远兮，吾将上下而求索，我还是要继续加油啊！

tags: 学习笔记 - Web Crypto Api 查看原始文件

#### 推荐文章

Loading...

上一篇：Bug Forever！
下一篇：废人的研究
想问这篇文章
召唤伊斯特瓦尔