dajiaji/crystals-kyber-js

GitHub: dajiaji/crystals-kyber-js

一个纯 TypeScript 编写的 ML-KEM(NIST FIPS 203)后量子密钥封装实现,支持多种 JavaScript 运行时。

Stars: 54 | Forks: 10

mlkem / crystals-kyber-js

JSR NPM Browser CI Node.js CI Deno CI Cloudflare Workers CI bun CI codecov
一个使用 TypeScript 编写的 ML-KEM (NIST FIPS 203) 和 CRYSTALS-KYBER 实现。

[main 文档](https://dajiaji.github.io/crystals-kyber-js/docs/main/)
本模块基于 [ntontutoveanu/crystals-kyber-javascript](https://github.com/antontutoveanu/crystals-kyber-javascript) ,但包含以下改进: - ✅ 使用 TypeScript 编写。 - ✅ 支持多种 JavaScript 运行时:Browsers、Node.js、Deno、 Cloudflare Workers 等。 - ✅ 支持确定性密钥生成。 - ✅ 密文的恒定时间验证。 - ✅ 更好的性能:比原始 实现快 1.4 到 1.8 倍。 - ✅ 不依赖其他库。 - ✅ 支持 Tree-shaking。 - ✅ 修复 [KyberSlash](https://kyberslash.cr.yp.to/index.html) 漏洞。 - ✅ 支持 ML-KEM ([NIST FIPS 203](https://csrc.nist.gov/pubs/fips/203/final))。 - ✅ 通过了以下发布的所有测试: - [post-quantum-cryptography/KAT/MLKEM](https://github.com/post-quantum-cryptography/KAT/tree/main/MLKEM) - [C2SP/CCTV/ML-KEM](https://github.com/C2SP/CCTV/tree/main/ML-KEM) - [pq-crystals/kyber](https://github.com/C2SP/CCTV/tree/main/ML-KEM) (10000 次连续测试) 本代码库包含以下包: | package | registry | description | | ----------------- | ------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | crystals-kyber-js | [![npm](https://img.shields.io/npm/v/crystals-kyber-js?color=%23EE3214)](https://www.npmjs.com/package/crystals-kyber-js) | `v1.x` 实现 CRYSTALS-KYBER,`v2.x-` 实现 ML-KEM (NIST FIPS 203)。`crystals-kyber-js` 可能会在不久的将来被弃用。相反,我们建议切换到以下 `mlkem` 或 `@dajiaji/mlkem`。 | | mlkem | [![npm](https://img.shields.io/npm/v/mlkem?color=%23EE3214)](https://www.npmjs.com/package/mlkem) | 仅实现 ML-KEM (NIST FIPS 203)。从 `v2` 版本开始,它是上述 `crystals-kyber-js` 的别名。我们建议今后使用此包。 | | @dajiaji/mlkem | [![JSR](https://jsr.io/badges/@dajiaji/mlkem)](https://jsr.io/@dajiaji/mlkem) | 仅实现 ML-KEM (NIST FIPS 203)。它是 [jsr.io](https://jsr.io/) 的 ML-KEM 包。上述 `mlkem` 是 `@dajiaji/mlkem` 的 npm 包,已使用 [@deno/dnt](https://github.com/denoland/dnt) 转换。 | 对于 Node.js,你可以通过 npm、yarn 或 pnpm 安装 `mlkem` 或 `crystals-kyber-js`: ``` # 推荐使用 `mlkem` npm install mlkem # `crystals-kyber-js` 仍可使用,但可能在不久后被弃用。 npm install crystals-kyber-js ``` 然后,你可以按如下方式使用它: ``` import { MlKem768 } from "mlkem"; // or from "crystals-kyber-js" async function doMlKem() { // A recipient generates a key pair. const recipient = new MlKem768(); // MlKem512 and MlKem1024 are also available. const [pkR, skR] = await recipient.generateKeyPair(); //// Deterministic key generation is also supported // const seed = new Uint8Array(64); // globalThis.crypto.getRandomValues(seed); // node >= 19 // const [pkR, skR] = await recipient.deriveKeyPair(seed); // A sender generates a ciphertext and a shared secret with pkR. const sender = new MlKem768(); const [ct, ssS] = await sender.encap(pkR); // The recipient decapsulates the ciphertext and generates the same shared secret with skR. const ssR = await recipient.decap(ct, skR); // ssS === ssR return; } try { doMlKem(); } catch (err: unknown) { console.log("failed:", (err as Error).message); } ``` ## 目录 - [安装](#installation) - [Node.js](#nodejs) - [Deno](#deno) - [Cloudflare Workers](#cloudflare-workers) - [Bun](#bun) - [Web 浏览器](#web-browsers) - [用法](#usage) - [贡献](#contributing) ## 安装 ### Node.js ``` # 使用 npm: npm install mlkem # or crystals-kyber-js yarn add mlkem # or crystals-kyber-js pnpm install mlkem # or crystals-kyber-js # 使用 jsr: npx jsr add @dajiaji/mlkem yarn dlx jsr add @dajiaji/mlkem pnpm dlx jsr add @dajiaji/mlkem ``` ### Deno 从 2.0.0 版本开始,`@dajiaji/mlkem` 可在 [jsr.io](https://jsr.io) 上获取。从该版本起,请在 Deno 中使用 JSR 导入 代替 HTTPS 导入。 **JSR 导入 (`>=2.0.0`):** 使用以下命令添加 `@dajiaji/mlkem` 包: ``` deno add @dajiaji/mlkem ``` 然后,你可以像这样在代码中使用该模块: ``` import { MlKem1024, MlKem512, MlKem768 } from "@dajiaji/mlkem"; ``` **HTTPS 导入 (已弃用):** ``` import { Kyber1024, Kyber512, Kyber768, } from "https://deno.land/x/crystals_kyber@/mod.ts"; ``` ### Cloudflare Workers ``` # 使用 npm: npm install mlkem # or crystals-kyber-js yarn add mlkem # or crystals-kyber-js pnpm install mlkem # or crystals-kyber-js # 使用 jsr: npx jsr add @dajiaji/mlkem yarn dlx jsr add @dajiaji/mlkem pnpm dlx jsr add @dajiaji/mlkem ``` ``` import { MlKem1024, MlKem512, MlKem768 } from "@dajiaji/mlkem"; ``` ### Bun ``` # 使用 npm: npm install mlkem # or crystals-kyber-js yarn add mlkem # or crystals-kyber-js pnpm install mlkem # or crystals-kyber-js # 使用 jsr: bunx jsr add @dajiaji/bhttp ``` ``` import { MlKem1024, MlKem512, MlKem768 } from "@dajiaji/mlkem"; ``` ### Web 浏览器 以下是如何在典型的 CDN 中使用此模块的方法。也可以使用其他 CDN。 ``` ``` ## 用法 本节展示一些典型的用法示例。 ### Node.js ``` import { MlKem768 } from "mlkem"; // const { MlKem768 } = require("mlkem"); async function doMlKem() { const recipient = new MlKem768(); const [pkR, skR] = await recipient.generateKeyPair(); const sender = new MlKem768(); const [ct, ssS] = await sender.encap(pkR); const ssR = await recipient.decap(ct, skR); // ssS === ssR return; } try { doMlKem(); } catch (err) { console.log("failed: ", err.message); } ``` ### Deno, Cloudflare Workers 和 Bun ``` import { MlKem512 } from "@dajiaji/mlkem"; async function doMlKem() { const recipient = new MlKem512(); const [pkR, skR] = await recipient.generateKeyPair(); const sender = new MlKem512(); const [ct, ssS] = await sender.encap(pkR); const ssR = await recipient.decap(ct, skR); // ssS === ssR return; } try { doMlKem(); } catch (err: unknown) { console.log("failed:", (err as Error).message); } ``` ### 浏览器 ``` ``` ## 贡献 我们欢迎所有形式的贡献,包括提交 issue、建议新功能或 发送 PR。
标签:Bun, Cilium, CMS安全, CRYSTALS-Kyber, Deno, GNU通用公共许可证, JavaScript, JSR, KEM, KyberSlash, MITM代理, ML-KEM, NIST FIPS 203, Node.js, NPM, PQC, TypeScript, Web Cryptography, 加密算法, 后量子密码学, 安全插件, 密钥封装机制, 恒定时间编程, 抗量子计算, 数据可视化, 格密码学, 浏览器, 程序员工具, 网络安全, 自动化攻击, 自动化攻击, 自动化攻击, 隐私保护, 零依赖