news 2026/6/13 23:16:02

深入解析NXP PKHA硬件加速器:Montgomery算法与模运算实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
深入解析NXP PKHA硬件加速器:Montgomery算法与模运算实战

1. 模运算与硬件加速:从数学原理到工程实践

在嵌入式安全、密码学协议乃至区块链底层技术中,我们常常会听到“模运算”这个词。对于软件工程师来说,这可能意味着调用一个库函数;但对于追求极致性能和安全性的系统开发者,尤其是在资源受限的嵌入式环境中,理解其硬件实现细节至关重要。模运算,简单说就是“时钟算术”——就像时钟走到12点后又从1点开始,它将无限的数字世界映射到一个有限的“环”上。这个看似简单的操作,却是RSA加密、椭圆曲线密码(ECC)、数字签名算法(DSA)乃至后量子密码学的基石。其计算效率直接决定了加密解密、密钥协商的速度,进而影响整个系统的响应能力和功耗。

然而,用通用处理器(CPU)执行大数模运算,尤其是涉及2048位或更长密钥时,其性能瓶颈是显而易见的。每一次模乘或模幂都可能涉及成千上万次的乘法和除法,这对CPU来说是沉重的负担。这就是硬件加速器登场的时刻。像NXP QorIQ LS1046A芯片中集成的公钥硬件加速器(PKHA),就是专门为这类数学“重活”设计的协处理器。它内部有专用的算术逻辑单元(ALU)和宽位数据通路,能够以远高于软件的方式并行处理数百字节的大整数运算。理解PKHA如何工作,不仅仅是阅读手册,更是掌握如何将密码学理论高效、安全地落地到硬件中的关键。本文将深入解析PKHA中的模运算函数集,并重点剖析其核心性能秘诀——Montgomery算法在硬件中的实现与优化。

2. PKHA模运算函数库全景解析

PKHA提供了一套非常完整的模运算函数,覆盖了从基础四则运算到复杂密码学原语的所有需求。我们可以将其分为几个大类来理解,这有助于我们在实际应用中选择最合适的“工具”。

2.1 基础算术函数:构建一切的砖块

基础函数是其他复杂运算的基石。PKHA提供了最直接的模加(MOD_ADD)、模减(MOD_SUB_1,MOD_SUB_2)和模乘(MOD_MUL)。

模加(MOD_ADD)的逻辑非常直观:计算(A + B) mod N。但硬件实现时有一个关键细节:它只做一次减法。手册中明确指出,如果(A + B) >= N,则减去一个N;但如果(A + B) >= 2N,结果将不是真正的模N结果。这意味着调用者必须确保输入A和B都小于N,且它们的和小于2N,否则需要软件层进行预处理或后处理。这种设计是性能与电路复杂度的折衷,硬件假设了一个最常见的场景(和小于2N)来优化关键路径。

模减则提供了两种视角:MOD_SUB_1计算(A - B) mod N,而MOD_SUB_2计算(B - A) mod N。它们的算法都保证了结果是非负且小于N的。具体来说,如果A >= B,直接相减;如果A < B,则计算A + N - B。这避免了负数在模运算中的处理麻烦。在实际编程中,选择哪一个取决于你的数据存放位置和操作习惯,硬件提供了灵活性。

基础模乘(MOD_MUL)是理解硬件优化的起点。它计算(A * B) mod N。但手册提示,对于需要连续乘法(如模幂)的场景,这个函数并非最优,更高效的是使用Montgomery形式的乘法例程。这是因为MOD_MUL内部需要先计算一个转换因子R^2 mod N,并将一个操作数转换为Montgomery形式,这带来了额外开销。它更适合于孤立的、单次的模乘操作。

2.2 指数与幂运算:密码学的核心引擎

模幂运算是公钥密码学(如RSA)中最耗时的操作。PKHA为此提供了强大的支持。

模幂(MOD_EXP)函数直接计算A^E mod N。它内部会自动计算R^2 mod N并将底数A转换为Montgomery形式,然后再进行指数运算。这对于执行单次RSA加密或解密非常方便。

