活动介绍

基于卡片的多方计算:双辅助卡多输入与协议洗牌次数的上界

立即解锁
发布时间: 2025-08-31 01:49:35 阅读量: 6 订阅数: 19 AIGC
### 基于卡片的多方计算:双辅助卡多输入与协议洗牌次数的上界 在当今的信息时代,安全计算变得越来越重要。安全计算允许持有私有输入的参与者在不泄露过多输入值的情况下评估预定函数。而基于卡片的密码学,作为一种独特的安全计算方法,使用物理卡片组来实现这一目标。本文将深入探讨双辅助卡多输入与协议中洗牌次数的上界问题。 #### 1. 引言 安全计算能让持有私有输入的玩家在不泄露必要信息的前提下评估预定函数。基于卡片的密码学则是利用物理卡片组来实现安全计算的方法。通常使用两种卡片,背面无差别表示为“?”,正面为“♣”或“♥”。卡片按特定方式排列来表示布尔值,“♣♥ = 0”,“♥♣ = 1”。当两张面朝下的卡片按此编码规则代表一个比特“𝑥∈{0, 1}”时,这两张卡片被称为对“𝑥”的承诺,记为“? ? [𝑥]”。 ##### 1.1 Mizuki–Sone与协议 目前已知最实用的承诺格式双输入与协议是Mizuki和Sone在2009年提出的MS - AND协议,其步骤如下: 1. 放置两个对“𝑥, 𝑦∈{0, 1}”的输入承诺以及两张辅助卡,将中间两张卡片面朝下放置:“? ? [𝑥] ♣♥ ? ? [𝑦] → ? ? [𝑥] ? ? [0] ? ? [𝑦]”。 2. 重新排列序列。 3. 对六张卡片序列应用随机二分切割(RBC),即把卡片序列分成两半并随机交换左右两侧:“[? ? ? | ? ? ?] → ? ? ? ? ? ?”。 4. 再次重新排列序列。 5. 从左侧翻转两张卡片,根据两张显示卡片的顺序,得到对“𝑥∧𝑦”的承诺:“♣♥? ? [𝑥∧𝑦] ? ?” 或 “♥♣? ? ? ? [𝑥∧𝑦]”。 协议结束后,步骤5中翻转的两张卡片可作为其他协议运行中的辅助卡,称为自由卡。另外两张面朝下且不是对“𝑥∧𝑦”承诺的卡片称为垃圾承诺,通过对组成垃圾承诺的两张卡片进行洗牌并翻转,可将其转换为两张自由卡。 ##### 1.2 承诺格式多输入与协议 我们的目标是构建承诺格式多输入与协议,即给定“𝑛”个输入承诺“? ? [𝑥1] ? ? [𝑥2] · · · ? ? [𝑥𝑛]”,产生对“𝑥1 ∧𝑥2 ∧· · · ∧𝑥𝑛”的承诺。通过重复应用MS - AND协议“𝑛 - 1”次,可以构建一个承诺格式的“𝑛”输入与协议,所需辅助卡数量为2,所需洗牌次数(即随机二分切割次数)为“𝑛 - 1”。 ##### 1.3 本文贡献 在有两张辅助卡的条件下,承诺格式“𝑛”输入与协议所需洗牌次数的一个明显上界是“𝑛 - 1”。而Shinagawa和Nuida在2020年提出的“批处理”技术可以减少洗牌次数。本文将批处理技术应用于MS - AND协议,构建洗牌次数更少的双辅助卡“𝑛”输入与协议。具体来说,首先定义了通过将批处理技术应用于MS - AND协议得到的双辅助卡“𝑛”输入与协议类,然后展示了在“2 ≤ 𝑛 ≤ 500”的情况下,该类协议中所需洗牌次数最少的“𝑛”输入与协议。结果表明,所提出的通用协议在许多“𝑛”的情况下,在洗牌次数方面是最优的。对于“2 ≤ 𝑛 ≤ 500”中通用协议不是最优的“𝑛”,也找到了最优协议。 ##### 1.4 相关工作 承诺格式双输入与协议的历史可以追溯到1993年,此后发明了一些协议,2009年出现了MS - AND协议。随后,使用复杂洗牌的四卡和五卡协议也得到了发展。对于承诺格式多输入与协议,最近提出了仅使用一两次洗牌的协议,但需要大量辅助卡。此外,还有一些专门的协议也被人们所知。基于卡片的密码学研究领域近年来发展迅速,涵盖了物理零知识证明协议、私有模型安全计算、对称函数评估等多个活跃主题。 ##### 1.5 本文组织 后续内容安排如下:在第2节中,介绍批处理技术以及所需的“堆乱序洗牌”。在第3节中,展示如何将批处理技术应用于多个MS - AND协议。在第4节中,定义通过应用批处理技术得到的协议类,并将寻找洗牌次数更少的协议问题转化为“MSbatching移动序列”问题。在第5节中提出一个简单的通用协议。在第6节中,通过动态规划算法分析“MSbatching移动序列”问题,并展示在“2 ≤ 𝑛 ≤ 500”的情况下,在所有协议类中洗牌次数最少的最优“𝑛”输入与协议。最后,在第7节中给出结论。 #### 2. 预备知识 ##### 2.1 堆乱序洗牌 堆乱序洗牌是一种洗牌操作,它将卡片序列分成多个相同大小的堆,然后随机均匀地重新排列这些堆的顺序,同时保持每个堆内卡片的顺序不变。例如,对由三堆组成的九张卡片序列应用堆乱序洗牌,会以1/6的概率得到以下六种序列之一: ```plaintext [1? 2? 3? | 4? 5? 6? | 7? 8? 9?] → { 1? 2? 3? 4? 5? 6? 7? 8? 9?, 1? 2? 3? 7? 8? 9? 4? 5? 6?, 4? 5? 6? 1? 2? 3? 7? 8? 9?, 4? 5? 6? 7? 8? 9? 1? 2? 3?, 7? 8? 9? 1? 2? 3? 4? 5? 6?, 7? 8? 9? 4? 5? 6? 1? 2? 3? } ``` 堆乱序洗牌可以通过将每个堆放入信封并随机搅拌信封来轻松实现。MS - AND协议中出现的随机二分切割可以看作是对两堆(每堆三张卡片)的堆乱序洗牌。 ##### 2.2 批处理技术 批处理技术将多个可以并行执行的堆乱序洗牌组合成一个单一的堆乱序洗牌,从而减少洗牌次数。简单来说,在为每个堆乱序洗牌的堆添加带有辅助卡的“标识符”后,一起执行一次堆乱序洗牌,然后打开标识符,将每个堆放回其原始堆乱序洗牌的位置。 例如,假设要并行应用MS - AND协议中出现的两个随机二分切割(RBC),并使用批处理技术。具体步骤如下: 1. 为了识别两个RBC,使用“♣”和“♥”。在每个堆的头部放置一张用于识别的辅助卡:“♣? ? ? ♣? ? ? ♥? ? ? ♥? ? ?”。 2. 翻转标识符卡片,并对四堆应用堆乱序洗牌:“[? ? ? ? | ? ? ? ? | ? ? ? ? | ? ? ? ?] → ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?”。 3. 将标识符卡片面朝上。假设得到以下卡片序列:“♣? ? ? ♥? ? ? ♥? ? ? ♣? ? ?”。 4. 对堆进行排序,使头部为“♣”的堆在左侧,头部为“♥”的堆在右侧,就像步骤1中插入标识符卡片时一样。在上述示例中,将第四堆移到第二堆前面:“♣? ? ? ♥? ? ? ♥?
corwn 最低0.47元/天 解锁专栏
赠100次下载
继续阅读 点击查看下一篇
profit 400次 会员资源下载次数
profit 300万+ 优质博客文章
profit 1000万+ 优质下载资源
profit 1000万+ 优质文库回答
复制全文

