mycelial-systems/crypt

GitHub: mycelial-systems/crypt

一个用于生成、编码和管理多种加密密钥的CLI工具及JavaScript库。

Stars: 0 | Forks: 0

# crypt [![测试](https://img.shields.io/github/actions/workflow/status/substrate-system/crypt/nodejs.yml?style=flat-square)](https://github.com/substrate-system/crypt/actions/workflows/nodejs.yml) [![类型](https://img.shields.io/npm/types/@substrate-system/crypt?style=flat-square)](README.md) [![模块](https://img.shields.io/badge/module-ESM%2FCJS-blue?style=flat-square)](README.md) [![语义化版本控制](https://img.shields.io/badge/semver-2.0.0-blue?logo=semver&style=flat-square)](https://semver.org/) [![通用更新日志](https://nichoth.github.io/badge/common-changelog.svg)](./CHANGELOG.md) [![安装大小](https://flat.badgen.net/packagephobia/install/@substrate-system/crypt)](https://packagephobia.com/result?p=@substrate-system/crypt) [![许可证](https://img.shields.io/badge/license-Big_Time-blue?style=flat-square)](LICENSE) 一个用于创建密钥和编码字符串的 CLI 工具及 JavaScript 库。提供命令行接口 (`crypt`) 和 TypeScript API。

目录

