从bash到perl的简单翻译 - 比特币私钥导入格式

时间:2013-04-19 22:18:22

标签: perl bash bitcoin

我正在研究Perl中的比特币大脑钱包发生器。 我无法正确地完成最后一步(base58编码)以生成私钥(导入格式)。

我找到了一个非常简单的bash脚本来完成这项工作,我希望将它翻译成Perl,这样我就可以在Perl上完全生成密钥。

有人可以帮我将以下bash代码翻译成Perl sub吗?

#!/bin/bash
base58=({1..9} {A..H} {J..N} {P..Z} {a..k} {m..z})
bc <<<"ibase=16; n=${1^^}; while(n>0) { n%3A ; n/=3A }" |
tac |
while read n
do echo -n ${base58[n]}
done
编辑:谢谢Barmar! 它更接近,但不起作用。我做了什么来获得最接近的结果是:     

sub encode_base58sp {
    my $in = shift;
    my $out = '';
    my @base58 = (1 .. 9, 'A' .. 'H', 'J' .. 'N', 'P' .. 'Z', 'a' .. 'k', 'm' .. 'z');
    my $n = hex($in);
    while ($n > 1) {
       my $remain = $n % 58;
       $out = $base58[$remain] . $out;
       $n /= 58;
    }
    return $out;
}    

有了这个我得到前9个字符没关系,但其余的都错了...... 有什么想法吗?

2 个答案:

答案 0 :(得分:2)

use bignum; # Get arbitrary precision arithmetic

# base58=({1..9} {A..H} {J..N} {P..Z} {a..k} {m..z})
my @base58 = (1 .. 9, 'A' .. 'H', 'J' .. 'N', 'P' .. 'Z', 'a' .. 'k', 'm' .. 'z');
# ibase=16; n=${1^^};
my $n = hex($ARGV[0]);
# while(n>0)
my $result = "";
while ($n > 0) {
  # n%3A, tac, and echo ${base58[n]} (hex 3A == dec 58)
  $result = $base58[$n % 58] . $result;
  # n/=3A
  $n /= 58;
}
print "$result\n";

答案 1 :(得分:0)

谢谢Barmar,

它与“使用bigrat”合作; (对Perl的透明BigNumber / BigRational支持)。

这是解决方案(根据您的翻译而来):     

 sub encode_Base58Check {
    use bigrat;
    my $in = shift;
    my $out = '';
    my @base58 = (1 .. 9, 'A' .. 'H', 'J' .. 'N', 'P' .. 'Z', 'a' .. 'k', 'm' .. 'z');
    my $n = hex($in);
    while ($n > 1) {
       $out = $base58[$n % 58] . $out;
       $n /= 58;
    }
    return $out;
}      

谢谢!