访问加密安全随机生成器

访问加密安全随机生成器

我目前正在撰写密码学硕士论文。主要部分涉及随机性;因此,我想在介绍中制作一个小的 Tikz 图片来展示随机性的示例。当然,我可以在其他地方创建一个随机字符串并将其导入 LaTeX,但这种方法让人感觉不满意。我的问题是:有没有办法直接从 LaTeX(例如在 Tikz 图片中)访问加密安全随机数生成器?我假设我使用random()pgf math 的解决方案不是加密安全的:

\documentclass{article}
\usepackage{tikz}

\begin{document}

\begin{center}
        \begin{tikzpicture}
            \foreach \row in {0,1,...,7}{
                \foreach \column in {0,1,...,7}{
                    \pgfmathparse{random(0,1)}
                    \ifnum\pgfmathresult=1
                        \draw[fill, black] (\row, \column) rectangle (\row +1, \column + 1);
                    \fi
                }
            }
        \end{tikzpicture}
    \end{center}

\end{document}

编辑:为了更准确地说明安全性部分:我正在寻找一个随机生成器,该生成器被接受为标准,例如 Nist。对于那些对该主题更感兴趣的人,这里有一个参考

答案1

您可以使用它-shell-escape来调用平台上实现 CSPRNG 的某个程序。

在以下示例中,我使用/dev/urandom来自odHeitor 的日志,因为/dev/urandom在 macOS 上使用福尔图纳

\documentclass{article}

\ExplSyntaxOn

\NewDocumentCommand{\settorandomnumber}{m}
 {% #1 = macro to be set
  \sys_get_shell:nnN
   { od ~ -vAn ~ -N4 ~ -t ~ u4 ~ < ~ /dev/urandom } % execute
   { \endlinechar=-1 } % ignore endline
   \l_tmpa_tl % store in
  \tl_set:Nx #1 { \fp_eval:n { \l_tmpa_tl / (2^32) } } % normalize
 }

\ExplSyntaxOff

\begin{document}

\settorandomnumber\pgfmathresult \pgfmathresult

\settorandomnumber\pgfmathresult \pgfmathresult

\settorandomnumber\pgfmathresult \pgfmathresult

\settorandomnumber\pgfmathresult \pgfmathresult

\end{document}

调用会生成一个介于 0 和 2 32od − 1 (含)之间的随机整数,然后我们可以除以它来得到区间 [0,1) 内的数。

enter image description here

这也是一个“随机位生成器”:我们可以生成一个单字节数字并检查它是否大于 127。

\documentclass{article}

\ExplSyntaxOn

\NewDocumentCommand{\settorandomnumber}{m}
 {% #1 = macro to be set
  \sys_get_shell:nnN
   { od ~ -vAn ~ -N4 ~ -t ~ u4 ~ < ~ /dev/urandom } % execute
   { \endlinechar=-1 } % ignore endline
   \l_tmpa_tl % store in
  \tl_set:Nx #1 { \fp_eval:n { \l_tmpa_tl / (2^32) } } % normalize
 }

\NewDocumentCommand{\settorandombit}{m}
 {% #1 = macro to be set
  \sys_get_shell:nnN
   { od ~ -vAn ~ -N1 ~ -t ~ u4 ~ < ~ /dev/urandom } % execute
   { \endlinechar=-1 } % ignore endline
   \l_tmpa_tl % store in
  \tl_set:Nx #1 { \int_compare:nNnTF { \l_tmpa_tl } > {127} { 1 } { 0 } }

 }

\ExplSyntaxOff

\begin{document}

\settorandomnumber\pgfmathresult \pgfmathresult

\settorandomnumber\pgfmathresult \pgfmathresult

\settorandomnumber\pgfmathresult \pgfmathresult

\settorandomnumber\pgfmathresult \pgfmathresult

\settorandombit\pgfmathresult \pgfmathresult

\settorandombit\pgfmathresult \pgfmathresult

\settorandombit\pgfmathresult \pgfmathresult

\settorandombit\pgfmathresult \pgfmathresult

\end{document}

enter image description here

相关内容