【密码学原语介绍】PPRF(可穿孔伪随机函数)

在现代密码学中,伪随机函数(PRF)是构建各种加密协议和系统的基石。它们提供了一种方式,通过它,给定一个密钥和一个输入,可以生成一个无法预测的伪随机输出。这种机制对于确保数据加密、身份验证和完整性验证等方面至关重要。然而,在某些应用场景中,如密钥管理和权限控制,我们需要更为灵活的PRF,能够允许在不影响整体系统安全性的前提下,动态地调整其行为。这种需求催生了穿孔伪随机函数(PPRF)的发展。


文章目录

  • PPRF介绍
  • 灵感来源
  • PPRF的核心思想
  • 应用场景
  • 简单实现
  • 参考


PPRF介绍

PPRF是一种支持“穿孔”操作的伪随机函数。这种穿孔操作能将原始的PRF密钥 k k k转化为一个新的“穿孔”密钥 k ∗ k^* k,穿孔密钥在一组特定的结合 S ⊆ { 0 , 1 } m ( λ ) S\subseteq\{0,1\}^m(\lambda) S{0,1}m(λ)上失效,但保持以下特性:

  • 功能保持性:对于所有不在集合 S S S中的 x ′ x^\prime x,有 F k ( x ′ ) = F k ∗ ( x ′ ) F_k(x^\prime)=F_{k^*}(x^\prime) Fk(x)=Fk(x),即穿孔操作不影响不在 S S S中点的函数行为。
  • 穿孔点的伪随机性:对于所有在 S S S中的 x x x,以及任何有权访问 k ∗ k^* k的多项式时间敌手, F k ∗ ( x ) F_{k^*}(x) Fk(x)的值在计算上与随机数无法区分。换句话说,对于 S S S集合中的点,虽然PRF在这些点上的行为被“遗忘”,但外部观察者无法从 k ∗ k^* k得出任何关于 F k ( x ) F_k(x) Fk(x)的原始输出信息。

灵感来源

PPRF的概念源于Goldreich, Goldwasser, 和Micali在1986年的工作,他们提出了基于树的PRF结构。在这种结构中,通过一种长度加倍的伪随机生成器(PRG),PRF能够在树的形态中展开,其中每个节点的密钥由其父节点密钥经过PRG处理得到。这样的结构特别适合于密钥的层次化管理和高效的查询处理。
其构造核心思想是: G : { 0 , 1 } λ → { 0 , 1 } 2 λ G:\{0,1\}^{\lambda}\rightarrow\{0,1\}^{2\lambda} G:{0,1}λ{0,1}2λ是一个扩充双倍长度的伪随机数生成器, G ( s ) = G 0 ( s ) ∣ ∣ G 1 ( s ) G(s)=G_0(s)||G_1(s) G(s)=G0(s)∣∣G1(s),其中 G 0 ( s ) G_0(s) G0(s) G 1 ( s ) G_1(s) G1(s)分别是 G ( s ) G(s) G(s)输出的的前一半和后一半,则一个伪随机函数定义为 F k ( ⋅ ) F_k(\cdot) Fk()

F k ( x ) = G x m ( λ ) ( G x m ( λ ) − 1 ( . . . ( G x 1 ( k ) ) ) ) F_k(x)=G_{x_{m(\lambda)}}(G_{x_{m(\lambda)-1}}(...(G_{x_1}(k)))) Fk(x)=Gxm(λ)(Gxm(λ)1(...(Gx1(k))))
其中 x 1 x 2 . . . x m ( λ ) x_1x_2...x_{m(\lambda)} x1x2...xm(λ)是输入 x x x的二进制表示, m m m是一个多项式, k ← R { 0 , 1 } λ k\leftarrow _{R}\{0,1\}^{\lambda} kR{0,1}λ

PPRF的核心思想

