mycelial-systems/crypt
GitHub: mycelial-systems/crypt
一个用于生成、编码和管理多种加密密钥的CLI工具及JavaScript库。
Stars: 0 | Forks: 0
# crypt
[](https://github.com/substrate-system/crypt/actions/workflows/nodejs.yml)
[](README.md)
[](README.md)
[](https://semver.org/)
[](./CHANGELOG.md)
[](https://packagephobia.com/result?p=@substrate-system/crypt)
[](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 格式。
目录
- [安装](#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)
标签:API, CJS模块, CMS安全, ESM模块, GNU通用公共许可证, JavaScript, meg, MITM代理, Node.js, TypeScript, 信息安全, 公钥派生, 创建密钥, 加密工具, 安全插件, 密码学, 库, 应急响应, 手动系统调用, 数据加密, 数据可视化, 文档结构分析, 暗色界面, 编码字符串, 自动化攻击, 解码字符串