相关推荐

史东来

安全技术专家
复旦大学计算机硕士,资深安全技术专家,曾在知名的大型科技公司担任安全技术工程师,负责公司整体安全架构设计和实施。
最低0.47元/天 解锁专栏
赠100次下载
百万级 高质量VIP文章无限畅学
千万级 优质资源任意下载
千万级 优质文库回答免费看
立即解锁

专栏目录

最新推荐

Rust模块系统与JSON解析:提升代码组织与性能

### Rust 模块系统与 JSON 解析:提升代码组织与性能 #### 1. Rust 模块系统基础 在 Rust 编程中,模块系统是组织代码的重要工具。使用 `mod` 关键字可以将代码分隔成具有特定用途的逻辑模块。有两种方式来定义模块: - `mod your_mod_name { contents; }`:将模块内容写在同一个文件中。 - `mod your_mod_name;`:将模块内容写在 `your_mod_name.rs` 文件里。 若要在模块间使用某些项,必须使用 `pub` 关键字将其设为公共项。模块可以无限嵌套,访问模块内的项可使用相对路径和绝对路径。相对路径相对

Rust开发实战:从命令行到Web应用

# Rust开发实战:从命令行到Web应用 ## 1. Rust在Android开发中的应用 ### 1.1 Fuzz配置与示例 Fuzz配置可用于在模糊测试基础设施上运行目标,其属性与cc_fuzz的fuzz_config相同。以下是一个简单的fuzzer示例: ```rust fuzz_config: { fuzz_on_haiku_device: true, fuzz_on_haiku_host: false, } fuzz_target!(|data: &[u8]| { if data.len() == 4 { panic!("panic s

iOS开发中的面部识别与机器学习应用

