仓颉 stdx.crypto.keys 密钥包全解析:RSA / ECDSA / SM2 密钥生成、签名验签与 PEM / DER 编解码实战
标准库网络密码学并发编程【免费下载链接】cangjie_stdx仓颉编程语言提供了 stdx 模块该模块提供了网络、安全等领域的通用能力。项目地址https://gitcode.com/Cangjie/cangjie_stdx点击查看免费下载stdx.crypto.keys是仓颉标准库扩展cangjie_stdx中的非对称密钥管理包提供 RSA、SM2 两类非对称加密算法与 ECDSA 签名算法所需的一整套密钥能力。本文以该包官方 API 文档keys_package_classes.md为核心骨架结合仓库源码rsa.cj、ecdsa.cj、sm2.cj、keys.cj与配套示例系统讲解八大密钥类的构造、签名/验签、加解密、PEM/DER 编解码与口令保护机制帮助开发者直接落地密钥生成与交换场景。一、包能力总览与运行环境准备stdx.crypto.keys包提供的核心能力包括RSA 非对称加密RSAPrivateKey/RSAPublicKey支持加解密PKCS1 / OAEP 填充与签名验签PKCS1 / PSS 填充ECDSA 签名ECDSAPrivateKey/ECDSAPublicKey支持 8 种椭圆曲线提供签名与验签SM2 国密算法SM2PrivateKey/SM2PublicKey支持 SM2 加解密与基于 SM3 摘要的签名验签通用密钥类型GeneralPrivateKey/GeneralPublicKey提供不限定算法的密钥参数加解密与 DER/PEM 编解码统一入口。官方包级说明参见 keys_package_overview.md。该包对外部环境有明确依赖运行时需要 OpenSSL 3 的 crypto 动态库libcrypto.so/libcrypto.so.3否则程序会抛出CryptoException: Can not load openssl library or function xxx。不同平台的准备方式如下平台安装方式需要的库文件Linuxsudo apt install libssl-dev如 Ubuntu 22.04或源码编译安装 OpenSSL 3.xlibcrypto.so、libcrypto.so.3自定义目录安装需配置LD_LIBRARY_PATH/LIBRARY_PATHWindows下载 OpenSSL 3.x 源码编译 x64 包或安装第三方预编译包libcrypto.dll.a或libcrypto.lib、libcrypto-3-x64.dll分别配置LIBRARY_PATH与PATHmacOSbrew install openssl3或源码编译libcrypto.dylib、libcrypto.3.dylib自定义目录需配置DYLD_LIBRARY_PATH/LIBRARY_PATHAndroid用 Android NDK 交叉编译完整版 OpenSSL 3.x当前仅支持arm64-v8alibcrypto.so、libcrypto.so.3配置LD_LIBRARY_PATHHarmonyOSHarmonyOS 6.0 及以上系统限制stdx直接访问系统内置 OpenSSL需自行编译并打包进应用libcrypto_openssl.z.so、libssl_openssl.z.so注意如果未安装 OpenSSL 3 或安装的是更低版本相关接口会因符号缺失而运行失败。二、类体系接口、枚举与辅助结构体2.1 统一接口 PrivateKey / PublicKey八个密钥类分别实现统一接口 PrivateKey 与 PublicKey。其中PrivateKey约定了一套完整的编解码契约public interface PrivateKey : Key { func encodeToDer(password!: ?String): DerBlob func encodeToPem(password!: ?String): PemEntry static func decodeDer(encoded: DerBlob): PrivateKey static func decodeFromPem(text: String): PrivateKey static func decodeDer(encoded: DerBlob, password!: ?String): PrivateKey static func decodeFromPem(text: String, password!: ?String): PrivateKey }接口语义要点encodeToDer / encodeToPem的password!参数为可选命名参数传None时不加密传口令时输出 PKCS#8 加密格式带口令的解码方法用于读取加密密钥返回的密钥对象已解密后续再调用无口令的encodeToDer/encodeToPem将序列化为未加密密钥源码注释中明确说明见 keys.cjPublicKey接口只要求decodeDer/decodeFromPem两个静态解码方法因为公钥无需保密。2.2 枚举 CurveECDSA 椭圆曲线选择Curve 用于选择 ECDSA 密钥生成的椭圆曲线共支持 8 条public enum Curve { | P224 | P256 | P384 | P521 | BP256 | BP320 | BP384 | BP512 }NIST 系列P-224224 位素数模适合轻量应用、P-256256 位中等安全等级应用、P-384384 位高级别应用、P-521521 位极高安全等级应用Brainpool 系列BP256 / BP320 / BP384 / BP512由德国联邦信息安全办公室BSI提出官方文档描述其同等安全等级下性能优于对应 NIST 曲线。从源码看每个枚举值映射到 OpenSSL 的 NID 常量见 ecdsa.cjfunc getNum() { match (this) { case P224 NID_secp224r1 case P256 NID_X9_62_prime256v1 case P384 NID_secp384r1 case P521 NID_secp521r1 case BP256 NID_brainpoolP256r1 case BP320 NID_brainpoolP320r1 case BP384 NID_brainpoolP384r1 case BP512 NID_brainpoolP512r1 } }2.3 枚举 PadOption 与结构体 OAEPOption / PSSOptionPadOption 用于配置 RSA 的填充模式public enum PadOption { | OAEP(OAEPOption) | PSS(PSSOption) | PKCS1 }三种填充模式的适用边界源码中也有强制校验见 rsa.cj填充模式适用操作说明PKCS1加密、解密、签名、验签PKCS#1 v1.5 传统填充官方文档明确提示当前针对 PKCS1 的攻击手段已较成熟存在解密或签名伪造风险建议优先使用 v2 的 PSS / OAEPOAEP(OAEPOption)仅加密/解密最优非对称加密填充对加密场景安全性更高推荐PSS(PSSOption)仅签名/验签概率签名方案对签名场景安全性更高推荐源码中若将 OAEP 用于签名、或 PSS 用于加解密会直接抛出CryptoException(OAEPOption is only applicable to encryption or decryption operations.)或PSSOption is only applicable to signing or verification operations.。配套的两个结构体定义见 keys_package_structs.mdOAEPOptioninit(hash: Digest, mgfHash: Digest, label!: String )hash用于对 label 做摘要mgfHash用于 MGF1 掩码生成函数label可选默认空串用于区分不同加密操作PSSOptioninit(saltLen: Int32)盐长取值范围0 ≤ saltLen ≤ (RSA 密钥长度 - 摘要长度 - 2)过大可能导致签名失败源码中盐长为负时抛CryptoException(Salt length cannot be negative.)。2.4 数据载体 DerBlob 与 PemEntryDerBlobDER/ASN.1 二进制格式载体含body: ArrayByte与size: Int64属性实现EquatableDerBlob HashablePemEntry单条 PEM 结构由首行-----BEGIN label-----、Base64 编码的 body、末行-----END label-----组成并提供LABEL_RSA_PRIVATE_KEY、LABEL_EC_PRIVATE_KEY、LABEL_ENCRYPTED_PRIVATE_KEY、LABEL_PUBLIC_KEY等标签常量。三、RSA 密钥类RSAPrivateKey 与 RSAPublicKey3.1 私钥生成两个构造器public class RSAPrivateKey : PrivateKey { public init(bits: Int32) public init(bits: Int32, e: BigInt) }init(bits)生成指定长度密钥默认公钥指数 e 65537业界推荐值。官方文档指出 e 的取值直接影响 RSA 安全性与加密效率较小的 e 加密更快但安全性更低init(bits, e)自定义公钥指数e必须是[3, 2^256-1]范围内的奇数。参数约束与源码中的校验函数一一对应见 rsa.cj参数取值范围校验逻辑bits512 ≤ bits ≤ 16384checkBits抛错信息示例Key size is too small: 511 bits, minimum is 512 bits.e3 ≤ e ≤ 2^256-1且为奇数checkPublicExponent偶数抛must be odd越界抛expected at least 3/expected at most ...重要安全提示官方文档明确标注推荐密钥长度不小于 3072 位短于 3072 位的密钥可能存在安全隐患。源码中的RSA_MIN_MODULUS_BITS 512与RSA_MAX_MODULUS_BITS 16384仅是参数下限/上限不代表安全推荐值。3.2 公钥生成public class RSAPublicKey : PublicKey { public init(pri: RSAPrivateKey) }RSAPublicKey(pri)从私钥中提取对应的公钥。源码实现是先通过getPublicKeyDer(pri.pkey)取出公钥 DER 数据再用loadPublicKey(RSA_id, content)加载rsa.cj。3.3 加解密encrypt / decryptpublic func decrypt(input: InputStream, output: OutputStream, padType!: PadOption): Unit public func encrypt(input: InputStream, output: OutputStream, padType!: PadOption): Unitinput待处理的数据流加密时为明文解密时为密文output结果数据流padType!PKCS1或OAEP(OAEPOption)不支持 PSS官方推荐高安全加密场景使用 OAEP。源码中decrypt对三种填充的分发逻辑为rsa.cjPKCS1走decryptPKCS1OAEP(oaep)走decryptOAEP携带 label、hash、mgfHashPSS直接抛异常。3.4 签名与验签sign / verifypublic func sign(hash: Digest, digest: ArrayByte, padType!: PadOption): ArrayByte public func verify(hash: Digest, digest: ArrayByte, sig: ArrayByte, padType!: PadOption): Boolhash生成摘要所用的摘要算法实例如SHA512()digest数据摘要结果sig待验证的签名数据padType!PKCS1或PSS(PSSOption)不支持 OAEP高安全签名场景推荐 PSS。源码中sign对PKCS1/PSS/OAEP分别路由到signPKCS1/signPSS/ 抛异常rsa.cj。3.5 DER / PEM 编解码与口令保护RSAPrivateKey / RSAPublicKey 均提供一组对称的编解码 APIAPI功能关键异常decodeDer(blob)从 DER 解码私钥/公钥解码失败抛CryptoExceptiondecodeDer(blob, password!)从 DER 解码加密私钥None表示不解密解码/解密失败、口令为空串均抛异常decodeFromPem(text)从 PEM 字符流解码流不符合 PEM 格式、头部不符合私钥/公钥标准均抛异常decodeFromPem(text, password!)从 PEM 解码加密私钥同上叠加解密与空口令检查encodeToDer()/encodeToDer(password!)编码为 DER带口令时使用AES-256-CBC加密后编码编码/加密失败、口令为空串抛异常encodeToPem()/encodeToPem(password!)编码为 PEM带口令时输出加密私钥条目同上从源码看带口令的编码/解码路径实际是借用通用密钥类的实现例如RSAPrivateKey.encodeToDer(password:)内部先encodeToDer()得到明文 DER再通过GeneralPrivateKey.decodeDer(blob)与GeneralPrivateKey.encodeToDer(password:)完成 PKCS#8 加密封装rsa.cjdecodeDer(blob, password:)则先经GeneralPrivateKey.decodeDer解密再转回RSAPrivateKeyrsa.cj。此外私钥的toString()返回RSA PRIVATE KEY公钥返回RSA PUBLIC KEY。四、ECDSA 密钥类ECDSAPrivateKey 与 ECDSAPublicKey4.1 生成与签名验签public class ECDSAPrivateKey : PrivateKey { public init(curve: Curve) } public class ECDSAPublicKey : PublicKey { public init(pri: ECDSAPrivateKey) }ECDSAPrivateKey(curve)按指定曲线生成私钥。源码通过setCurveNid(ctx, curve.getNum())设置曲线后调用keyGenerate生成ecdsa.cjECDSAPublicKey(pri)从 ECDSA 私钥提取公钥。签名与验签接口ECDSA 固定对摘要结果操作签名前需要调用方先完成摘要计算public func sign(digest: ArrayByte): ArrayByte public func verify(digest: ArrayByte, sig: ArrayByte): Bool4.2 编解码ECDSAPrivateKey / ECDSAPublicKey 提供与 RSA 相同的decodeDer含带口令重载、decodeFromPem含带口令重载、encodeToDer含带口令重载、encodeToPem含带口令重载方法族语义与异常条件与 RSA 一致。其中无口令encodeToPem()使用的 PEM 标签为EC PRIVATE KEY源码 ecdsa.cj带口令时输出ENCRYPTED PRIVATE KEY标签。toString()分别返回ECDSA PRIVATE KEY与ECDSA PUBLIC KEY。4.3 底层实现细节keepAlive 机制ECDSA 类源码中有一段值得注意的实现ecdsa.cj通过AtomicReferenceObject全局引用配合幻影对象实现keepAlive在签名/编码完成后先store(o)再store(_privateKeyPhantom)防止底层pkey指针所依赖的对象被 GC 提前回收导致崩溃。这是 FFI 场景下管理原生指针生命周期的典型手法也解释了为何文档要求这些对象在调用原生操作期间必须保持存活。五、SM2 国密密钥类SM2PrivateKey 与 SM2PublicKey5.1 生成与签名验签public class SM2PrivateKey : PrivateKey { public init() } public class SM2PublicKey : PublicKey { public init(pri: SM2PrivateKey) }SM2PrivateKey()无参构造按国密 SM2 标准源码注释标注遵循 GM/T 0009-2012生成密钥对中的私钥SM2PublicKey(pri)从 SM2 私钥提取公钥。SM2 的签名直接对原始数据操作内部自动完成 SM3 摘要public func sign(data: ArrayByte): ArrayByte public func verify(data: ArrayByte, sig: ArrayByte): Bool官方文档明确指出SM2 使用 SM3 摘要算法。源码中的签名链路完整印证了这一点signSM2内部创建摘要上下文后依次调用digestSignInit(mdctx, ..., sm3(), ..., pkey)、digestSignUpdate、两次digestSignFinal完成签名sm2.cj验签则走digestVerifyInit/digestVerifyUpdate/digestVerifyFinal流程sm2.cj。实现细节签名与验签时使用了国密标准定义的默认用户标识defaultUid16 字节的1234567812345678见 sm2.cj。5.2 加解密SM2 的加解密以字节数组为输入输出区别于 RSA 的流式接口public func encrypt(input: ArrayByte): ArrayByte public func decrypt(input: ArrayByte): ArrayByte公钥encrypt输出的密文遵循ASN.1 编码规则私钥decrypt要求输入的密文同样遵循 ASN.1 编码规则否则解密失败。源码中encryptSM2采用 OpenSSL EVP 两级调用模式先以空输出缓冲调用encrypt查询所需长度再以实际缓冲完成加密sm2.cjdecryptSM2流程对称sm2.cj。注意两个函数对空输入直接返回空数组。5.3 编解码SM2 密钥类同样提供decodeDer/decodeFromPem均含带口令重载、encodeToDer含带口令重载、encodeToPem含带口令重载。与 RSA/ECDSA 略有不同的是SM2 私钥的encodeToPem()与带口令版本均使用EC PRIVATE KEY标签sm2.cj而toString()返回SM2 PRIVATE KEY/SM2 PUBLIC KEY供用户区分密钥算法类型。六、通用密钥类GeneralPrivateKey 与 GeneralPublicKeyGeneralPrivateKey : PrivateKey与GeneralPublicKey : PublicKey提供不限定具体算法的密钥参数处理能力适合统一处理任意受支持算法的密钥数据public class GeneralPrivateKey : PrivateKey public class GeneralPublicKey : PublicKey它们的 API 与算法专属类一致decodeDer/decodeFromPem含带口令重载、encodeToDer/encodeToPem含带口令重载。从源码看keys.cjGeneralPublicKey.decodeFromPem(text)遍历 PEM 文本中的条目查找PUBLIC KEY标签条目并解码找不到时抛No PUBLIC KEY entry found in PEM file.keys.cjGeneralPrivateKey.decodeFromPem支持解析带Proc-Type: 4,ENCRYPTED与DEK-Info旧式头部的加密 PEM以及 PKCS#8 加密密钥keys.cj口令安全校验密码含\0字节抛Password contains zero byte.空口令抛Password is empty.keys.cjtoString()输出格式为PrivateKey(字节数 bytes, 描述)/PublicKey(字节数 bytes)。这些通用类也是 RSA/ECDSA/SM2 带口令编解码的内部枢纽承担 PKCS#8 加密封装与解封的实际工作。七、完整实战示例以下示例来自官方配套文档 sample_keys.md覆盖三种算法的核心操作链路。7.1 RSAOAEP 加解密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。要点OAEPOption(SHA1(), SHA256())中的hash用于 label 摘要、mgfHash用于 MGF1加解密的 OAEP 参数需保持一致。7.2 RSA从 PEM 文件加载密钥并做 PKCS1 签名验签注意需要自行准备./files/rsaPri.pem与./files/rsaPub.pem两个密钥文件。import stdx.crypto.keys.* import stdx.crypto.digest.* import std.crypto.digest.* import std.fs.* import std.io.* main() { var pemPri String.fromUtf8(readToEnd(File(./files/rsaPri.pem, Read))) var rsaPri RSAPrivateKey.decodeFromPem(pemPri) var pemPub String.fromUtf8(readToEnd(File(./files/rsaPub.pem, Read))) var rsaPub RSAPublicKey.decodeFromPem(pemPub) var str: String helloworld var sha512Instance SHA512() sha512Instance.write(str.toArray()) var md: ArrayByte sha512Instance.finish() var sig rsaPri.sign(sha512Instance, md, padType: PKCS1) if (rsaPub.verify(sha512Instance, md, sig, padType: PKCS1)) { println(verify successful) } }执行结果verify successful。要点sign与verify的hash参数须传入同一个摘要实例签名与验签的填充模式必须一致。7.3 ECDSAP224 曲线签名验签import stdx.crypto.keys.* import stdx.crypto.digest.* import std.convert.* import std.crypto.digest.* main() { var ecPri ECDSAPrivateKey(P224) var ecPub ECDSAPublicKey(ecPri) var str: String helloworld var sha512Instance SHA512() sha512Instance.write(str.toArray()) var md: ArrayByte sha512Instance.finish() var sig ecPri.sign(md) if (ecPub.verify(md, sig)) { println(verify successful) } }执行结果verify successful。ECDSA 的sign/verify直接以摘要字节数组为参数曲线类型仅在建钥时决定。7.4 SM2密钥生成、导出、加密解密、签名验签与导入import stdx.crypto.keys.* import stdx.crypto.digest.* import std.convert.* import std.crypto.digest.* import std.fs.* import std.io.* main(): Unit { /* 无参生成公私钥 */ let sm2PrivateKey SM2PrivateKey() let sm2PublicKey SM2PublicKey(sm2PrivateKey) /* 导出公私钥到 PEM 文件 */ let priPem sm2PrivateKey.encodeToPem() let file1: File File(./sm2Pri.pem, Write) file1.write(priPem.encode().toArray()) file1.close() let pubPem sm2PublicKey.encodeToPem() let file2: File File(./sm2Pub.pem, Write) file2.write(pubPem.encode().toArray()) file2.close() /* 公钥加密、私钥解密 */ let str: String helloworld let encresult sm2PublicKey.encrypt(str.toArray()) let decresult sm2PrivateKey.decrypt(encresult) println(String.fromUtf8(decresult)) /* 私钥签名、公钥验签 */ let strSig: String helloworld let sigRe sm2PrivateKey.sign(strSig.toArray()) let verifyre sm2PublicKey.verify(strSig.toArray(), sigRe) println(verifyre) /* 从 PEM 文件导入公私钥 */ let pemPri String.fromUtf8(readToEnd(File(./sm2Pri.pem, Read))) let sm2PrivateKeyNew SM2PrivateKey.decodeFromPem(pemPri) println(sm2PrivateKeyNew) let pemPub String.fromUtf8(readToEnd(File(./sm2Pub.pem, Read))) let sm2PublicKeyNew SM2PublicKey.decodeFromPem(pemPub) println(sm2PublicKeyNew) }执行结果helloworld true SM2 PRIVATE KEY SM2 PUBLIC KEY要点SM2 的加密/解密、签名/验签均直接操作字节数组PemEntry.encode()得到可写入文件的 PEM 文本字节导入后println输出的是toString()返回的密钥类型描述。八、设计要点与使用建议填充模式选型RSA 加密优先 OAEP、签名优先 PSS仅在需要与旧系统互操作时使用 PKCS1。误用模式如加密时传 PSS会被源码直接以异常拦截密钥长度RSA 参数下限 512 位仅为接口约束实际生产建议 ≥ 3072 位ECDSA 按安全等级从P224到P521选择曲线国密场景使用 SM2口令保护所有私钥类的encodeToDer / encodeToPem / decodeDer / decodeFromPem均提供password!可选命名参数None表示不加密/不解密空串口令会被拒绝带口令编码统一走 PKCS#8 加密格式AES-256-CBC摘要与签名的关系RSA 与 ECDSA 的sign/verify针对摘要结果操作调用方需先自行完成摘要计算SM2 则直接对原始数据操作并内部使用 SM3原生依赖包的能力建立在 OpenSSL 3 之上部署前务必按本文第一节完成各平台的动态库准备否则相关调用会抛出CryptoException: Can not load openssl library or function xxx。如需更深入的调用链与边界行为验证可继续阅读仓库源码rsa.cjRSA 生成/加解密/签名/编解码、ecdsa.cj曲线映射与 ECDSA 实现、sm2.cjSM2 国密实现、keys.cj通用密钥与 PKCS#8 加解密以及官方示例文档 sample_keys.md 与包级说明 keys_package_overview.md。赞分享标准库网络密码学并发编程【免费下载链接】cangjie_stdx仓颉编程语言提供了 stdx 模块该模块提供了网络、安全等领域的通用能力。项目地址https://gitcode.com/Cangjie/cangjie_stdx点击查看免费下载相关推荐仓颉 stdx.crypto.keys 密钥实战RSA、ECDSA 与 SM2 的加解密、签名验签与 PEM 持久化仓颉 stdx.crypto.keys 密钥实战RSA、ECDSA 与 SM2 的加解密、签名验签与 PEM 持久化 导读 stdx.crypto.keys标准库网络密码学并发编程仓颉 stdx.crypto.keys 密钥库实战指南RSA / SM2 / ECDSA 非对称加密与数字签名仓颉 stdx.crypto.keys 密钥库实战指南RSA / SM2 / ECDSA 非对称加密与数字签名 stdx.crypto.keys 是仓颉标准库标准库网络密码学并发编程cangjie_stdx keys 包密钥类全解ECDSA、RSA、SM2 私钥/公钥的生成、编解码与签名验签实战cangjie_stdx keys 包密钥类全解ECDSA、RSA、SM2 私钥/公钥的生成、编解码与签名验签实战 本文档以仓颉标准库扩展模块 stdx.cr标准库网络密码学并发编程上一篇Fast-GitHub终极指南如何将GitHub下载速度提升100倍的完整解决方案下一篇微信好友检测终极指南3步找出谁悄悄删了你创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