定时均衡化模幂(MOD_EXP_TEQ)是安全增强版本。它与MOD_EXP功能完全相同,但增加了一个关键特性:对于给定的模数N和指数E的位长,其运行时间是恒定的。为什么这很重要?因为普通的模幂运算时间会随着指数E中二进制位(是0还是1)的不同而略有差异。攻击者可以通过精确测量这些时间差,结合功耗分析,来推测出指数E的值(即私钥)。MOD_EXP_TEQ通过插入伪操作或采用固定执行路径的算法,消除了这种时间侧信道泄漏。代价是性能——它通常比MOD_EXP慢,但为了抵御旁路攻击,这个代价在安全敏感场景中是必须付出的。

同步模幂(MOD_SML_EXP)是一个性能优化函数,用于同时计算A0^E * A2^B mod N。这看起来有点特殊,但它正是DSA(数字签名算法)验证步骤的核心运算。DSA验证需要计算g^H * y^R mod p,如果分别计算两次模幂再模乘,效率很低。MOD_SML_EXP利用指数运算的某些共享中间结果,将两次运算合并优化,显著提升了DSA验证的速度。使用时需要注意其特殊的输入要求:A0和A2的字节数必须相同,且需匹配A SIZE寄存器的值。

模平方(MOD_SQR)和模立方(MOD_CUBE)是模乘的特殊情况优化。平方是A * A,立方是A * A * A。硬件可以为这些特定模式设计更优的电路或算法。同样,它们也都有对应的定时均衡化版本(_TEQ)和Montgomery输入/输出版本(_IM,_IM_OM)。

2.3 数论与辅助函数:背后的数学工具

这类函数不直接用于加密,但却是密钥生成、参数验证等过程中不可或缺的。

模逆(MOD_INV)计算A^{-1} mod N,即找到一个数X,使得(A * X) mod N = 1。模逆在ECC点运算和RSA的私钥计算中至关重要。需要注意的是,模逆仅在A与N互质(即最大公约数GCD(A, N) = 1)时才存在。如果N是素数,那么所有1到N-1之间的A都有模逆。硬件在计算逆元时,通常使用扩展欧几里得算法或其变种。

最大公约数(MOD_GCD)计算两个整数A和N的最大公约数。除了用于检查互质性,它本身也是许多算法的基础。手册中有一个有趣的提示:如果输出结果放在B寄存器,那么模逆运算的结果会同时出现在A寄存器。这为某些需要连续计算GCD和逆元的算法提供了便利。

模平方根(MOD_SQRT)寻找一个数B,使得(B * B) mod N = A。这是一个比模逆更复杂的运算,并非对所有A和N都有解。如果解存在,通常有两个(B和N-B),硬件会随机返回其中一个。如果无解,结果置0并设置PRM标志位。此函数对输入大小有限制(最大128字节),且运算过程会修改PKHA RAM的多个象限,调用后需要注意上下文保存。

模约减(MOD_AMODN)是最通用的取模函数,计算A mod N。它不要求A > N,只要求N非零。当你不确定A的范围,或者需要将一个任意大整数规约到模数范围内时,这个函数就派上用场了。

Miller-Rabin素数测试(PRIME_TEST)是一个概率性素数测试函数,用于生成RSA密钥对中的大素数p和q。它接受一个候选奇数N、一个随机种子A和测试轮数t。通过t轮测试,能以极高的概率(错误概率小于4^{-t})判断N是否为素数。这是硬件加速密钥生成的关键一步。

2.4 二进制域(F2m)运算:椭圆曲线的另一基石

除了我们熟悉的整数模素数域(Fp),椭圆曲线密码学还广泛使用二进制域(F2m)。在这个域中,元素是系数为0或1的多项式,运算规则也不同。PKHA同样提供了支持。

二进制域加法(F2M_ADD)实际上就是按位异或(XOR)操作,模数N的内容被忽略,仅用其大小来确定结果位数。因此,它也可用��一个高效的比特位异或加速器。

二进制域乘法也有基础版(F2M_MUL)和Montgomery版(F2M_MUL_IM,F2M_MUL_IM_OM),其原理与整数域类似,但底层的多项式乘法和模约减算法不同,由硬件专门实现。

2.5 函数属性与错误处理:稳健编程的关键

