加密安全的伪随机随机洗牌 python 中的列表或数组

2023-12-13

我需要一个使用 CSPRNG(加密安全伪随机数生成器)的洗牌函数,并且可以手动播种以获得相同种子的相同输出。

内置的random.shuffle() 在Python中可以手动播种,但不适合加密用途并将在 python 3.11 版本中删除。

Crypto.Random.random.shuffle() 来自 PyCryptodome据我所知,不接受种子。

目前,我已经选择了内置的 Mersenne Twister。random.shuffle()函数可以对数字列表进行洗牌,但这远非理想。随机排列 numpy 数组也很受欢迎,因为内置numpy.random.shuffle 不适合用于加密目的。 数组/列表可能包含超过 100 亿个元素,因此性能和随机性是关键。

创可贴代码如下。

import numpy as np
from random import seed, shuffle
array = np.arange(10) # [0 1 2 3 4 5 6 7 8 9]
print(array)
seed(1)
shuffle(array)
print(array) # [6 8 9 7 5 3 0 4 1 2]

CSPRNG 经常遇到重新播种等问题,在运行期间从操作系统内的熵池中提取熵。因此,最好使用流密码,例如计数器模式下的 AES。

那么,洗牌操作始终以相同的方式执行也很重要。类似地,生成的比特流中的数字应始终以相同的方式运行。如果这些被优化或以其他方式改变,结果将是不同的洗牌,破坏方案。

最后,您最好自己编程,这样您就可以确保方法契约背后的代码不会改变。

对此的要求是:

  • 具有密钥大小的种子的流密码;
  • 实现“拒绝采样”以获得一定范围内的随机数;
  • Fisher-Yates 洗牌可创建完全随机的洗牌。

如果大小不符合流密码,则可以对种子进行散列并获取最左边的字节。


想法的演示(未经过充分测试或精心设计):

import numpy as np
from Crypto.Cipher import ChaCha20
from Crypto.Random import get_random_bytes

array = np.arange(100) # [0 1 2 3 4 5 6 7 8 9]

seed = bytes([0x00]) * 32 # use SHA-256 to hash different size seeds

nonce_rfc7539 = bytes([0x00]) * 12
cipher = ChaCha20.new(key=seed, nonce=nonce_rfc7539)
zerobuf = bytes([0x00]) * 5

def sample(max):
    # rejection sampling using rand(0..n * max) % max
    # the value 2 is in there to make sure the number of bits is at least
    # two higher than max, so that the chance of each candicate succeeding
    # is higher
    stream_size = (max.bit_length() + 2 + 7) // 8
    max_stream_value = 1 << (stream_size * 8)
    max_candidate = max_stream_value - max_stream_value % max
    while True:
        stream = cipher.encrypt(zerobuf[0:stream_size])
        candidate = int.from_bytes(stream, "big")
        if (candidate < max_candidate):
            break
    return candidate % max

def shuffle(list):
    # do the Fisher-Yates shuffle
    for i in range(len(list) - 1, 0, -1):
        j = sample(i + 1)
        list[i],list[j] = list[j],list[i]

# test only
print(array)
for i in range(0, 100):
    shuffle(array)
    print(array)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

