blinsa-ts:盲人和部分盲文RSA签名协议的文本库
规格 : 图书馆符合 RFC-9474 (法语) 页:1 部分失明的RSA 签字草案02,并匹配所提供的 测试向量, (中文(简体) ), 调和。 。 。 .
盲人RSA 签名协议
RSA 盲签协议是客户端和服务器之间的一个两方协议,它们在那里交互计算
sig = Sign(sk, input_msg)
地点 input_msg = Prepare(msg) 是私有信件的已准备版本 msg 由客户提供 sk 是服务器提供的私人签名密钥.
Client(pk, msg) Server(sk, pk)
-----------------------------------------------------
input_msg = Prepare(msg)
blinded_msg, inv = Blind(pk, input_msg)
blinded_msg
---------->
blind_sig = BlindSign(sk, blinded_msg)
blind_sig
<----------
sig = Finalize(pk, input_msg, blind_sig, inv)
部分- Blind RSA 签名协议
以上协议的一个可能的概括是部分-Blind签名,其中另一个 info 可以提供字符串,允许共享公共元数据.
Client(pk, msg, info) Server(sk, pk, info)
-------------------------------------------------------
input_msg = Prepare(msg)
blind_msg, inv = Blind(pk, input_msg, info)
blind_msg
---------->
blind_sig = BlindSign(sk, blind_msg, info)
blind_sig
<----------
sig = Finalize(pk, input_msg, info, blind_sig, inv)
使用量
支持的备选案文
此软件包支持在 RFC9474 (法语)。协商 第5节 (a) 将文件用于应用中每个变体的适当使用.
import { RSABSSA } from '@cloudflare/blindrsa-ts';
const variants = [
RSABSSA.SHA384.PSS.Randomized,
RSABSSA.SHA384.PSSZero.Randomized,
RSABSSA.SHA384.PSS.Deterministic,
RSABSSA.SHA384.PSSZero.Deterministic,
];
此外,它还支持在下文中指定的四个变体 部分失明的RSA 签字草案02。协商 第6节 (a) 将文件用于应用中每个变体的适当使用.
import { RSAPBSSA } from '@cloudflare/blindrsa-ts';
const variants = [
RSAPBSSA.SHA384.PSS.Randomized,
RSAPBSSA.SHA384.PSSZero.Randomized,
RSAPBSSA.SHA384.PSS.Deterministic,
RSAPBSSA.SHA384.PSSZero.Deterministic,
];
平台特定配置
优化
默认情况下,此库使用 WebCrypto API 页面存档备份,存于互联网档案馆某些平台,例如: 云花岗工人,已经实施了本地操作。 这些可以通过通过 { supportRSARAW: true } 当他们取回一个套房的时候.
在编写本报告时,这项专门优化仅针对 BlindSign 操作。 密钥类型无需修改, 将设定为 RSA-RAW 在操作时由图书馆提供.
部分失明的登记册系统管理人验证
此库不支持浏览器中部分盲的RSA签名验证. 这是因为 crypto.subtle 不允许部分失明的RSA要求的大型公共责任人。 您可以跟踪错误 铬 财务报告和审定财务报表 火花。 。 。 .
设置
一旦选择了盲-RSA变体,首先生成服务器的密钥对. 键长和公示都可以指定.
const suite = RSABSSA.SHA384.PSS.Randomized();
const { privateKey, publicKey } = await suite.generateKey({
publicExponent: Uint8Array.from([1, 0, 1]),
modulusLength: 2048,
});
服务器向客户端分发其公钥.
部分失明的RSA 签署考虑
部分盲目 RSA 签名需要客户端和服务器有一个公共字节数组 info 共享出带。 在适当情况下,这个字节数组必须作为参数提供. 请参考本报告提供的例子 实例/ 部分盲点 以观察用法.
步骤1
客户端准备任意输入,由服务器盲目签名. 这个 blind 方法生成一个被蒙蔽的消息和一个反向对象,后者稍后将在定稿步骤中被使用.
const msgString = 'Alice and Bob';
const message = new TextEncoder().encode(msgString);
const preparedMsg = suite.prepare(message);
const { blindedMsg, inv } = await suite.blind(publicKey, preparedMsg);
客户端只向服务器发送失明消息.
步骤2
服务器收到被盲文后,会用盲文签名回复客户端.
const blindSignature = await suite.blindSign(privateKey, blindedMsg);
服务器向客户端发送被蒙蔽的签名.
步骤3
客户端使用从服务器收到的被蒙蔽的签名以及第一步产生的反向对象来制作最终签名.
const signature = await suite.finalize(publicKey, preparedMsg, blindSignature, inv);
因此,客户获得一对 (preparedMsg, signature) 可以核实其有效性.
步骤4
任何人可以访问服务器的公用钥匙,可以验证上面的签名 preparedMsg。 。 。 .
const isValid = await suite.verify(publicKey, signature, preparedMsg); // true
发展
| 任务 | 国家预防机制脚本 |
|---|---|
| 安装 | $ npm ci |
| 大楼 | $ npm run build |
| 单位测试 | $ npm run test |
| 实例 | $ npm run examples |
| 代码 Linting | $ npm run lint |
| 代码格式 | $ npm run format |
依赖关系
此工程使用 Stanford JavaScript Crypto 库 sjcl 键。使用以下命令配置库.
make -f sjcl.Makefile
许可证
该项目根据以下规定获得许可证: Apache-2.0 许可证。 。 。 .
