2012-02-02 81 views
-1

有人可以帮助我将此VB函数转换为Perl(PHP,Ruby或Python也可以)吗?将VB函数转换为Perl

Public Function CFUSION_ENCRYPT(ByVal Password As String, ByVal Key As String) As String 
    Dim NewValue As String 
    Dim TempValue As String 
    NewValue = "" 
    For i = 1 To Len(Password) 
    TempValue = Asc(Mid(Key, i, 1)) Xor Asc(Mid(Password, i, 1)) 
    NewValue = NewValue & Format(Hex(TempValue), "00") 
    Next 
    CFUSION_ENCRYPT = NewValue 
End Function 

非常感谢!

+1

我想你应该尝试一下,然后寻求帮助,如果你会被卡住。 – vmpstr 2012-02-02 17:18:56

+0

如果密码长于密钥会发生什么情况? – ikegami 2012-02-02 20:06:51

+0

这是**不**加密。它至多是一个争夺或密码。 – 2012-02-02 20:09:06

回答

0

在PHP:

function cfusion_encrypt($password, $key) { 
    $new = ''; 
    $tmp = ''; 
    for($i = 0, $l = strlen($password); $i < $l; ++i) { 
    $tmp = ord(substr($key, $i, 1))^ord(substr($password, $i, 1)); 
    $new &= sprintf('%02X', $tmp); 
    } 
    return $new; 
} 

请测试,如果结果真的一样

+0

工作好,谢谢knittl。 – bsteo 2012-02-02 17:38:43

0

我的Perl的有点生疏了,这里是一个Python版本(未经测试):

def CFUSION_ENCRYPT(password, key): 
    if len(password) > len(key): 
     raise Exception('Key must be at least as long as password') 

    result = '' 
    for password_char, key_char in zip(password, key): 
     result += '%0.2X' % (ord(key_char)^ord(password_char)) 
    return result 

希望你没有使用这个任何应该是加密强的东西...

+0

谢谢卡梅隆,你的港口工程也很好,不,我只是测试一些历史密码方法。 – bsteo 2012-02-02 17:39:39

2

那么,什么赫克...的Perl:

sub cfusion_encrypt 
{ 
    my ($password, $key) = @_; 

    my @p = split(//, $password); 
    my @k = split(//, $key); 
    my $end = $#p < $#k ? $#p : $#k; # which is shorter, key or password? 
    my @result =(); 

    for my $i (0 .. $end) 
    { 
     push @result, sprintf('%0.2x', ord($p[$i]^$k[$i])); 
    } 

    join('', @result); 
} 

像@Cameron表示,不认为这是很好的加密。你也可以确保密钥至少和密码一样长。

+0

感谢theglauber,这也是甜蜜的:)谢谢你们!我可以为所有人设置“答案”吗? :) – bsteo 2012-02-02 17:49:45

+0

不客气。我只是意识到,你想输出作为一串十六进制数字,所以我修正了我的代码上面。 – theglauber 2012-02-02 18:19:18

2

只是theglauber高尔夫排序的:

join('', List::MoreUtils::pairwise { 
       $a and $b and $a^$b or ''; 
      } 
      @{[ split(//, $password) ]} 
      , @{[ split(//, $key) ]} 
     );