2

我有一个带有 RC4 加密凭据的文件,负责将此类凭据写入文件的代码如下:

sub dummyFunction() {
    # Useless stuff for the scope of the problem
    # ...
    my $dbHost = "localhost";
    my $passphrase = "123"; # For example purposes, logic is different.
    my $cipher = Crypt::RC4->new($passphrase);
    return unpack('H*',$cipher->RC4($dbHost));
}

所以那段代码会返回类似:3F9FDCE3891C6B8851 但如果我尝试以下操作:

sub anotherDummyFunction() {
    my $ciphered_text = &dummyFunction();
    my $passphrase = "123";
    my $cipher = Crypt::RC4->new($passphrase);
    print $cipher->RC4(pack('H*',$ciphered_text));
}

我期待看到localhost,但相反,我得到了一堆字节,那么我将如何取回原始文本?

我已经用我的密码和我的十六进制编码字符串在线检查了 RC4 解密器,并且在线 RC4 解密器确实返回localhost,所以我确信加密的字符串是正确的。

谢谢!

PS:上面的例子在一个孤立的环境中工作,但是当涉及到我的脚本时它没有。我无法取回原始字符串。

4

1 回答 1

0

如果有人再次遇到这种情况:

如果你有类似的东西:


测试PL


 #!/usr/bin/perl
 use strict;
 use warnings;
 use Crypt::RC4;

 my $cipher = Crypt::RC4->new("passphrase123");
 print unpack('H*',$cipher->RC4("encrypt-me"))."\n";
 print unpack('H*',$cipher->RC4("encrypt-me"))."\n";

你会注意到你最终会得到两个不同的编码字符串:

 ./test.pl
 25d2aa557cccc3951074
 1e87a5db7830a0b1cabd

为了避免这种行为,我做了:

undef $cipher

就在尝试加密另一个字符串之前,然后再次实例化该对象。

如果你试试这个:

 my $cipher = Crypt::RC4->new("passphrase123");
 print unpack('H*',$cipher->RC4("encrypt-me"))."\n";
 undef($cipher);
 $cipher = Crypt::RC4->new("passphrase123");
 print unpack('H*',$cipher->RC4("encrypt-me"))."\n";

你会得到相同的字符串:

./test.pl
25d2aa557cccc3951074
25d2aa557cccc3951074

这也可以包装在子过程中,以避免一遍又一遍地定义和取消定义对象。

sub encryptString()
{
    my ($string,$passphrase) = @_;
    my $cipher = Crypt::RC4->new($passphrase);
    return unpack('H*',$cipher->RC4($string));
}
于 2012-06-06T21:45:48.907 回答