1
0
mirror of https://github.com/hashcat/hashcat.git synced 2025-07-01 12:22:37 +00:00
hashcat/tools/test_modules/m33500.pm
2025-05-18 21:07:44 +02:00

85 lines
1.6 KiB
Perl

#!/usr/bin/env perl
##
## Author......: See docs/credits.txt
## License.....: MIT
##
use strict;
use warnings;
use Crypt::RC4;
sub module_constraints { [[-1, -1], [-1, -1], [5, 5], [-1, -1], [-1, -1]] }
sub module_generate_hash
{
my $word = shift;
my $dropN = shift;
my $ciphertext = shift;
my $plaintext_offset = shift;
my $plaintext = shift;
if (!defined $plaintext || !defined $dropN)
{
$dropN = random_number (0, 512);
$plaintext = random_string (random_number (5, 64));
}
my $cipher = Crypt::RC4->new ($word);
if ($dropN gt 0)
{
$cipher->RC4("\x00" x $dropN);
}
my $digest = unpack ("H*", $cipher->RC4 ($plaintext));
if (defined $ciphertext)
{
if (substr ($ciphertext, 0, 10) eq $digest)
{
$digest = $ciphertext;
}
}
my $hash = sprintf ('$rc4$40$%d$%s$0$%s', $dropN, $digest, substr (unpack ("H*", $plaintext), 0, 10));
return $hash;
}
sub module_verify_hash
{
my $line = shift;
my ($hash, $word) = split (':', $line);
return unless defined $hash;
return unless defined $word;
my $signature = substr ($hash, 0, 8);
return unless ($signature eq "\$rc4\$40\$");
my @data = split ('\$', $hash);
return unless scalar (@data) == 7;
shift @data;
shift @data;
shift @data;
my $dropN = shift @data;
my $ciphertext = shift @data;
my $plaintext_offset = shift @data;
my $plaintext = pack ("H*", shift @data);
my $word_packed = pack_if_HEX_notation ($word);
my $new_hash = module_generate_hash ($word_packed, $dropN, $ciphertext, $plaintext_offset, $plaintext);
return ($new_hash, $word);
}
1;