- [安装](#install) - [示例](#example) * [生成并编码密钥](#generate-and-encode-keys) * [显示帮助文本](#show-help-text) - [命令](#commands) * [`keys [keyType]`](#keys-keytype) * [`public [privateKey]`](#public-privatekey) * [`sign [message]`](#sign-message) * [`encode [output-format]`](#encode-output-format) * [`decode [input-format]`](#decode-input-format) - [JS API](#js-api) * [安装](#installation) * [导入](#importing) * [`keys(options)`](#keysoptions) * [`derivePublicKey(privateKey, options)`](#derivepublickeyprivatekey-options) * [`sign(message, options)`](#signmessage-options) * [`encode(input, options)`](#encodeinput-options) * [`decode(input, options)`](#decodeinput-options) - [密钥格式](#key-format) * [Multikey](#multikey) * [私钥](#private-keys)
## 安装 全局安装: ``` npm i -g @substrate-system/crypt ``` 或本地安装,并使用 `npx` 运行: ``` npm i -D @substrate-system/crypt npx crypt keys ``` ## 示例 ### 生成并编码密钥 对于 **Ed25519** 密钥,这将打印一个 JSON 字符串到 `stdout`,包含 `{ publicKey, privateKey }`。默认情况下(格式 `raw`): - `publicKey` 采用 Multikey 格式 - `privateKey` 是 base64url 编码的种子 对于 **X25519** 密钥(用于密钥交换/ECDH),输出与 Ed25519 相同: - `publicKey` 是 base64url 编码的 - `privateKey` 是 base64url 编码的种子 对于 **RSA** 密钥,私钥会被写入文件(需要 `-o` 选项),公钥则以 Multikey 格式打印到 `stdout`。 对于 **secp256k1** (`k256`) 密钥,这会打印一个 JSON 字符串到 `stdout`,包含 `{ publicKey, privateKey }`。默认情况下(格式 `raw`): - `publicKey` 采用 Multikey 格式(压缩形式) - `privateKey` 是 base64url 编码的 你可以使用 `-f` 或 `--format` 选项传入不同的输出编码。 ``` # 生成 Ed25519 密钥对(将两个密钥输出到标准输出) npx crypt keys # 生成用于密钥交换的 X25519 密钥对 npx crypt keys x25519 # 生成 RSA 密钥对,将私钥写入文件 npx crypt keys rsa -o private.pem # 生成 JWK 格式的 RSA 密钥对(将两个密钥输出到标准输出) npx crypt keys rsa -f jwk # 生成 secp256k1 (k256) 密钥对 npx crypt keys k256 # 从私钥派生公钥 npx crypt public --type ed25519 --input base64url --format json # 签署消息 npx crypt sign "my document" -k # 从标准输入签署 echo "my document" | npx crypt sign -k # 通过标准输入在编码格式之间转换 echo "Hello World" | npx crypt encode base64 # => SGVsbG8gV29ybGQ echo "SGVsbG8gV29ybGQ" | npx crypt encode utf8 -i base64 # => Hello World echo "SGVsbG8gV29ybGQ" | npx crypt encode hex -i base64 # => 48656c6c6f20576f726c64 ``` ### 显示帮助文本 ``` npx crypt --help # 显示特定命令的帮助 npx crypt keys --help npx crypt encode --help ``` ## 命令 ### `keys [keyType]` 生成一个新的加密密钥对,默认为 `ed25519`。 **Ed25519 密钥**(签名):输出是一个 JSON 字符串 `{ publicKey, privateKey }` 到标准输出(默认 `-f raw`)。公钥采用 Multikey 格式,私钥是 base64url 编码的种子。使用 `-f jwk` 获取 JWK 格式。 如果指定了 `-o`,私钥会被写入文件,只有公钥会被打印到标准输出。 **X25519 密钥**(密钥交换/ECDH):类似 Ed25519,输出 `{ publicKey, privateKey }` 到标准输出。默认 (`-f raw`),两个密钥都是 base64url 编码的。使用 `-f jwk` 获取 JWK 格式。 **RSA 密钥**(签名):需要 `-o` 选项来指定私钥的输出文件(采用 PKCS#8 PEM 格式),除非使用 `-f jwk`,它会以 JSON 形式输出两个密钥到标准输出。 **secp256k1 密钥** (`k256`, 签名):输出是一个 JSON 字符串 `{ publicKey, privateKey }` 到标准输出。默认 (`-f raw`),公钥采用 Multikey 格式(压缩形式,带有 `secp256k1-pub` multicodec 前缀 `0xe7 0x01`),私钥是 base64url 编码的。使用 `-f jwk` 获取 JWK 格式 (`kty: 'EC'`, `crv: 'secp256k1'`)。 #### 参数 * `keyType` - 要使用的密钥类型(默认:`ed25519`) - `ed25519` - Ed25519 椭圆曲线(签名) - `x25519` - X25519 椭圆曲线(密钥交换/ECDH) - `rsa` - RSA-PSS 2048 位(签名) - `k256` - secp256k1 椭圆曲线(签名) #### 选项 * `-f, --format` - 输出格式(默认:`raw`) - `raw` - **(默认)** 对于 Ed25519:公钥采用 Multikey 格式,私钥是 base64url 编码的种子。对于 X25519:公钥采用 Multikey 格式,私钥 base64url 编码。对于 k256:公钥采用 Multikey 格式(压缩形式),私钥 base64url 编码。对于 RSA:需要 `-o` 选项。 - `jwk` - JSON Web Key 格式(输出私钥 JWK,对于 Ed25519 和 X25519,其包含公钥在 `x` 字段中;对于 k256,返回 `{ kty, crv, x, y, d }`) - `did` - 公钥的 DID 格式字符串 (`did:key:...`) * `-o, --output` - 私钥的输出文件 - **RSA 必需**(除非使用 `-f jwk`) - 对于 Ed25519、X25519 和 k256 是可选的(如果指定,私钥将写入文件而不是标准输出) - RSA 私钥以 PKCS#8 PEM 格式写入 - Ed25519、X25519 和 k256 私钥以 base64url 编码的种子(默认)或 JWK 格式(如果使用 `-f jwk`)写入 * `-u, --use` - RSA 密钥的用途(默认:`sign`) - `sign` - **(默认)** 生成用于签名的 RSA-PSS 密钥 - `exchange` - 生成用于加密/密钥交换的 RSA-OAEP 密钥 - **仅适用于 RSA 密钥**;对于 Ed25519、X25519 和 k256 会被忽略 #### `keys` 示例 ``` # 生成 Ed25519 密钥对(默认:原始格式) npx crypt keys # => {"publicKey":"z6Mk...", "privateKey":"mZ5t7zw8D..."} # (公钥是 multikey 格式,私钥是 base64url 编码的种子) # 生成 JWK 格式的 Ed25519 密钥对 npx crypt keys -f jwk # => {"key_ops":["sign"],"ext":true,"crv":"Ed25519","d":"...","x":"...","kty":"OKP","alg":"Ed25519"} # (返回私钥 JWK;公钥位于 'x' 字段中) # 生成 Ed25519 密钥对,将私钥保存到文件 npx crypt keys -o private.txt # => {"publicKey":"z6Mk..."} # (private.txt 包含 base64url 编码的种子) # 生成用于密钥交换的 X25519 密钥对(默认:原始格式) npx crypt keys x25519 # => {"publicKey":"B1UIJS3JEVkjr7uP1E1JWQ...","privateKey":"WCHnh8mcwxZ89Urp_i-F..."} # (两个密钥都是 base64url 编码的) # 生成 JWK 格式的 X25519 密钥对 npx crypt keys x25519 -f jwk # => {"key_ops":["deriveKey","deriveBits"],"ext":true,"crv":"X25519","d":"...","x":"...","kty":"OKP"} # (返回私钥 JWK;公钥位于 'x' 字段中) # 生成 RSA 签名密钥对,将私钥以 PEM 格式保存到文件 npx crypt keys rsa -o private.pem # => {"publicKey":"z5Tc..."} # (private.pem 包含用于 RSA-PSS 的 PKCS#8 PEM 格式) # 生成用于加密的 RSA 密钥对,使用 --use exchange 选项 npx crypt keys rsa -f jwk -u exchange # => {...带私钥的 JWK...} # (返回用于 RSA-OAEP 的私钥 JWK) # 生成 JWK 格式的 RSA 密钥对(默认用于签名) npx crypt keys rsa -f jwk # => {...带私钥的 JWK...} # (返回私钥 JWK;包含公钥组件) # 生成 secp256k1 (k256) 密钥对(默认:原始格式) npx crypt keys k256 # => {"publicKey":"zQ3sh...", "privateKey":"yeUKhUIx9zNIgr8I..."} # (公钥是 multikey 格式,私钥是 base64url 编码的) # 生成 JWK 格式的 k256 密钥对 npx crypt keys k256 -f jwk # => {"kty":"EC","crv":"secp256k1","x":"...","y":"...","d":"..."} # 生成 k256 密钥对,公钥为 did:key 字符串 npx crypt keys k256 -f did # => {"publicKey":"did:key:zQ3sh...","privateKey":"..."} ``` ### `public [privateKey]` 从私钥派生公钥。支持 Ed25519、X25519、RSA 和 secp256k1 (k256) 密钥。 #### 参数 * `privateKey` - 用于派生公钥的私钥(必需) - 对于 Ed25519/X25519/k256:base64url 编码的种子或私钥(32 字节) - 对于 RSA:PEM 格式的 PKCS#8 私钥 #### 选项 * `-t, --type` - **(必需)** 密钥类型 - `ed25519` - Ed25519 椭圆曲线 - `x25519` - X25519 椭圆曲线 - `rsa` - RSA 密钥 - `k256` - secp256k1 椭圆曲线 * `-i, --input` - 私钥的输入格式(默认:`hex`) - `hex` - **(默认)** 十六进制编码 - `base64` - 标准 base64 编码 - `base64url` - Base64url 编码(无填充) * `-f, --format` - 输出格式(默认:`json`) - `json` - **(默认)** 包含 `{ publicKey, keyType }` 的 JSON 对象。`publicKey` 采用 DID 格式编码。 - `hex` - 原始公钥字节的十六进制编码 - `did` - DID 格式字符串(base58btc 编码,加 `'did:key:'` 前缀) - `base64url` - 原始公钥字节的 Base64url 编码 - `base64` - 原始公钥字节的标准 base64 编码 #### `public` 示例 ``` # 首先生成一个密钥对 npx crypt keys # => {"publicKey":"z6Mk...","privateKey":"PAjfFB2OvkWOGpO9iLqMujY8YucqHriHEtcdo4GhQDM"} # 从私钥派生公钥(JSON 输出) npx crypt public PAjfFB2OvkWOGpO9iLqMujY8YucqHriHEtcdo4GhQDM --type ed25519 --input base64url --format json # => {"publicKey":"z6MkoUHWDKfrsX2vpLaTTsMdLgCDFMzt4EJdZeTXQjbSPnsZ","keyType":"ed25519"} # 以十六进制输出派生公钥 npx crypt public PAjfFB2OvkWOGpO9iLqMujY8YucqHriHEtcdo4GhQDM --type ed25519 --input base64url --format hex # => 85fc69b01232c576f559bb7a58bc445d27f1d4ee81c8abc62365e9cd97520e08 # 派生 k256 (secp256k1) 公钥 npx crypt keys k256 # => {"publicKey":"z6Du...","privateKey":"QsNnw8ZPGa4trwZeGBD7a_3gvfHI_32JCfFM1sfWZrA"} npx crypt public QsNnw8ZPGa4trwZeGBD7a_3gvfHI_32JCfFM1sfWZrA --type k256 --input base64url --format json # => {"publicKey":"z6Du2tMh3uXpN2ECugDAERcEuKmohcq6DqPkWakmsP9Wx3Ey","keyType":"k256"} # 派生 X25519 公钥 npx crypt keys x25519 # => {"publicKey":"jlWUipLpjNR_eDr7H_dBkLgtKQiY1zKMGMtC0bxyR0Q","privateKey":"kPF-xy_ZdTqUqRH6bLOXktRUDDCLUuI8gqMl-zNXG1o"} npx crypt public kPF-xy_ZdTqUqRH6bLOXktRUDDCLUuI8gqMl-zNXG1o --type x25519 --input base64url --format base64url # => jlWUipLpjNR_eDr7H_dBkLgtKQiY1zKMGMtC0bxyR0Q ``` ### `sign [message]` 使用 Ed25519 私钥对消息进行签名。消息可以作为位置参数提供,或从标准输入读取。 #### 参数 * `message` - 要签名的消息(如果使用标准输入则为可选) - 如果省略,消息将从标准输入读取 - 如果作为参数提供,则优先于标准输入 #### 选项 * `-k, --key` - **(必需)** 私钥种子(base64url 编码) - 由 `crypt keys` 以 raw 格式输出的私钥种子 - 这是 Ed25519 JWK 中的 'd' 字段 #### `sign` 示例 ``` # 首先生成一个密钥对 npx crypt keys # => {"publicKey":"z6Mk...","privateKey":"k7s0h9nK5oqRd4ip..."} # 使用位置参数签署消息 npx crypt sign "my signed document" -k k7s0h9nK5oqRd4ip_K8ow2RXZ4p3B5Mp3hguz7G9CMI # => jLYPhT1LAckU3WrcXlAPf4eaklfk8qTDyBf1otgqmr7Fx-YATTrZrLrlHYvNyl0EU5SF6URiKJtkyjeRGNe9AA # 从标准输入签署消息 echo "my signed document" | npx crypt sign -k k7s0h9nK5oqRd4ip_K8ow2RXZ4p3B5Mp3hguz7G9CMI # => jLYPhT1LAckU3WrcXlAPf4eaklfk8qTDyBf1otgqmr7Fx-YATTrZrLrlHYvNyl0EU5SF6URiKJtkyjeRGNe9AA # 签署文件 cat document.txt | npx crypt sign -k k7s0h9nK5oqRd4ip_K8ow2RXZ4p3B5Mp3hguz7G9CMI # 完整工作流程:生成密钥并签署 PRIVATE_KEY=$(npx crypt keys | jq -r .privateKey) echo "important message" | npx crypt sign -k $PRIVATE_KEY ``` 签名以 base64url 编码的字符串输出(Ed25519 签名是 64 字节,编码为 86 个字符)。 ### `encode [output-format]` #### 参数 * `output-format` - 期望的输出格式(默认:`base58btc`) - `base58btc`, `base64`, `hex`, `base64url`, `utf8`, `ascii` #### 选项 * `-i, --input-format` - 输入字符串的格式(默认:`utf8`) - `base64`, `hex`, `base64url`, `base58btc`, `utf8`, `ascii` #### `encode` 示例 ``` # 将 UTF-8 文本编码为 base58btc(默认) echo "Hello World" | npx crypt encode # 将 UTF-8 编码为 base64 echo "Hello World" | npx crypt encode base64 # 将 base64 转换为十六进制 echo "SGVsbG8gV29ybGQ=" | npx crypt encode hex -i base64 # 将十六进制转换为 base58btc echo "48656c6c6f" | npx crypt encode base58btc -i hex # 将 base64 转换为 utf8 echo "SGVsbG8gV29ybGQ=" | npx crypt encode utf8 -i base64 # => Hello World # 在命令之间通过管道传递(公钥是 multikey 格式) npx crypt keys | jq -r .publicKey | npx crypt encode hex -i multi # 将 "multikey" 格式转换为十六进制格式 echo "z6MkiLr..." | npx crypt encode hex -i multi ``` ### `decode [input-format]` #### 参数 * `input-format` - 输入字符串的格式(默认:`base64`) - `base64`, `base64pad`, `hex`, `base64url`, `base58btc`, `ascii` #### `decode` 示例 ``` # 将 base64 解码为 UTF-8(默认) echo "SGVsbG8gV29ybGQ=" | npx crypt decode # 将 base64pad 解码为 UTF-8 echo "SGVsbG8gV29ybGQ=" | npx crypt decode base64pad # => 'Hello World' # 将十六进制解码为 UTF-8 echo "48656c6c6f20576f726c64" | npx crypt decode hex # 将 base58btc 解码为 UTF-8 echo "JxF12TrwUP45BMd" | npx crypt decode base58btc ``` ## JS API 此包也暴露了一个 JavaScript API。 ### 安装 ``` npm i -S @substrate-system/crypt ``` ### 导入 ``` import { keys, derivePublicKey, sign, encode, decode } from '@substrate-system/crypt' // Or import everything import * as crypt from '@substrate-system/crypt' ``` ### `keys(options)` 生成一个新的加密密钥对。 ``` async function keys (args:{ keyType?:'ed25519'|'x25519'|'rsa'|'k256', format?:'raw'|'jwk'|'did', use?:'sign'|'exchange' } = {}):Promise<{ publicKey:string|object, privateKey?:string|object, privateKeyPem?:string }> ``` #### 参数 - `options` (对象, 可选): * `keyType` (`'ed25519' | 'x25519' | 'rsa' | 'k256'`; 默认: `ed25519`). `k256` 是 secp256k1。 * `format` (`'raw' | 'jwk' | 'did'`, 默认: `'raw'`) - 输出格式。`did` 返回公钥为 `did:key:...` 字符串。 * `use` (`'sign' | 'exchange'`, 默认: `'sign'`) - RSA 密钥的用途 - `'sign'` - 生成用于签名的 RSA-PSS 密钥 - `'exchange'` - 生成用于加密/密钥交换的 RSA-OAEP 密钥 - 对于 Ed25519、X25519 和 k256 密钥会被忽略 #### 返回值 - 对于 `raw` 格式的 Ed25519/X25519/k256:`{ publicKey: string, privateKey: string }` - 对于 `raw` 格式的 RSA:`{ publicKey: string, privateKeyPem: string }` - 对于 `jwk` 格式:直接返回 JWK 对象(对于 k256,这是 `{ kty: 'EC', crv: 'secp256k1', x, y, d }`) - 对于 `did` 格式:`publicKey` 是一个 `did:key:...` 字符串 **示例:** ``` import { keys } from '@substrate-system/crypt' // Generate Ed25519 keypair (default) const keypair = await keys() console.log(keypair.publicKey) // z6Mk... (multikey format) console.log(keypair.privateKey) // base64url-encoded seed // Generate X25519 keypair const x25519Keys = await keys({ keyType: 'x25519' }) // Generate RSA signing keypair in JWK format const rsaJwk = await keys({ keyType: 'rsa', format: 'jwk' }) // Generate RSA encryption keypair const rsaEncryptJwk = await keys({ keyType: 'rsa', format: 'jwk', use: 'exchange' }) // Generate secp256k1 keypair (raw) const k256Keys = await keys({ keyType: 'k256' }) // Generate secp256k1 keypair in JWK format const k256Jwk = await keys({ keyType: 'k256', format: 'jwk' }) ``` ### `derivePublicKey(privateKey, options)` ``` async function derivePublicKey ( privateKeyInput:string, opts:{ keyType:'ed25519'|'x25519'|'rsa'|'k256', inputFormat?:'hex'|'base64'|'base64url', outputFormat?:'json'|'hex'|'base64url'|'base64' } ):Promise ``` 从私钥派生公钥。支持 Ed25519、X25519、RSA 和 secp256k1 (k256) 密钥。 #### 参数 - `privateKeyInput` (字符串) - 用于派生的私钥 * 对于 Ed25519/X25519/k256:base64url 编码的种子或私钥(32 字节) * 对于 RSA:PEM 格式的 PKCS#8 私钥字符串 - `opts` (对象): * `keyType` (`'ed25519'|'x25519'|'rsa'|'k256'`, 必需) - 密钥类型 * `inputFormat` (`'hex'|'base64'|'base64url'`, 默认: `'hex'`) - 私钥输入的格式 * `outputFormat` (`'json'|'hex'|'base64url'|'base64'`, 默认: `'json'`) - 输出格式 #### 返回值 - 对于 `json` 格式:`{ publicKey: string, keyType: string }` * `publicKey` 对于 Ed25519/RSA/k256 是 Multikey 格式,对于 X25519 是 base64url 格式 - 对于 `hex`、`base64url` 或 `base64` 格式:以请求的编码返回原始公钥字节 **示例:** ``` import { keys, derivePublicKey } from '@substrate-system/crypt' // Generate an Ed25519 keypair const keypair = await keys() console.log(keypair.privateKey) // PAjfFB2OvkWOGpO9iLqMujY8YucqHriHEtcdo4GhQDM // Derive the public key from the private key const result = await derivePublicKey(keypair.privateKey, { keyType: 'ed25519', inputFormat: 'base64url', outputFormat: 'json' }) console.log(result.publicKey) // z6MkoUHWDKfrsX2vpLaTTsMdLgCDFMzt4EJdZeTXQjbSPnsZ console.log(result.keyType) // ed25519 // Get raw hex output const hexPublicKey = await derivePublicKey(keypair.privateKey, { keyType: 'ed25519', inputFormat: 'base64url', outputFormat: 'hex' }) console.log(hexPublicKey) // 85fc69b01232c576f559bb7a58bc445d27f1d4ee81c8abc62365e9cd97520e08 // Derive k256 (secp256k1) public key const k256Keys = await keys({ keyType: 'k256' }) const k256Public = await derivePublicKey(k256Keys.privateKey, { keyType: 'k256', inputFormat: 'base64url', outputFormat: 'json' }) console.log(k256Public.publicKey) // z6Du... (multikey format) // Derive X25519 public key const x25519Keys = await keys({ keyType: 'x25519' }) const x25519Public = await derivePublicKey(x25519Keys.privateKey, { keyType: 'x25519', inputFormat: 'base64url', outputFormat: 'base64url' }) console.log(x25519Public) // Base64url-encoded public key ``` ### `sign(message, options)` ``` async function sign ( message:string, options:{ key:string } ):Promise ``` 使用私钥对消息进行签名。支持 Ed25519 和 RSA 密钥。 #### 参数 - `message` (字符串) - 要签名的消息 - `options` (对象): * `key` (字符串, 必需) - 以下格式之一的私钥: - **Ed25519**: base64url 编码的种子 - **RSA**: PEM 编码的私钥 (PKCS#8 格式) #### 返回 Base64url 编码的签名。 #### 示例 ``` import { keys, sign } from '@substrate-system/crypt' // Sign with Ed25519 key const ed25519Keypair = await keys() const ed25519Sig = await sign('Hello World', { key: ed25519Keypair.privateKey }) console.log(ed25519Sig) // Base64url-encoded signature // Sign with RSA key const rsaKeypair = await keys({ keyType: 'rsa' }) const rsaSig = await sign('Hello World', { key: rsaKeypair.privateKeyPem }) console.log(rsaSig) // Base64url-encoded signature ``` ### `encode(input, options)` 将字符串从一种编码格式转换为另一种。 ``` async function encode ( input:string, options:{ inputFormat?:u.SupportedEncodings|'multi', outputFormat:u.SupportedEncodings|'multi', useMultibase?:boolean, keyType?:'ed25519'|'rsa' } ):Promise ``` #### 参数 - `input` (字符串) - 要编码的输入字符串 - `options` (对象): * `inputFormat` (`u.SupportedEncodings|'multi'`, 默认: `'utf8'`) * `outputFormat` (`u.SupportedEncodings|'multi'`, 必需) - 输出格式 * `useMultibase` (布尔值, 默认: `false`) - 添加 multibase 前缀 * `keyType` (`'ed25519'|'rsa'`, 可选) - 如果输出是 `'multi'` 则必需 支持的编码: `'base64'`, `'hex'`, `'base64url'`, `'base58btc'`, `'utf8'`, `'ascii'`, `'multi'` #### 返回 编码后的字符串 #### 示例 ``` import { encode } from '@substrate-system/crypt' // Encode UTF-8 to base64 const encoded = await encode('Hello World', { inputFormat: 'utf8', outputFormat: 'base64' }) // Convert hex to multikey format const multikey = await encode('1234...', { inputFormat: 'hex', outputFormat: 'multi', keyType: 'ed25519' }) ``` ### `decode(input, options)` 将字符串从给定格式解码为 UTF-8。 ``` async function decode ( input:string, options:{ inputFormat:u.SupportedEncodings } ):Promise ``` #### 参数 - `input` (字符串) - 要解码的输入字符串 - `options` (对象): * `inputFormat` (`u.SupportedEncodings`, 必需) - 输入格式 #### 返回 解码后的 UTF-8 字符串 #### 示例 ``` import { decode } from '@substrate-system/crypt' const decoded = await decode('SGVsbG8gV29ybGQ=', { inputFormat: 'base64' }) console.log(decoded) // 'Hello World' ``` ## 密钥格式 ### Multikey 这使用 [Multikey 格式](https://www.w3.org/TR/cid-1.0/#Multikey) 字符串。 [Multikey 格式](https://www.w3.org/TR/cid-1.0/#Multikey) 是一种通用的、自描述的、基于 [multicodec](https://www.w3.org/TR/cid-1.0/#multibase-0) 的公钥编码。 ``` import { base58btc } from 'multiformats/bases/base58' import * as varint from "multiformats/src/varint" // Suppose you have a raw public-key Buffer/Uint8Array const rawKeyBytes = /* ... */ // --- helper: varint-encoded multicodec prefix for ed25519-pub --- // multicodec code for ed25519-pub is 0xED (237). // varint encoding for 237 is two bytes: 0xED 0x01 const ED25519_MULTICODEC_VARINT = Uint8Array.from([0xed, 0x01]) const out = new Uint8Array(ED25519_MULTICODEC_VARINT.length + rawPubKey.length) out.set(ED25519_MULTICODEC_VARINT, 0) out.set(rawKeyBytes, ED25519_MULTICODEC_VARINT.length) // base58btc (multibase) encode // multiformats' base58btc.encode typically returns a string that already // uses the 'z' let encoded = base58btc.encode(out) encoded = encoded.startsWith('z') ? encoded : 'z' + encoded // This yields something like "z6Mk…", same style as in the DID doc console.log(encoded) /** * Decode a Multikey multibase string (ed25519-pub) back to raw key bytes. * Returns an object { algCode, rawKey } where algCode is the multicodec * numeric code. */ function decodeMultikey (multibaseStr):{ } { // Accept with/without leading 'z' — multiformats will accept // without the explicit 'z' only if decoder used directly. const cleaned = (multibaseStr.startsWith('z') ? multibaseStr : 'z' + multibaseStr) const decoded = base58btc.decode(cleaned) // returns Uint8Array // read varint (we know ed25519 varint is two bytes: 0xed 0x01) // robust approach: parse varint; here we handle single or two-byte // varints for small values let i = 0 let code = 0 let shift = 0 while (i < decoded.length) { const b = decoded[i++] code |= (b & 0x7f) << shift if ((b & 0x80) === 0) break shift += 7 } const rawKey = decoded.slice(i) // remainder is the raw key bytes return { multicodec: code, rawKey } } ``` ### 私钥 私钥要么是 32 字节的“原始”字符串,要么是 JWK 编码,或者是 RSA 的 PEM 格式。
标签:API, CJS模块, CMS安全, ESM模块, GNU通用公共许可证, JavaScript, meg, MITM代理, Node.js, TypeScript, 信息安全, 公钥派生, 创建密钥, 加密工具, 安全插件, 密码学, 库, 应急响应, 手动系统调用, 数据加密, 数据可视化, 文档结构分析, 暗色界面, 编码字符串, 自动化攻击, 解码字符串