FTP文件的上传

FTP文件的上传

1.获取FTP主机地址、端口、账号、密码 2. 打开FTP客户端,填入信息,点击连接 3.在本地电脑中,找到你网页文件打开目标存放文件夹 4.选中本地文件,点击到右侧远程目录,开始上传 5.底部查看传输进度 6.上传结束&#xff…

2026/10/14 2:58:30 阅读更多 →
Linux下用nvm管理Node版本:安装、切换与避坑指南

Linux下用nvm管理Node版本:安装、切换与避坑指南

先说个现象:很多人在Linux上装Node时都吃过大亏。要么用系统源装了个老旧版本,几年都升不上去;要么手动解压二进制包,最后整个系统里散落着两三个互相打架的node;还有干脆每次需要换版本就重新下载安装,折腾…

2026/10/14 2:57:30 阅读更多 →
Toluna宣布首席执行官交接计划:创始人Frédéric Charles Petit掌舵25年后将卸任,继续担任董事、高级顾问及股东

Toluna宣布首席执行官交接计划:创始人Frédéric Charles Petit掌舵25年后将卸任,继续担任董事、高级顾问及股东

全球领先的消费者洞察与市场研究技术企业Toluna今日宣布,计划有序推进领导层交接。创始人兼首席执行官Frdric Charles Petit在执掌其创办的公司25年后,拟于继任者获任后卸任首席执行官。此次交接是公司周密规划的继任安排的一部分,旨在确保客…

