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

news2025/2/27 8:24:27

在现代密码学中,伪随机函数(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 os


class PPRFNode:
    def __init__(self, key=None):
        # 如果未提供密钥,则生成一个随机的 32 字节密钥
        self.key = key if key else os.urandom(32)
        # 初始化左右子节点为 None
        self.left = None
        self.right = None


class 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] = index
        result = encryptor.update(bytes(block)) + encryptor.finalize()
        return result

    def 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.coloradmin.cn/o/1653894.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

文件IO-使用dup2实现错误日志功能及判断文件权限,并终端输出

1:使用 dup2 实现错误日志功能 使用 write 和 read 实现文件的拷贝功能,注意,代码中所有函数后面,紧跟perror输出错误信息,要求这些错误信息重定向到错误日志 err.txt 中去 代码: #incl…

分享《2024年中国企业级SaaS行业研究报告》

(文章作者与来源:艾瑞咨询) 大浪淘沙,SaaS行业进入关键转折点,企业级SaaS的总体市场规模达到888亿元,同比增长13.0%。内外部因素叠加之下,预计三年未来企业级SaaS市场规模的增速将稳定在15%-20…

Java17的崛起——newrelic的2024 年 Java 生态系统状

newrelic 2024 年 Java 生态系统状况 原文PDF:点我下载 生产中最常用的 Java 版本 Oracle 每六个月发布一次新的 Java 版本(通常是在 3 月和 9 月),每个版本都包含一些新功能和错误修复。每两年,Oracle 都会推出一…

java--io流(一)

1. 前置知识 字符集是什么? 字符集(Character Set)是一组字符的集合,它定义了可以在计算机系统中使用的所有字符。字符集可以包括字母、数字、标点符号、控制字符、图形符号等。字符集使得计算机能够存储、处理和显示各种语言和…

Baidu Comate智能编码助手 -----AI编程帮你解放双手

目录 Baidu Comate是什么? Baidu Comate如何安装? 在VSCode上安装Baidu Comate插件 Baidu Comate如何使用,有哪些功能? 1.代码解释 2.代码注释 使用感受 如何体验 Baidu Comate是什么? Baidu Comate智能编码助手…

Comate,一款基于文心大模型的智能编程助手

一、官网 Baidu Comate官网 二、安装VSCode 如何下载安装VSCode 三、VSCode安装Comate 安装方式1 访问Comate官网点击 立即安装Comate插件 按钮快速安装 安装方式2 访问VSCode市场中的BaiduComate 点击 Install 按钮访问扩展详情界面 2.打开VSCode 3.安装Comate 四、…

图像降噪算法 NL-means 介绍

介绍 Non-Local Means 非局部均值降噪算法,简称NLM,该算法来自 2005年论文“A non-local algorithm for image denoising”;该算法是经典的图像降噪算法,是很多降噪算法的参考对比算法。 2014 年,有 NLM衍生算法NLMP…

树莓派4b测量PM2.5

1.GP2Y1010AU0F粉尘传感器连接图 2. GP2Y1010AU0F工作原理 工作原理 传感器中心有个洞可以让空气自由流过,定向发射LED光,通过检测经过空气中灰尘折射过后的光线来判断灰尘的含量。 3.源代码 main.py # coding=UTF-8 import RPi.GPIO as GPIO from ADC import ADS1015…

正点原子i.MX 93开发板,双核A55+M33+NPU,双路RS485FDCAN千兆网,异核/AI/工业开发!

正点原子i.MX 93开发板新品上市!双核A55M33NPU,双路RS485&FDCAN&千兆网,异核/AI/工业开发! NXP的i.MX系列是一系列面向多媒体和工业应用的ARM架构微处理器。从i.MX6U到i.MX93,这一系列经历了显著的发展&#x…

kubectl_进阶_安全

安全 在前面的学习中,我们知道对于资源对象的操作都是通过 APIServer 进行的,那么集群是怎样知道我们的请求就是合法的请求呢? 这就涉及到k8s的安全相关的知识了。 1. API对象 Kubernetes有一个很基本的特性就是它的所有资源对象都是模型…

TypeScript 基础学习笔记:interface 与 type 的异同

🔥 个人主页:空白诗 文章目录 TypeScript 学习笔记:interface 与 type 的异同🎣 引言🚀 快速入门1️⃣ Interface(接口)📋 定义🤝 实现💡 特点 2️⃣ Type Al…

深度学习网络:设计、开发和部署

​书籍:Deep Learning Networks: Design, Development and Deployment 作者:Jayakumar Singaram,S. S. Iyengar,Azad M. Madni 出版:Springer书籍下载-《​深度学习网络:设计、开发和部署》该教材为学生和工…

Redis 实战之RDB文件结构

RDB文件结构 databases 部分key_value_pairs 部分value 的编码字符串对象列表对象集合对象哈希表对象有序集合对象INTSET 编码的集合ZIPLIST 编码的列表、哈希表或者有序集合 总结AOF持久化的实现命令追加 AOF 文件的写入与同步小结 在本章之前的内容中, 我们介绍了…

后门通信模型剖析

通信模型剖析 梳理DinodasRAT Linux后门通信模型如下: 发送数据-通信数据结构 #原始数据 20000000e703881435b674f7de23a2f80fe35ac0ba1a46c7d96e08a8747889eacf6b1950#载荷数据 e703881435b674f7de23a2f80fe35ac0ba1a46c7d96e08a8747889eacf6b1950#数据解密 180…

Datasophon基于dinky1.0.1升级到dinky1.0.2

1.首先下载dinky1.0.2版本 dinky1.0.2下载地址 2.关闭dinky1.0.1 3.升级dinky1.0.2 3.1 解压dinky1.0.2.ta.gz tar -xzvf dinky-release-1.16-1.0.2.tar.gz -C /opt/datasophon/rm -rf dinky-release-1.16-1.0.2.tar.gz复制dinky1.0.1的配置文件到dinky1.0.2目录 cp /op…

leetcode91.解码方法(动态规划)

问题描述: 一条包含字母 A-Z 的消息通过以下映射进行了 编码 : A -> "1" B -> "2" ... Z -> "26" 要 解码 已编码的消息,所有数字必须基于上述映射的方法,反向映射回字母(可…

难定取舍,静观其变

今(2024年5月8日)天,本“人民体验官”在推广人民日报官方微博文化产品《带着笑意的眼睛,能看见最美的风景》的同时,还要联系4月初至今期间,与隐藏在《麻辣论坛》幕后的那位昵称“800727”者所爆发的一连串&…

Python:一种强大的编程语言与无限可能

引言 Python是一种易于学习且功能强大的编程语言,它被广泛用于各种领域,包括数据科学、人工智能、Web开发、系统自动化等。Python以其简洁的语法、丰富的库和易于阅读的风格,成为了许多开发者的首选。本文将探讨Python的特性和应用&#xff…

用户下单操作

一:用户下单需求分析和设计: 用户下单业务说明: 在电商系统中,用户是通过下单的方式通知商家,用户已经购买了商品,需要商家进行备货和发货。 用户下单后会产生订单相关数据,订单数据需要能够体…

pytest教程-40-钩子函数-pytest_runtest_call

领取资料,咨询答疑,请➕wei: June__Go 上一小节我们学习了pytest_runtest_setup钩子函数的使用方法,本小节我们讲解一下pytest_runtest_call钩子函数的使用方法。 pytest_runtest_call 钩子函数在 pytest 调用测试函数(即测试用…