上述的PRF树可以用来构造一个可穿孔的PRF,给定一个基于树的PRF F F F,密钥 k k k,和希望穿孔的点 x x x,设 P x P_x Px是沿着第 x x x个叶子节点到PRF树的根的路径的节点的集合。我们可以设置穿孔的key k ∗ = { N x } k^*=\{N_x\} k={Nx} N x N_x Nx P x P_x Px中每个节点的相邻的节点的集合。
例如,如图所示,在穿孔 x = 2 x=2 x=2这个节点后(图中 k 10 k_{10} k10表示),产生的穿孔key k ∗ = { k 0 , k 1 } k^*=\{k_0,k_1\} k={k0,k1}。新的key对应于从 k 10 k_{10} k10 k k k的路径的相邻节点,使用 F k ∗ F_{k^*} Fk,除了 x = 2 x=2 x=2之外,其余所有节点均可正常使用。

在这里插入图片描述

应用场景

PPRF在多种场合显示出其独特的用途,尤其是在需要细粒度访问控制的密钥管理系统中。例如,PPRF可以用于创建一个动态的访问控制列表,其中某些特定的密钥可以被临时地禁用,而不影响系统中其他部分的安全性和功能性。此外,PPRF也适用于构建可撤销的加密系统和进行密钥轮换,这在处理大规模分布式系统中的加密密钥时尤为重要。

与常规PRF相比,PPRF提供了更高的灵活性和更细的控制力。常规PRF通常是静态的,一旦设定,其输出行为不会改变。而PPRF则允许管理员根据需要动态地修改PRF的行为,这种能力在需要严格安全控制的环境下极为宝贵。

简单实现

注意,此处的实现仅帮助理解pprf的运行逻辑,生产中请使用专门封装好的pprf组件。

from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.backends import default_backend
import osclass PPRFNode:def __init__(self, key=None):# 如果未提供密钥,则生成一个随机的 32 字节密钥self.key = key if key else os.urandom(32)# 初始化左右子节点为 Noneself.left = Noneself.right = Noneclass PPRF:def __init__(self):# 创建根节点self.root = PPRFNode()self.backend = default_backend()def aes_prg(self, key, index):""" 使用 AES-ECB 作为长度加倍的 PRG """cipher = Cipher(algorithms.AES(key), modes.ECB(), backend=self.backend)encryptor = cipher.encryptor()block = bytearray(16)block[0] = indexresult = encryptor.update(bytes(block)) + encryptor.finalize()return resultdef evaluate(self, node, path, depth=0):# 如果达到了路径的末端,返回节点的密钥if depth == len(path):return node.key# 根据路径决定向左还是向右direction = int(path[depth])if direction == 0:if node.left is None:node.left = PPRFNode(self.aes_prg(node.key, 0)[:32])return self.evaluate(node.left, path, depth + 1)else:if node.right is None:node.right = PPRFNode(self.aes_prg(node.key, 1)[:32])return self.evaluate(node.right, path, depth + 1)def puncture(self, node, path, depth=0):# 如果到达了需要被穿孔的节点if depth == len(path):node.key = None  # 清除密钥,使其成为内部节点return# 递归地向下穿孔direction = int(path[depth])if direction == 0:if node.left is None:node.left = PPRFNode(self.aes_prg(node.key, 0)[:32])self.puncture(node.left, path, depth + 1)# 将当前节点的密钥设置为未被穿孔路径的子节点的密钥node.key = self.aes_prg(node.key, 1)[:32]else:if node.right is None:node.right = PPRFNode(self.aes_prg(node.key, 1)[:32])self.puncture(node.right, path, depth + 1)# 将当前节点的密钥设置为未被穿孔路径的子节点的密钥node.key = self.aes_prg(node.key, 0)[:32]def binary_representation(x, length):# 生成二进制表示return bin(x)[2:].zfill(length)# 使用示例
pprf = PPRF()
path = binary_representation(6, 3)  # 例如:深度为 3 的路径 6 的二进制表示
print("在穿孔前评估 PPRF,路径为:", path)
output = pprf.evaluate(pprf.root, path)
print("输出:", output.hex() if output else "无输出,节点已被穿孔")pprf.puncture(pprf.root, path)
print("在路径", path, "处进行穿孔")# 尝试再次评估同一路径
try:output = pprf.evaluate(pprf.root, path)print("尝试评估被穿孔的路径:", output.hex() if output else "无输出,节点已被穿孔")
except Exception as e:print(str(e))

参考

[1] Ratliff Z, Goh W, Wieland A, et al. Holepunch: Fast, Secure File Deletion with Crash Consistency[J]. Cryptology ePrint Archive, 2023.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/691437.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通过acl设置阻止数据包通过

