我有一个带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
所以我确信加密的字符串是正确的。
谢谢!
P.S。:上面的例子在一个孤立的环境中工作,但是当涉及到我的脚本时却没有。我无法取回原来的字符串。
答案 0 :(得分:0)
如果有人再遇到这个:
如果你有类似的话:
<强> TEST.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));
}