加密安全的伪随机随机洗牌 python 中的列表或数组 的相关文章

  • Python:如何使用 f 字符串进行数学运算

    我正在尝试使用 python 3 6 的新 f 字符串功能编写自己的 99 瓶啤酒实现 但我被困住了 def ninety nine bottles for i in range 10 0 1 return f i bottles of b
  • 如何使用Python从pdf文件中删除页面?

    我有一些超过 500 页的 pdf 文件 但每个文件中只需要几页 有必要保留文档的标题页 我确切地知道程序应该删除的页数 如何使用安装在 MS Visual Studio 上的 Python 2 7 环境来完成此操作 尝试使用PyPDF2
  • Python Pandas:返回连续缺失的工作日日期并为数据框中缺失的日期分配比率

    Dates rates 7 26 2019 1 04 7 30 2019 1 0116 7 31 2019 1 005 8 1 2019 1 035 8 2 2019 1 01 8 6 2019 0 9886 8 12 2019 0 965
  • 意外的缩进错误,但缩进看起来正确

    我一直在尝试运行此代码 但它引发了缩进错误 无论我尝试什么 结果都是一样的 如果我删除之前的缩进def str self 和代码的其余部分 它工作正常 但在输出时 它不显示问题 而是显示 问题对象 def str self Indentat
  • 如何在Python中绘制“Trace Explorer”?

    我需要重新创建一个情节 踪迹浏览器 https www bupar net trace explorer html与下面在 R 中创建的类似 我希望使用 matplotlib 但找不到任何有关如何执行这样的跟踪资源管理器的示例或参考 有人能
  • 是否有与 f 字符串语法等效的可调用函数?

    每个人都喜欢 Python 3 6 的新 f 字符串 In 33 foo blah bang In 34 bar blah In 35 f foo bar Out 35 bang 然而 虽然在功能上非常相似 但它们的语义并不完全相同str
  • 使用 lxml 和 xpath 解析 xml 文件时如何保留 &

    我试图从输入 xml 文件中提取一些信息 并使用 lxml 和 xpath 指令将其打印到输出文件中 我在读取如下所示的 xml 标签时遇到问题
  • Python 的贝叶斯垃圾邮件过滤库

    我正在寻找一个可以进行贝叶斯垃圾邮件过滤的 Python 库 我查看了 SpamBayes 和 OpenBayes 但两者似乎都没有维护 我可能是错的 谁能推荐一个好的 Python 或 Clojure Common Lisp 甚至 Rub
  • lxml 属性需要完整的命名空间

    下面的代码使用 lxml python 3 3 从 Excel 2003 XML 工作簿中读取表格 该代码工作正常 但是为了通过 get 方法访问 Data 元素的 Type 属性 我需要使用键 urn schemas microsoft
  • 多维数组、Vuex 和变异

    我正在尝试添加和删除存储在 Vuex 中的多维数组中的项目 数组是一组类别 每个类别又有一个子类别 无穷大 不是简单的二维数组 示例数据集是这样的 id 123 name technology parent id null children
  • 访问具有动态名称的变量的值

    我发现了几个主题 其中讨论了在循环中动态创建单个变量是不好的做法 最好使用字典 就我而言 我不需要动态创建它们 我想要access他们在循环中 我不想用字典对于他们来说 因为这些变量在代码中的很多地方使用 并且只有一个地方我需要这种动态访问
  • 确定 TCP Listen() 队列中当前积压的连接数

    有没有办法找出currentLinux 上 TCP 套接字上等待 Accept 的连接尝试次数 我想我可以在每个事件循环上点击 EWOULDBLOCK 之前计算成功的 Accept 数量 但我使用的是隐藏这些细节的高级库 Python Tw
  • 检查 PHP 数组中哪一天不可用

    我有一个由 7 天名称组成的数组 这个数组每次都是动态的 所以我想检查数组中缺少哪一天 对于前 周一 周二 周四 周五 周六 周日 此处缺少星期三 因此输出应为星期三 有时会丢失多于一天 有时则没有 因此输出应该是包含所有丢失天数的数组 您
  • 如何将字符串转换为二进制?

    我需要一种方法来获取 python 中字符串的二进制表示形式 例如 st hello world toBinary st 是否有一个模块可以以某种巧妙的方式执行此操作 像这样的东西吗 gt gt gt st hello world gt g
  • python 格式日期时间,带有“st”、“nd”、“rd”、“th”(英文序数后缀),如 PHP 的“S”

    我想要一个 python datetime 对象来输出 并在 django 中使用结果 如下所示 Thu the 2nd at 4 30 但我在python中找不到输出的方法st nd rd or th就像我可以使用 PHP 日期时间格式一
  • python - 从完整地址获取邮政编码

    我有一个数据框 其中一列中有完整地址 我需要创建一个仅包含邮政编码的单独列 有些地址只有五位数字的邮政编码 而其他地址则有额外的四位数字 如何拆分列以获取邮政编码 示例数据 d name bob john address 123 6th S
  • 我可以在 psycopg2 中使用 md5 身份验证吗?

    经过两个小时的阅读文档 源代码和帮助线程后 我放弃了 我无法让 psycopg2 使用 md5 字符串进行身份验证 根据this http bytes com topic python answers 42597 psycopg authe
  • 如何使用symfony2中的findOneBy方法返回数组而不是对象?

    我有一种情况 我想使用 symfony2 中的 findOneBy id 方法查询数据库 namePosting this gt getDoctrine gt getRepository MyBundle Users gt findOneB
  • 需要FTP文件而不存储解释器文件通过Python保存在本地

    我正在尝试做一些图像解释器并尝试将它们直接存储到 FTP 服务器 但我的步骤是从本地文件夹上传图像 然后将其转换为蒙版图像 然后它将获得最终输出 但是在我的蒙版和最终输出场景中 临时图像被保存在本地 这是我不想要的 但如果不将图像存储在本地
  • Django MySQL 创建表时出错

    我有一个类似的问题这张票 https code djangoproject com ticket 18256在 Django 论坛上提出 我该如何解决这个问题 我还扩展了一个用户模型 如下所示 class Profile models Mo