所有PKHA函数都遵循一套统一的接口规范:

  • 输入/输出:操作数通常存放在A、B、N、E等命名的寄存器(对应PKHA RAM的不同区域)。输出可以指定存回A或B,这提供了灵活性。
  • 模数大小:支持1到512字节(即8到4096位)的模数,覆盖了从传统RSA 1024位到更安全的4096位,以及各种ECC曲线。
  • 错误报告:硬件会检查一系列错误条件,如数据大小超限、模数为偶数(某些运算要求奇数)、除零错误等,并通过状态寄存器中的错误标志位报告。在调用任何PKHA函数后,检查错误标志是必须的步骤,否则可能 silently 得到错误结果。
  • 标志位:常用的标志位包括结果为零(PIZ)、结果为一(PIO)以及素数测试结果(PRM)。这些标志可以用于简化后续的条件判断。

3. Montgomery算法:硬件加速的灵魂

如果说模运算是密码学的数学基础,那么Montgomery算法就是让这个基础在硬件中飞起来的关键。理解它,是理解PKHA高性能模乘和模幂的核心。

3.1 为什么需要Montgomery算法?

传统模乘(A * B) mod N的瓶颈在于“模约减”。完成乘法得到一个大整数积后,需要对其进行除以N的运算来取余数。大整数除法在硬件和软件中都是非常昂贵的操作。

Montgomery算法的核心思想是:换一个坐标系(称为Montgomery域)进行运算,在这个新坐标系里,“模约减”变得异常廉价,几乎和移位操作一样快。代价是进入和退出这个坐标系需要一些转换开销。因此,当需要进行一连串的模乘运算时(如模幂运算),先转换到Montgomery域,在域内完成所有连续乘法,最后再转换回来,总成本远低于每次都做传统模乘。

3.2 Montgomery形式与转换因子R

Montgomery算法定义了一个与模数N相关的常数RR通常取为比N大的、且与N互质的2的幂次方,例如R = 2^(bitlen(N))。这样,在硬件中,对R取模或除以R的操作,就变成了简单的移位和掩码,速度极快。

一个普通整数a的Montgomery形式ā定义为:ā = a * R mod N。 反之,从Montgomery形式ā转换回普通形式a则是:a = ā * R^{-1} mod N

这里R^{-1}是R在模N下的模逆,满足R * R^{-1} ≡ 1 (mod N)

3.3 Montgomery约减与乘法

算法的核心是Montgomery约减函数REDC(T)。给定一个小于N*R的整数T(通常是一次乘法的中间结果),它高效地计算T * R^{-1} mod N。这个计算过程巧妙地利用了N是奇数(对于整数域)以及R是2的幂次的特性,用加法和移位代替了除法。

基于REDCMontgomery乘法MontMul(ā, b̄)计算ā * b̄ * R^{-1} mod N。注意,输入和输出都是Montgomery形式。如果我们把两个普通数ab转换后相乘:MontMul(a*R mod N, b*R mod N) = (aR * bR) * R^{-1} mod N = abR mod N,结果正好是乘积ab的Montgomery形式!这正是我们想要的:在Montgomery域内,乘法保持了结构。

3.4 PKHA中的Montgomery函数族

PKHA手册中一系列以_IM(Input Montgomery) 和_IM_OM(Input Montgomery, Output Montgomery) 结尾的函数,正是上述思想的具体实现。理解它们的区别是正确使用的关键:

  1. MOD_MUL_IM(Montgomery输入,普通输出)

    • 输入:A, B (均为Montgomery形式ā,)
    • 运算MontMul(ā, b̄) = ā * b̄ * R^{-1} mod N
    • 输出:普通整数形式(a * b) mod N
    • 用途:当你有一系列在Montgomery域内的中间值需要连续相乘,但最终结果需要以普通整数形式输出时使用。它完成一次域内乘法并同时转换回普通域。
  2. MOD_MUL_IM_OM(Montgomery输入,Montgomery输出)

    • 输入:A, B (均为Montgomery形式ā,)
    • 运算:本质上与MontMul定义一致。
    • 输出:Montgomery形式(a * b * R) mod N
    • 用途:用于在Montgomery域内进行连续的乘法链。例如,模幂运算的平方-乘算法中,绝大部分乘法都在域内进行,使用此函数最高效。
  3. 转换的桥梁:MOD_R2函数要将一个普通整数a转换为Montgomery形式ā = a * R mod N,我们需要计算a * R mod N。直接计算需要一次模乘。但PKHA提供了一个更高效的途径:

    • 首先,调用MOD_R2函数预计算并保存常数R2 = R^2 mod N。这个计算相对耗时,但模数N固定时只需计算一次。
    • 然后,要转换a,只需计算一次MOD_MUL_IM_OM(a, R2)。因为a是普通数(可视为a * R^0),R2R^2 mod N,根据MontMul规则:MontMul(a, R2) = a * R^2 * R^{-1} mod N = a * R mod N = ā。完美地得到了a的Montgomery形式。
    • 手册特别强调:如果模数N是系统级的固定参数(如ECC中的曲线素数),务必保存好MOD_R2计算出的常数,避免重复计算,这是重要的性能优化点。

3.5 实战中的选择策略

面对这么多函数,如何选择?这里有一个简单的决策流程:

  • 单次独立模乘:使用MOD_MUL。它内部帮你处理了转换,简单直接。
  • 模幂运算(如RSA)
    1. 预计算并保存R2 = MOD_R2(N)
    2. 将底数A转换为Montgomery形式:A_mont = MOD_MUL_IM_OM(A, R2)
    3. 在Montgomery域内,使用MOD_EXP_IM进行指数运算。该函数接受Montgomery形式的底数,在域内执行平方-乘算法,最后自动将结果转换回普通形式输出。这是最高效的方式。
    4. 如果担心时序攻击,使用MOD_EXP_IM_TEQ
  • 连续的模乘链(如ECC点加、倍点)
    1. 预计算并保存R2
    2. 将所有输入操作数转换为Montgomery形式(使用MOD_MUL_IM_OMR2)。
    3. 在域内进行所有计算,使用MOD_MUL_IM_OMMOD_SQR_IM_OM等函数,结果始终保持在Montgomery域内。
    4. 所有计算结束后,将最终结果转换回普通形式:result_normal = MOD_MUL_IM_OM(result_mont, 1)。因为MontMul(result_mont, 1) = result_mont * 1 * R^{-1} mod N,即转换回普通形式。

4. 硬件驱动层实现与核心环节

理解了数学原理和函数分类,下一步就是如何驱动PKHA硬件。这通常涉及对芯片内存映射寄存器(MMR)的精确编程。

4.1 PKHA寄存器与内存布局

PKHA并非通过简单的函数调用来使用,而是通过一组命令寄存器、状态寄存器和一块专用的PKHA RAM(或称寄存器文件)进行交互。

  1. 命令寄存器 (PKHA Command Registers)

    • 操作码 (Function Mode): 写入特定的模式值(如0x0000000000000010代表MOD_ADD且输出到B)。这是手册中每个函数表格第一行列出的值。
    • 数据大小寄存器 (A Size, B Size, N Size, E Size): 分别指定操作数A、B、N、E以字节为单位的长度。这是最常出错的地方之一,必须与写入PKHA RAM的数据实际长度严格一致。
    • 使能/启动寄存器: ��入特定值以启动运算。
  2. PKHA RAM: 这是一块划分成多个“象限”(A, B, N, E等)的内存区域,用于存放输入操作数和读取输出结果。数据通常以大端序(Big-Endian)格式存放。例如,要将一个256位(32字节)的大整数写入A区域,需要将其最高有效字节放在A区域的起始地址。

  3. 状态寄存器 (Status Register): 用于轮询操作是否完成(Busy位),以及检查错误标志(Data Size Error, Modulus Even Error等)和结果标志(PIZ, PIO等)。

4.2 一次完整的函数调用流程

以下是一个调用MOD_ADD函数的典型软件流程伪代码,假设输出到B寄存器:

// 1. 检查PKHA是否空闲 while (PKHA_STATUS & BUSY_BIT) { // 等待或进行任务切换 } // 2. 清除之前的错误和状态标志 PKHA_STATUS = CLEAR_ALL_FLAGS; // 3. 将操作数写入PKHA RAM // 假设有大整数数组 A[], B[], N[],以及它们的字节长度 a_len, b_len, n_len write_to_pkha_ram(PKHA_RAM_A, A, a_len); write_to_pkha_ram(PKHA_RAM_B, B, b_len); write_to_pkha_ram(PKHA_RAM_N, N, n_len); // 4. 设置数据大小寄存器 PKHA_A_SIZE = a_len; PKHA_B_SIZE = b_len; PKHA_N_SIZE = n_len; // 对于MOD_ADD,N的大小决定了输出结果的位数 // 5. 写入命令/模式寄存器,启动运算 // MOD_ADD, output to B 的模式值为 0x0000000000000010 PKHA_FUNCTION_MODE = 0x0000000000000010; PKHA_START = 0x1; // 写入特定值启动 // 6. 等待操作完成 while (PKHA_STATUS & BUSY_BIT) { // 等待 } // 7. 检查错误标志 uint32_t status = PKHA_STATUS; if (status & DATA_SIZE_ERROR) { // 处理N大小错误(为0或>512字节) } if (status & A_SIZE_ERROR) { // 处理A长度大于N长度错误 } if (status & B_SIZE_ERROR) { // 处理B长度大于N长度错误 } // 8. 读取结果 uint8_t result[MAX_SIZE]; read_from_pkha_ram(PKHA_RAM_B, result, n_len); // 结果长度与N相同 // 9. 可选:检查结果标志 if (status & PIZ) { // 结果为零 } if (status & PIO) { // 结果为一 }