实验拓扑和信息如图(配置信息参考上一章内容) acl设置代码 AR4 系统是视图下 acl 2000 rule 5 deny source 10.10.10.1 0 接口0视图下 数据接收时 traffic-filter inbound acl 2000 测试结果

nacos命名空间的配置

给微服务配置namespace 给微服务配置namespace只能通过修改配置来实现。 例如,修改order-service的application.yml文件: spring:cloud:nacos:server-addr: localhost:8848discovery:cluster-name: HZnamespace: 492a7d5d-237b-46a1-a99a-fa8e98e4b0f…

第二步->手撕spring源码之bean操作

本步骤目标 本步骤继续完善 Spring Bean 容器框架的功能开发,在这个开发过程中会用到较多的接口、类、抽象类,它们之间会有类的实现、类的继承。 这一次我们把 Bean 的创建交给容器,而不是我们在调用时候传递一个实例化好的 Bean 对象&#x…

《Fundamentals of Power Electronics》——转换器的传递函数

转换器的工程设计过程主要由以下几个主要步骤组成: 1. 定义了规范和其他设计目标。 2. 提出了一种电路。这是一个创造性的过程,利用了工程师的物理洞察力和经验。 3. 对电路进行了建模。组件和系统的其他部分适当建模,通常使用供应商提供的…

网络安全等级保护的发展历程

1994年国务院147号令第一次提出,计算机信息系统实行安全等级保护,这也预示着等保的起步。 2007年《信息安全等级保护管理办法》的发布之后。是等保在各行业深耕落地的时代。 2.0是等保版本的俗称,不是等级。等保共分为五级,二级…

NodeMCU ESP8266 获取I2C从机地址

文章目录 前言关于地址位读写位程序总结前言 I2C总线上可以挂载很多的从设备,每个设备都会有一个自己唯一的一个地址; 关于地址位 通常地址位占7位数据,主设备如果需要向从机发送/接收数据,首先要发送对应从机的地址,然后会匹配总线上挂载的从机的地址; 读写位 该位…

如何使用 WavLM音频合成模型

微软亚洲研究院与 Azure 语音组的研究员们提出了通用语音预训练模型 WavLM。通过 Denoising Masked Speech Modeling 框架(核心思想是通过预测被掩蔽(即遮蔽或删除)的语音部分来训练模型,同时还包括去噪的过程)&#x…

如何到《新英格兰医学杂志》 NEJM查找下载文献

《新英格兰医学杂志》NEJM是世界上阅读、引用最广泛、影响力最大的综合性医学期刊之一。NEJM集团出版的期刊还包括NEJM Journal Watch、NEJM Catalyst及NEJM Evidence。NEJM是一份全科医学周刊,出版对生物医学科学与临床实践具有重要意义的一系列主题方面的医学研究…

数据可视化训练第四天(模拟投掷筛子并且统计频次)

投掷一个筛子 import matplotlib.pyplot as plt from random import randint import numpy as npclass Die:"""模拟投掷筛子"""def __init__(self,num_sides6):self.num_sidesnum_sidesdef roll(self):return randint(1,self.num_sides)num1000…

矩阵稀疏扫描 - 矩阵

系列文章目录 文章目录 系列文章目录前言一、题目描述二、输入描述三、输出描述四、Java代码五、测试用例提示 前言 本人最近再练习算法,所以会发布一些解题思路,希望大家多指教 一、题目描述 如果矩阵中的许多系数都为零,那么该矩阵就是稀…

最美博客POETIZE个人博客系统源码

源码说明: POETIZE个人博客系统源码 | 最美博客 这是一个基于SpringBoot、Vue2和Vue3的开源项目,支持移动端自适应,并具备完善的前台和后台管理功能。 网站分为两个模块: 1. 博客系统:包括文章、表白墙、图片墙、收…

万能自定义表单系统源码开源版 支持普通表单、付费报名、预约服务等三合一功能

源码简介 高效、灵活地收集和管理数据对于各项运营和决策至关重要,方便了各行业对数据收集的多样化需求。分享一个万能自定义表单系统源码开源,该系统拥有强大的自定义功能和广泛的适用性,支持普通表单、付费报名、预约服务等三合一功能。 …