2026/10/14 2:57:30 阅读更多 →

最新新闻

一张图微调YOLOv11:自然栖息地鸟类检测的流程与扩充

一张图微调YOLOv11:自然栖息地鸟类检测的流程与扩充

简介:面向 YOLOv11 模型验证需求,这份精简版鸟类目标检测数据集包含一张真实野外鸟类图像及配套标准标注,可用于快速原型验证、轻量级部署测试与小样本检测基线建立。压缩包共五个文件,包含三张 JPG 图像、一个数据配置文件与一个…

2026/10/14 3:39:38 阅读更多 →
ASP.NET + SQLServer葡萄酒商城源码:从数据库还原到下单事务全攻略

ASP.NET + SQLServer葡萄酒商城源码:从数据库还原到下单事务全攻略

简介:一套基于ASP.NET与SQL Server的葡萄酒网上商城销售系统,面向ASP.NET WebForm学习者、毕业设计学生以及需要搭建在线商城教学演示的开发者。系统围绕普通会员、商户会员和管理员三类角色展开,覆盖商品管理、购物车、订单处理、发货、商户…

2026/10/14 3:39:38 阅读更多 →
LangChain项目代码拆解:Chain、Agent、Memory与Retrieval四大核心组件实战指南

LangChain项目代码拆解:Chain、Agent、Memory与Retrieval四大核心组件实战指南