随机推荐

  • Python:匹配之间的连续行类似于 awk

    Given 多行字符串string 已经从文件中读取file 两种图案pattern1 and pattern2它将匹配恰好一行中的子字符串string每个 这些线将称为 line1 和 line2 这些模式是正则表达式模式 但如果这样更容
  • 将带有 NodaTime 自动道具的模型发布到 WebAPI

    我们正在项目中使用 NodaTime 作为时间 日期模型 该项目是一个Web应用程序 使用WebAPI 当尝试发布包含 LocalTime autoprops 的模型时 我们收到 InsufficientExecutionStackExce
  • 无法解析 com.android.support:recyclerView-v7:26.1.0

    在我的应用程序中 我使用 RecyclerView 因为我在 Gradle 中添加了依赖文件 之后由于我在标题中放入的错误 我无法运行我的项目 Gradle apply plugin com android application andr
  • 显示器 ID 和序列号

    在 Windows 中 我们有有关 Monitos 的信息 一些唯一的名称和 ID 例如 Acer xxx 三星xxx 我想知道如何在 C 中获取信息 因为我知道我们可以从 WMI 获取序列号 根 WMI gt WmiMonitorID 以
  • 如何从 Azure 网站计划作业连接远程 SFTP

    我有一个控制台应用程序 它将被安排为 AZURE 网站中的作业 我想从该控制台应用程序连接远程 SFTP 并获取所有文件并将它们保存在 AZURE 网站内的我的文件夹中 此外 如果可能的话 在传输后将它们从 SFTP 中删除 首先 在这种情
  • Delphi 中的递归类实例大小

    Delphi中有没有办法获取类实例的实际大小 我知道 TObject 类的 InstanceSize 方法 但该方法不会为对象成员递归调用自身 例如 假设我们有两个类 type MyClass1 class private myVar1 i
  • 确认 TF2 在训练时使用我的 GPU

    我想知道在按照 TF 教程中的建议将训练数据存储在 GPU 上后 是否有办法确认我的 TF 模型正在 GPU 上进行训练 这是一个简短的代码示例 import tensorflow as tf print Num GPUs Availabl
  • 如何通过脚本向现有的谷歌表单项添加验证?

    我正在尝试为我的谷歌表单文本项添加验证 特别是文本验证 然而 在我看来 setValidation 函数仅适用于已知类型的项目 例如TextItem 据我了解 如果我通过拉取表单项 getItemById 我会得到一个通用物品 它仍然具有
  • 执行标量以在没有返回记录的情况下捕获错误

    我有下面的代码 Dim lJobName As String SQLCommand CommandText Select JobName from Jobs where Id Id SQLCommand Parameters Add New
  • 合并属于每个标准的不同产品

    我必须转换以下xml内容
  • React,状态设置器不更新值[重复]

    这个问题在这里已经有答案了 useState 无法设置文件对象 我在代码中添加了注释来解释发生的情况 const file setFile useState
  • 自定义控件中的组属性

    在我们的 IDE 例如 Visual Studio 中 如果我们显示 System Windows Forms Button 控件的属性 我们会看到一些公开另一组属性的属性 例如 平面外观 字体 位置 边距 等等 我想在自定义控件中做类似的
  • 在 ASP.NET Core Web 应用程序中使用 Identity 登录期间向用户添加声明

    Edit 2 终于想通了 查看下面已接受的答案 Edit 按照 Jason Pan 的指示 我尝试了完整的源代码 https github com affableashish blazor server auth tree feature
  • Angular 2 用空值实例化类

    如何将成员实例化为具有空值的类 Plunkr 我实例化为 public members new MemberClass 但控制台显示 Members 所以我无法设置默认的空值 所以基本上我正在尝试复制一个空结构 例如 this member
  • Highcharts - yAxis 最大数据刻度间隔

    我正在尝试动态设置最大数字的最大值 我不确定我哪里做错了 有什么帮助吗 在线演示 预期的 我得到什么 PS 我想找到最大值 例如 本例中为 100 并表明第一个 yAxisLabel 和下一个值应为负 20 等 图1 数值 39 35 19
  • 异常安全蹦床的设计模式

    这个问题源于here 然而 上一个问题的措辞非常糟糕 实际上是错误的 以至于建议我从头开始再问一次 我有一个 C 函数指针表 一些 C 代码 让我们称之为 lib X 有一个基本构建块 让我们称之为 X 对象 每个 X 对象都可以调用该表上
  • PostgreSQL如何在多个CPU之间拆分查询

    我有一个商店程序 DO STUFF obj rowFromMyTable 这需要 obj 并处理一些数据并将结果保存在独立的表中 所以我处理对象的顺序并不重要 DO STUFF objA DO STUFF objB lt gt DO STU
  • 如何在php中进行调度

    我的服务器上有一些文件 如何每天以编程方式打开它们一次 别理他们 http site com scripts video php http site com scripts music php 没有我的手 就像调度 自动 一样 即使我睡觉并
  • 语法错误:插入 } 来完成 ClassBody

    我创建了一个方法 但不断收到错误 我需要在方法末尾包含一个 我把 放进去 错误仍然存 在 如果我随后删除该 先前的方法将弹出相同的错误 并且该错误以前不存在 换句话说 如果我在最近的方法上输入 那么错误只会保留在那里 如果我删除它 它会在我
  • 加密安全的伪随机随机洗牌 python 中的列表或数组

    我需要一个使用 CSPRNG 加密安全伪随机数生成器 的洗牌函数 并且可以手动播种以获得相同种子的相同输出 内置的random shuffle 在Python中可以手动播种 但不适合加密用途并将在 python 3 11 版本中删除 Cry