OpenPGP JS升级至5.3后如何实现AES EAX解密操作
OpenPGP JS 5.3版本EAX解密实现方法
OpenPGP JS 5.x 版本对生产构建的公开API做了裁剪,默认不对外暴露内部底层密码学原语。测试目录里直接引用源码路径导入EAX的写法仅在仓库本地开发测试时可用,npm发布的生产构建包不支持这种导入方式。
新旧版本差异
4.10.1版本中使用的全局window.openpgp.crypto.eax异步调用,在5.x版本中被收归为内部模块,API也从异步实现改为同步实现。
实现代码
NPM构建场景
如果项目通过npm安装openpgp,配合webpack/rollup/vite等构建工具使用,可以直接通过子路径导入内部EAX模块,示例代码如下:
import openpgp from 'openpgp'; // 导入EAX加密模式模块 import EAX from 'openpgp/crypto/mode/eax'; // 导入对称加密算法集合 import ciphers from 'openpgp/crypto/cipher'; // 替换为实际使用的加密算法名,如'aes128'/'aes256',传入密钥初始化算法实例 const cipherInstance = new ciphers[/* 对应算法名 */](key); const eax = new EAX(cipherInstance); // 解密为同步方法,不需要加await const result = eax.decrypt(encryptedData, nonce, header);
浏览器UMD直接引入场景
如果是通过script标签直接引入openpgp的UMD生产包,包内不会挂载EAX相关内部模块,可选择两种方案处理:
- 调整构建配置,将openpgp源码中的EAX模块单独打包引入
- 直接把EAX模式的实现代码抽离到本地项目维护。EAX实现依赖极少、代码量小,抽离后不存在兼容性问题,也能避免后续openpgp版本升级改动内部路径导致代码失效。
注意点
- 5.x版本EAX的初始化、加解密全流程都是同步方法,不要加
await调用 - 所有入参需为
Uint8Array类型,和4.x版本参数类型要求兼容,如果传入的是Buffer类对象,提前转成Uint8Array即可 - 直接导入内部子路径的写法不属于官方公开API,后续版本升级可能出现路径变动,生产环境长期使用更推荐抽离EAX实现到本地维护。
内容的提问来源于stack exchange,提问作者Raza Ahmed
相关产品推荐
相关产品推荐

