是否可以在shell skript中使用dc来绕堆栈的顶部?如果是,是否有命令来上下舍入结果?
多谢你们!
J. Hoffstein 等人所著的“数学密码学简介”一书。谈到了用 Perl 实现的 RSA 算法的三行实现,人们用它来抗议美国政府对密码学的审查:
为了抗议政府的政策,人们用一种名为 perl 的编程语言编写了 RSA 算法的三行版本,并将其印在 T 恤和汽水罐上,从而将这些产品制成军需品。原则上,在从纽约飞往欧洲的航班上穿着“支持 RSA”的 T 恤会被处以巨额罚款和 10 年监禁。
我在网上查找了实际的 Perl 程序,并在这里找到了它:http : //www.cypherspace.org/rsa/story.html。
#!/bin/perl -s-- -export-a-crypto-system-sig -RSA-3-lines-PERL
$m=unpack(H.$w,$m."\0"x$w),$_=`echo "16do$w 2+4Oi0$d*-^1[d2%Sa
2/d0<X+d*La1=z\U$n%0]SX$k"[$m*]\EszlXx++p|dc`,s/^.|\W//g,print
pack('H*',$_)while read(STDIN,$m,($w=2*$d-1+length$n&~1)/2)
Run Code Online (Sandbox Code Playgroud)
以上等价于以下内容:
#!/bin/perl -s --
$w = ( 2 * $d - 1 + length($n) ) & ~1;
while (read(STDIN, $m, $w/2)) {
$m = unpack(H.$w, $m.("\0"x$w));
$_ = `echo "16do$w 2+4Oi0$d*-^1[d2%Sa2/d0<X+d*La1=z\U$n%0]SX$k"[$m*]\EszlXx++p | dc`;
s/^.|\W//g;
print pack('H*', $_);
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:我将如何使用这个程序来加密和解密一段数据?该程序是否也支持密钥生成,或者我是否需要已经拥有密钥?
您可以在使用 'k' 命令调用 dc 后设置精度,该命令从堆栈中弹出一个数字并使用它来设置精度。但我总是希望默认小数点后三位的精度。有没有办法在 dc 中设置默认精度?
在DC中,如何从堆栈顶部弹出并丢弃一个数字?具有三个项目(1 2 3
)的堆栈应该成为具有两个项目(2 3
)的堆栈.目前我正把这个号码推到另一个堆栈(Sz),但这看起来相当蹩脚.
我已经看到了bc的这个问题,但是你怎么在直流中做到这一点?例如,如果命令是q
,我想像这样使用它:
10k
5q2q/
Run Code Online (Sandbox Code Playgroud)
要计算log_2(5)
.
关于整数加单行,存在几种建议的 shell 脚本解决方案;
然而,仔细观察所选择的每个解决方案,都存在固有的局限性:
awk
那些会以任意精度和整数大小窒息(毕竟它的行为类似于 C)bc
宁愿对任意长的输入不满意: (sed 's/$/+\\/g';echo 0)|bc
了解可能存在跨平台的可移植性问题(参见 [1] [2]),这是不受欢迎的,是否有一个通用的解决方案,它在实用性和简洁性上都是赢家?
提示:SunOS 和 MacOSX 是可移植性成为问题的示例。
菲。dc
命令可以允许处理任意大的 2^n、整数或其他输入吗?
[1] awk
:https : //stackoverflow.com/a/450821/1574494或/sf/answers/1767151781/或在 awk 中打印长整数
[2] bc
: Bash 命令对一列数字求和
当我偶然发现这个时,我正在浏览一个有趣的UNIX命令列表:
$ echo '[q]sa[ln0=aln256%Pln256/snlbx]sb3135071790101768542287578439snlbxq'|dc
GET A LIFE!
Run Code Online (Sandbox Code Playgroud)
我从来没有读过关于dc
命令的内容,所以我浏览了Wiki页面并设法学会做一些小事情:
$ echo "4 5 + p" | dc
9
$ echo "2 10 ^ p" | dc
1024
Run Code Online (Sandbox Code Playgroud)
但是,这个命令[q]sa[ln0=aln256%Pln256/snlbx]sb3135071790101768542287578439snlbxq
听起来对我来说太过分了.有没有办法让它以一种可以理解的方式解释(让我的生活回归)?