4.3 参数边界与预处理

硬件有严格的限制,软件必须确保输入合规:

  • 大小限制:确保所有操作数长度在1-512字节内,且A、B的长度不大于N的长度(对于大多数函数)。
  • 值域限制:确保A < N,B < N。对于模加,还需确保A + B < 2N以获得正确结果。
  • 奇偶性:对于要求模数N为奇数的函数(如模乘、模幂),必须在调用前确保N是奇数,否则会触发Modulus Even Error
  • 内存对齐与顺序:确认数据写入PKHA RAM的字节序(通常是大端序)和内存对齐要求(如果有)。

5. 性能优化与安全编程实践

直接使用基础函数能工作,但要想发挥PKHA的全部潜力,必须关注性能与安全。

5.1 性能优化技巧

  1. 批量操作与流水线:PKHA执行运算期间,CPU可以准备下一组数据。设计驱动时,可以采用双缓冲区等机制,实现数据准备与硬件执行的流水线,隐藏数据搬运开销。
  2. 避免不必要的转换:如前所述,对于连续模乘,务必使用Montgomery函数族(_IM_OM),并缓存R2常数。反复进出Montgomery域的代价很高。
  3. 选择正确的函数:模平方用MOD_SQR而非MOD_MUL,模立方用MOD_CUBE。硬件有针对性的优化。
  4. 数据驻留:如果可能,尽量让中间数据留在PKHA RAM中,而不是读回系统内存再写回。这需要仔细规划计算序列。
  5. 大小适配:PKHA支持变长操作。确保设置的数据大小寄存器精确反映实际数据长度,避免操作多余的前导零字节。

5.2 安全注意事项(防侧信道攻击)

旁路攻击是硬件密码模块的主要威胁。

  1. 定时攻击:这是最经典的攻击。使用定时均衡化版本函数(_TEQ)是根本解决方案。在涉及私钥(如RSA私钥指数、ECC标量)的运算中,必须使用MOD_EXP_TEQMOD_SQR_TEQ等函数。
  2. 错误信息泄露:确保应用程序不将PKHA的内部错误(如除零错误、大小错误)通过日志、响应时间或功耗差异泄露出去。错误处理路径应保持一致。
  3. 内存残留:PKHA RAM中可能残留敏感数据(如私钥、临时中间值)。在释放资源或切换任务前,应主动清零PKHA RAM的相关区域。
  4. 随机数质量PRIME_TEST函数和许多密码算法都需要高质量的随机数。确保随机种子A的熵源是可靠的。

5.3 常见问题与调试实录

在实际开发中,你可能会遇到以下问题:

问题1:计算结果全为零或明显错误。

  • 排查
    1. 首先检查状态寄存器的错误标志。90%的问题源于此。最常见的是Data Size Error(N长度设为0或超限)或A/B Size Error(操作数长度大于N长度)。
    2. 检查数据大小寄存器的值是否与写入PKHA RAM的数据实际字节数完全一致。一个常见错误是传入的字节数组包含前导零,但长度值包含了这些零。
    3. 确认写入PKHA RAM的数据字节序是否正确。硬件通常期望大端序(最高有效字节在低地址)。
    4. 对于模乘、模幂等函数,确认模数N是否为奇数。

问题2:使用Montgomery函数得到的结果不对。

  • 排查
    1. 确认你使用的函数是否正确。_IM期望输入是Montgomery形式,输出普通形式;_IM_OM输入输出都是Montgomery形式。
    2. 确认用于转换到Montgomery域的R2常数是用当前的、正确的模数N调用MOD_R2计算得到的。如果N变了,R2必须重新计算。
    3. 检查转换过程:a_mont = MOD_MUL_IM_OM(a, R2)a_normal = MOD_MUL_IM_OM(a_mont, 1)