简介:这是一份LangChain入门与实践的项目代码包,面向正在学习大模型应用开发的Python开发者,旨在帮助读者快速理解LangChain的模块化设计与核心用法。包内共3个文件,包含一个HTML格式的入门讲解页、一个项目运行配置文件以及一个版…

2026/10/14 3:39:38 阅读更多 →
C++学习日记 Day21:C++11(下)lambda表达式和function包装器

C++学习日记 Day21:C++11(下)lambda表达式和function包装器

## 今天学了什么今天学习C11的lambda表达式和function包装器。## 可调用对象概念:在C中有一类对象可像函数一样调用;分类:①函数指针using prt void(*)(int, string); prt f1 fun; f1(1, "函数指针");②仿函数 --有 operator&am…

2026/10/14 3:39:38 阅读更多 →
一人公司AI工作流:6步实现内容生产去体力化

一人公司AI工作流:6步实现内容生产去体力化

1. 一人公司的内容困局与破局思路一个人做内容,最怕的不是没灵感,而是灵感来了却卡在“执行”上。写一篇长文要三小时,做一张配图要半小时,剪一条短视频要一整个下午,排版发布又要来回切换四五个平台。一天下来&#x…

2026/10/14 3:39:38 阅读更多 →
8765平台前后摄DVDD电压不一致排查与修复指南

8765平台前后摄DVDD电压不一致排查与修复指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 3:38:38 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →