文档知识库教程OpenHarmony【免费下载链接】CangjieCorpus本仓库为仓颉编程语言语料库聚焦 仓颉编程语言 核心知识体系整合官方开发指南、API 文档、典型代码示例及语法规范等多维度资源经结构化处理与专业标注构建为支持 RAG检索增强生成技术 的高质量知识基座适配智能编码助手、学习辅助工具等应用开发需求。 欢迎开发者基于本语料库构建仓颉语言智能应用推动鸿蒙开发生态智能化升级项目地址https://gitcode.com/Cangjie/CangjieCorpus点击查看免费下载导读stdx.crypto.keys是仓颉标准库扩展stdx中面向非对称加密与签名的核心包支持 RSA、SM2 非对称加密算法以及 ECDSA 签名算法。在使用 RSA 密钥执行加密、解密、签名与验签时填充模式Padding直接决定算法的安全等级与适用场景而本文要讲解的OAEPOption与PSSOption两个结构体正是 RSA 两种高强度填充模式 OAEP最优非对称加密填充与 PSS概率签名方案的参数配置载体。读完本文你将掌握这两个结构体的完整字段语义、合法取值边界、异常触发条件并能在真实的加密/签名代码中正确组合使用它们。一、定位填充参数结构体在 keys 包中的角色在 keys 包总览 中结构体一共有两个正是OAEPOption与PSSOption其 API 列表明确标注OAEPOption——最优非对称加密填充PSSOption——概率签名方案。它们与 PadOption 枚举 直接绑定。PadOption是 RSA 填充模式的入口类型public enum PadOption { | OAEP(OAEPOption) | PSS(PSSOption) | PKCS1 }从枚举定义可以看出OAEP与PSS两个枚举成员各自携带一个结构体参数而PKCS1不携带任何参数。也就是说当开发者在 RSA 的公钥加密、私钥解密、私钥签名、公钥验签等方法中通过padType:命名参数指定填充模式时需要先构造对应的 Option 结构体实例。三种填充模式的适用范围与安全取向结合 PadOption 枚举 的说明填充模式全称适用操作安全说明OAEP最优非对称加密填充Optimal Asymmetric Encryption Padding仅加密、解密基于随机化填充具备可证明安全性PSS概率签名方案Probabilistic Signature Scheme仅签名、验证基于随机化盐值抗伪造能力强PKCS1PKCS #1 v1.5 填充加密、解密、签名、验证均可早期规范定义的填充针对它的攻击手段已较成熟易被攻击者解密或伪造签名文档明确给出安全建议应优先采用 PKCS #1 v2 版本中更加安全的 PSS 或 OAEP 填充模式避免使用 PKCS1。这一建议在 RSA 密钥类 的方法签名中也有呼应RSAPublicKey.encrypt/RSAPrivateKey.decrypt只接受PKCS1或OAEP不支持PSS而RSAPrivateKey.sign/RSAPublicKey.verify只接受PKCS1或PSS不支持OAEP。因此给加密操作传 PSS 参数、给签名操作传 OAEP 参数都是错误的用法设置填充模式失败时会抛出CryptoException。二、struct OAEPOptionOAEP 填充参数OAEPOption是 OAEP 填充模式 需要设置的参数结构体其完整定义如下public struct OAEPOption { public init(hash: Digest, mgfHash: Digest, label!: String ) }init(Digest, Digest, String) 参数逐项解析参数类型是否可选默认值作用hashDigest必填无摘要方法用于对label进行摘要mgfHashDigest必填无摘要方法用于设置 MGF1 函数中的摘要方法label!String可选带!后缀可选的关联标签用于区分不同的加密操作其中Digest是仓颉标准库中消息摘要算法的抽象类型来自std.crypto.digest包。在 digest 包 中Digest的具体实现包括MD5、SHA1、SHA224、SHA256、SHA384、SHA512、SM3以及带密钥的HMAC。以 SHA1、SHA256、SHA512 为代表的这些类均直接: Digest因此可以直接作为hash/mgfHash传入。参数背后的密码学语义hash与label的关系OAEP 填充允许携带一个可选的公开标签label其语义是“将标签与密文绑定”——即只有知道该标签的接收方才能正确解密可用于区分同一把密钥下的不同加密操作如不同业务场景。hash摘要方法负责对该 label 进行摘要计算后参与 OAEP 编码。mgfHash与 MGF1 的关系OAEP 在填充过程中需要将种子扩展为与数据块等长的掩码这一扩展过程由掩码生成函数MGF1完成。mgfHash就是 MGF1 内部使用的哈希函数实践中应选用与hash同族或强度不低于它的摘要算法。从源码结构看mgfHash参数的存在意味着 OAEP 允许“label 摘要”与“掩码生成摘要”使用不同的算法为开发者提供了更细粒度的配置能力。实战使用 OAEPOption 配置 RSA 加密与解密keys 使用示例 中给出了完整的 RSA OAEP 加解密流程import stdx.crypto.keys.* import stdx.crypto.digest.* import std.io.* import std.crypto.digest.* main() { var rsaPri RSAPrivateKey(2048) var rsaPub RSAPublicKey(rsaPri) var str: String hello world, hello cangjie var bas1 ByteBuffer() var bas2 ByteBuffer() var bas3 ByteBuffer() bas1.write(str.toArray()) var encOpt OAEPOption(SHA1(), SHA256()) rsaPub.encrypt(bas1, bas2, padType: OAEP(encOpt)) var encOpt2 OAEPOption(SHA1(), SHA256()) rsaPri.decrypt(bas2, bas3, padType: OAEP(encOpt2)) var buf ArrayByte(str.size, repeat: 0) bas3.read(buf) if (str.toArray() buf) { println(success) } else { println(fail) } }运行结果success要点拆解先以 2048 位生成RSAPrivateKey再从其构造RSAPublicKey构造OAEPOption(SHA1(), SHA256())hash取SHA1()用于 label 摘要label 缺省为空串mgfHash取SHA256()用于 MGF1 掩码生成公钥侧rsaPub.encrypt(bas1, bas2, padType: OAEP(encOpt))加密私钥侧rsaPri.decrypt(bas2, bas3, padType: OAEP(encOpt2))解密加解密两侧的OAEPOption参数可以相同也可以不同示例中两侧各自构造了一份但解密方必须持有与加密约定一致的label才能正确还原数据。三、struct PSSOptionPSS 填充参数PSSOption是 PSS 填充模式 需要设置的参数结构体其完整定义如下public struct PSSOption { public init(saltLen: Int32) }init(Int32) 参数与取值范围参数类型取值范围作用saltLenInt32大于等于 0且小于等于RSA 密钥长度 - 摘要长度 - 2随机盐长度单位字节PSS 之所以被称为“概率签名方案”核心就在于签名时引入随机盐salt同一消息每次签名得到的密文不同从而抵抗已知签名伪造类攻击。saltLen正是这条随机盐的长度。文档对取值范围给出了明确的边界说明下限必须大于等于 0。若小于 0构造PSSOption时会抛出 CryptoException上限不得大于RSA 密钥长度 - 摘要长度 - 2。若盐过长会导致签名失败。从密码学实现角度看上限公式的含义是RSA 模长如 2048 位 256 字节需要容纳一个与hash摘要等长的“哈希值”、一个与saltLen等长的盐值、若干固定标记字节至少 2 字节的格式开销三者之和不能超过模长否则 PSS 编码无法完成、签名必然失败。实战使用 PSSOption 配置 RSA 签名与验签继续沿用 keys 使用示例 中的思路该示例默认使用PKCS1将padType:替换为PSS(PSSOption(...))即可切换到 PSS 签名。签名验签的标准流程为使用SHA512()等摘要算法对消息做摘要write写入数据、finish()取出摘要字节私钥调用sign(hash, digest, padType:)完成签名公钥调用verify(hash, digest, sig, padType:)验证签名返回Bool。例如对 2048 位 RSA 密钥配合 SHA-256摘要长度 32 字节saltLen的可选上界约为256 - 32 - 2 222字节实际使用时可依据摘要长度按公式推导。值得注意的是RSAPrivateKey.sign/RSAPublicKey.verify的参数中hash用于标记获取摘要所用算法padType仅支持PKCS1或PSS传OAEP会抛出CryptoException。四、异常与依赖使用前的两个前置检查异常语义CryptoException两个结构体的构造函数在参数非法时统一抛出 CryptoException。该异常类定义于stdx.crypto.digest包是crypto系列包中摘要与加解密出现错误时的通用异常支持无参构造与带message构造public class CryptoException : Exception { public init() public init(message: String) }具体到本文场景PSSOption的saltLen 0会抛出该异常OAEPOption/PSSOption配合 RSA 使用时若填充模式设置失败如加解密传了PSS、签名验签传了OAEP、盐长度越界导致签名失败同样会抛出该异常。运行环境依赖OpenSSL 3keys 包以及其依赖的 digest 包依赖外部 OpenSSL 3 的 crypto 动态库。根据 keys 包总览 的说明不同平台需满足Linux安装 OpenSSL 3 开发工具包如 Ubuntu 22.04 下sudo apt install libssl-dev确保存在libcrypto.so与libcrypto.so.3自定义安装路径时需把目录加入LD_LIBRARY_PATH与LIBRARY_PATHWindows安装 x64 的 OpenSSL 3.x.x 软件包确保存在libcrypto.dll.a或libcrypto.lib与libcrypto-3-x64.dll并分别配置LIBRARY_PATH与PATH环境变量macOSbrew install openssl3安装确保存在libcrypto.dylib与libcrypto.3.dylib自定义路径需配置DYLD_LIBRARY_PATH与LIBRARY_PATH。若未安装或版本过低程序将抛出类似CryptoException: Can not load openssl library or function xxx的异常。五、关联阅读把 Option 结构体放入完整密钥体系理解OAEPOption/PSSOption之后建议结合以下仓库文档串起完整链路keys 包 API 类文档RSAPrivateKey支持decrypt、signPEM/DER 编解码、RSAPublicKey支持encrypt、verify以及ECDSAPrivateKey/ECDSAPublicKey、SM2PrivateKey/SM2PublicKeyCurve 枚举ECDSA 密钥生成时可选的 NIST P-224/256/384/521 与 Brainpool P-256/320/384/512 八种椭圆曲线digest 包hash/mgfHash参数所使用的Digest实现MD5、SHA 系列、SM3、HMACx509 包 PemEntry / DerBlob密钥通过encodeToPem()/encodeToDer()导出时对应的数据结构PemEntry内置LABEL_RSA_PRIVATE_KEY、LABEL_SM2_PRIVATE_KEY、LABEL_PUBLIC_KEY等标准标签keys 使用示例RSAOAEP 加解密、PKCS1 签名验签、ECDSAP224 签名验签、SM2加解密、签名验签、PEM 导入导出三套完整可运行示例。总结OAEPOption与PSSOption是stdx.crypto.keys包中 RSA 高强度填充模式的参数门面前者通过hashmgfHash 可选label三要素控制 OAEP 编码后者通过saltLen控制 PSS 随机盐长度。掌握它们的字段语义与取值范围并严格遵循“加密/解密用 OAEP、签名/验签用 PSS”的配对规则是写出安全、可用的仓颉 RSA 代码的关键一步。赞分享文档知识库教程OpenHarmony【免费下载链接】CangjieCorpus本仓库为仓颉编程语言语料库聚焦 仓颉编程语言 核心知识体系整合官方开发指南、API 文档、典型代码示例及语法规范等多维度资源经结构化处理与专业标注构建为支持 RAG检索增强生成技术 的高质量知识基座适配智能编码助手、学习辅助工具等应用开发需求。 欢迎开发者基于本语料库构建仓颉语言智能应用推动鸿蒙开发生态智能化升级项目地址https://gitcode.com/Cangjie/CangjieCorpus点击查看免费下载相关推荐仓颉 stdx.crypto.keys 填充参数结构体详解OAEPOption 与 PSSOption 的配置原理与实战仓颉 stdx.crypto.keys 填充参数结构体详解OAEPOption 与 PSSOption 的配置原理与实战 导读 stdx.crypto.key标准库网络密码学并发编程cangjie_stdx 密钥包结构体详解OAEPOption 与 PSSOption 的 RSA 填充参数配置指南cangjie_stdx 密钥包结构体详解OAEPOption 与 PSSOption 的 RSA 填充参数配置指南 本文基于 cangjie_stdx 开源标准库网络密码学并发编程仓颉 stdx.crypto.keys 密钥枚举详解Curve 椭圆曲线与 PadOption 填充模式仓颉 stdx.crypto.keys 密钥枚举详解Curve 椭圆曲线与 PadOption 填充模式 导读 本文以仓颉标准扩展库 stdx.crypto.文档知识库教程OpenHarmony上一篇Spinnaker资源命名规范提升可管理性与可读性下一篇Caffe Sigmoid 层详解激活函数原理、参数配置与前后向实现创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考