You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TenSEAL加密10×10张量的元素访问、行列提取及子集拆分问询

TenSEAL加密张量的元素访问与子集拆分方案

TenSEAL本身没有直接的内置索引/切片方法(无论明文还是加密Tensor),因为它的张量基于CKKS/BFV同态加密方案设计,底层是打包向量结构,和TensorFlow的张量逻辑完全不同。要实现元素、行/列访问或拆分,需通过构造掩码、转置或结合明文操作的方式实现,具体方案如下:

1. 访问单个加密元素

构造仅目标位置为1、其余为0的掩码张量,与加密张量做元素乘后解密:

import tenseal as ts

# 初始化TenSEAL上下文(需生成Galois密钥支持后续操作)
context = ts.context(
    ts.SCHEME_TYPE.CKKS,
    poly_modulus_degree=8192,
    coeff_mod_bit_sizes=[60, 40, 40, 60]
)
context.generate_galois_keys()
context.global_scale = 2**40

# 创建10×10加密张量
plain_tensor = ts.plain_tensor([[i+j for j in range(10)] for i in range(10)])
enc_tensor = ts.ckks_tensor(context, plain_tensor)

# 提取第3行第4列元素(索引从0开始)
mask = [[1 if (row == 3 and col == 4) else 0 for col in range(10)] for row in range(10)]
mask_plain = ts.plain_tensor(mask)
enc_element = enc_tensor * mask_plain
# 解密后获取目标值
print(enc_element.decrypt().tolist()[3][4])

2. 提取加密张量的某一行

构造仅目标行全为1、其余行全为0的掩码,执行元素乘后解密提取:

# 提取第5行(索引从0开始)
row_mask = [[1 if row ==5 else 0 for _ in range(10)] for row in range(10)]
row_mask_plain = ts.plain_tensor(row_mask)
enc_row = enc_tensor * row_mask_plain
# 解密后取对应行
print(enc_row.decrypt().tolist()[5])

3. 提取加密张量的某一列

利用转置操作(需提前生成Galois密钥)将列转换为行,再按行提取逻辑处理:

# 提取第2列(索引从0开始)
# 先转置加密张量
enc_transposed = enc_tensor.transpose()
# 提取转置后的第2行(对应原张量的第2列)
col_mask = [[1 if row ==2 else 0 for _ in range(10)] for row in range(10)]
col_mask_plain = ts.plain_tensor(col_mask)
enc_col = enc_transposed * col_mask_plain
# 解密后整理为原列格式
decrypted_col = [row[0] for row in enc_col.decrypt().tolist()]
print(decrypted_col)

4. 拆分加密张量生成子集

通过构造目标区域为1的掩码,实现加密状态下的子集拆分;若无需保持加密状态,也可先解密为明文张量后用常规切片操作处理,再重新加密:

# 拆分出前3行前4列的子张量(加密状态下)
subset_mask = [[1 if row <3 and col <4 else 0 for col in range(10)] for row in range(10)]
subset_mask_plain = ts.plain_tensor(subset_mask)
enc_subset = enc_tensor * subset_mask_plain
# 解密后提取有效区域
decrypted_subset = [row[:4] for row in enc_subset.decrypt().tolist()[:3]]
print(decrypted_subset)

注意事项

  • 掩码操作会增加计算开销,大张量场景需尽量减少不必要的掩码使用
  • 转置、旋转等操作依赖Galois密钥,初始化上下文时必须调用generate_galois_keys()

内容的提问来源于stack exchange,提问作者Tanuja

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 09:02:28