问题3:性能没有达到预期。

  • 排查
    1. 使用性能分析工具,确认瓶颈是在PKHA计算本身,还是在数据搬运或软件开销上。
    2. 检查是否在循环中重复计算了MOD_R2。对于固定模数,必须缓存。
    3. 确认是否错误地混用了普通函数和Montgomery函数,导致频繁的格式转换。

问题4:在多任务或中断环境中,PKHA上下文被破坏。

  • 排查
    1. PKHA硬件可能是一个共享资源。需要实现互斥锁(mutex)来保证同一时间只有一个执行上下文(任务/线程/中断)使用PKHA。
    2. 如果一个高优先级任务抢占了正在使用PKHA的低优先级任务,必须在切换前保存PKHA的完整状态(所有寄存器、PKHA RAM内容),恢复时再写回。或者设计系统,让PKHA操作成为不可抢占的原子操作。

深入理解PKHA的模运算函数和Montgomery算法,不仅仅是掌握一组API,更是构建高效、安全嵌入式密码系统的核心能力。从理清基础函数的功能边界,到领悟Montgomery域转换的精妙,再到驱动层代码的稳健实现和安全考量,每一步都需要将数学理论、硬件特性和工程实践紧密结合。当你能根据不同的密码学算法(RSA, ECC, DSA)灵活选用和组合这些硬件原语,并有效规避侧信道陷阱时,你才真正驾驭了这颗安全芯片的澎湃算力。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/13 23:04:55

5步快速解锁iPhone:AppleRa1n终极绕过激活锁指南

5步快速解锁iPhone&#xff1a;AppleRa1n终极绕过激活锁指南 【免费下载链接】applera1n icloud bypass for ios 15-16 项目地址: https://gitcode.com/gh_mirrors/ap/applera1n 你是否曾经因为忘记Apple ID密码而无法激活自己的iPhone&#xff1f;或者购买的二手设备被…

作者头像 李华
网站建设 2026/6/13 23:04:52

i.MX23 USB寄存器深度解析:从IC_USB到PORTSC1的实战操作指南

1. 项目概述&#xff1a;从寄存器手册到实战代码的桥梁如果你正在基于i.MX23这颗经典的ARM9处理器开发USB功能&#xff0c;无论是做主机连接U盘&#xff0c;还是做设备模拟成U盘&#xff0c;又或是实现OTG双角色切换&#xff0c;那么你迟早要和它的USB控制器寄存器手册“硬碰硬…

作者头像 李华
网站建设 2026/6/13 22:59:58

解锁思源宋体CN:7种字重打造专业级中文排版体验

解锁思源宋体CN&#xff1a;7种字重打造专业级中文排版体验 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 你是否曾在中文排版时陷入"字体荒"的困境&#xff1f;面对有限的…

作者头像 李华
网站建设 2026/6/13 22:59:55

packwiz 最佳实践:专业模组包开发者的工作流程

packwiz 最佳实践&#xff1a;专业模组包开发者的工作流程 【免费下载链接】packwiz A command line tool for editing and distributing Minecraft modpacks, using a git-friendly TOML format. Supports CurseForge and Modrinth mods with automated updates! 项目地址: …

作者头像 李华
网站建设 2026/6/13 22:53:25

【Android】BotHub-多模型AI机器人聚合库-内置免费模型

【Android】BotHub-多模型AI机器人聚合库-内置免费模型 链接&#xff1a;https://pan.xunlei.com/s/VOuygMYYre77UFjJ5piHqsewA1?pwdp6ak# 聚合全网主流大模型AI机器人&#xff0c;一键切换GPT/ Claude等多接口。自由配置API密钥&#xff0c;对话、绘图、写文、编程多场景全…

作者头像 李华
网站建设 2026/6/13 22:51:57

如何在JupyterLab中5分钟内配置AI编程助手:Jupyter AI完整指南

如何在JupyterLab中5分钟内配置AI编程助手&#xff1a;Jupyter AI完整指南 【免费下载链接】jupyter-ai An open source extension that connects AI agents to computational notebooks in JupyterLab. 项目地址: https://gitcode.com/gh_mirrors/ju/jupyter-ai 还在为…

作者头像 李华