### iOS开发中的面部识别与机器学习应用 #### 1. 面部识别技术概述 随着科技的发展,如今许多专业摄影师甚至会使用iPhone的相机进行拍摄,而iPad的所有当前型号也都配备了相机。在这样的背景下,了解如何在iOS设备中使用相机以及相关的图像处理技术变得尤为重要,其中面部识别技术就是一个很有价值的应用。 苹果提供了许多框架,Vision框架就是其中之一,它可以识别图片中的物体,如人脸。面部识别技术不仅可以识别图片中人脸的数量,还能在人脸周围绘制矩形,精确显示人脸在图片中的位置。虽然面部识别并非完美,但它足以让应用增加额外的功能,且开发者无需编写大量额外的代码。 #### 2.

AWS无服务器服务深度解析与实操指南

### AWS 无服务器服务深度解析与实操指南 在当今的云计算领域,AWS(Amazon Web Services)提供了一系列强大的无服务器服务,如 AWS Lambda、AWS Step Functions 和 AWS Elastic Load Balancer,这些服务极大地简化了应用程序的开发和部署过程。下面将详细介绍这些服务的特点、优缺点以及实际操作步骤。 #### 1. AWS Lambda 函数 ##### 1.1 无状态执行特性 AWS Lambda 函数设计为无状态的,每次调用都是独立的。这种架构从一个全新的状态开始执行每个函数,有助于提高可扩展性和可靠性。 #####

Rust编程:模块与路径的使用指南

### Rust编程:模块与路径的使用指南 #### 1. Rust代码中的特殊元素 在Rust编程里,有一些特殊的工具和概念。比如Bindgen,它能为C和C++代码生成Rust绑定。构建脚本则允许开发者编写在编译时运行的Rust代码。`include!` 能在编译时将文本文件插入到Rust源代码文件中,并将其解释为Rust代码。 同时,并非所有的 `extern "C"` 函数都需要 `#[no_mangle]`。重新借用可以让我们把原始指针当作标准的Rust引用。`.offset_from` 可以获取两个指针之间的字节差。`std::slice::from_raw_parts` 能从

React应用性能优化与测试指南

### React 应用性能优化与测试指南 #### 应用性能优化 在开发 React 应用时,优化性能是提升用户体验的关键。以下是一些有效的性能优化方法: ##### Webpack 配置优化 通过合理的 Webpack 配置,可以得到优化后的打包文件。示例配置如下: ```javascript { // 其他配置... plugins: [ new webpack.DefinePlugin({ 'process.env': { NODE_ENV: JSON.stringify('production') } }) ],

并发编程中的锁与条件变量优化

# 并发编程中的锁与条件变量优化 ## 1. 条件变量优化 ### 1.1 避免虚假唤醒 在使用条件变量时,虚假唤醒是一个可能影响性能的问题。每次线程被唤醒时,它会尝试锁定互斥锁,这可能与其他线程竞争,对性能产生较大影响。虽然底层的 `wait()` 操作很少会虚假唤醒,但我们实现的条件变量中,`notify_one()` 可能会导致多个线程停止等待。 例如,当一个线程即将进入睡眠状态,刚加载了计数器值但还未入睡时,调用 `notify_one()` 会阻止该线程入睡,同时还会唤醒另一个线程,这两个线程会竞争锁定互斥锁,浪费处理器时间。 解决这个问题的一种相对简单的方法是跟踪允许唤醒的线

Rust应用中的日志记录与调试

### Rust 应用中的日志记录与调试 在 Rust 应用开发中,日志记录和调试是非常重要的环节。日志记录可以帮助我们了解应用的运行状态,而调试则能帮助我们找出代码中的问题。本文将介绍如何使用 `tracing` 库进行日志记录,以及如何使用调试器调试 Rust 应用。 #### 1. 引入 tracing 库 在 Rust 应用中,`tracing` 库引入了三个主要概念来解决在大型异步应用中进行日志记录时面临的挑战: - **Spans**:表示一个时间段,有开始和结束。通常是请求的开始和 HTTP 响应的发送。可以手动创建跨度,也可以使用 `warp` 中的默认内置行为。还可以嵌套

Rust数据处理:HashMaps、迭代器与高阶函数的高效运用

### Rust 数据处理:HashMaps、迭代器与高阶函数的高效运用 在 Rust 编程中,文本数据管理、键值存储、迭代器以及高阶函数的使用是构建高效、安全和可维护程序的关键部分。下面将详细介绍 Rust 中这些重要概念的使用方法和优势。 #### 1. Rust 文本数据管理 Rust 的 `String` 和 `&str` 类型在管理文本数据时,紧密围绕语言对安全性、性能和潜在错误显式处理的强调。转换、切片、迭代和格式化等机制,使开发者能高效处理文本,同时充分考虑操作的内存和计算特性。这种方式强化了核心编程原则,为开发者提供了准确且可预测地处理文本数据的工具。 #### 2. 使

Rust项目构建与部署全解析

### Rust 项目构建与部署全解析 #### 1. 使用环境变量中的 API 密钥 在代码中,我们可以从 `.env` 文件里读取 API 密钥并运用到函数里。以下是 `check_profanity` 函数的代码示例: ```rust use std::env; … #[instrument] pub async fn check_profanity(content: String) -> Result<String, handle_errors::Error> { // We are already checking if the ENV VARIABLE is set