我目前正在撰写密码学硕士论文。主要部分涉及随机性;因此,我想在介绍中制作一个小的 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
来自od
Heitor 的日志,因为/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) 内的数。
这也是一个“随机位生成器”:我们可以生成一个单字节数字并检查它是否大于 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}