Scrypt + Salsa20/8 128 128
#6
(08-17-2017, 08:59 AM)philsmd Wrote: It should be as easy as running the following script:

Code:
perl scrypt_converter.pl hashes.txt

where the file scrypt_converter.pl contains this code:
Code:
#!/usr/bin/env perl

#
# Author: philsmd
# Date: August 2017
# License: public domain
#

use strict;
use warnings;

use MIME::Base64;

#
# Constants:
#

my $ITOA64 = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";

#
# Helper functions:
#

sub convert_line
{
 my $line = shift;
 my $format = shift;

 my $out = "";

 if ($format == 1) # convert from Hashcat to jtr
 {
   my (undef, $N, $r, $p, $salt_base64, $digest_base64) = split (":", $line);

   return "" if (! defined ($salt_base64));

   return "" if (length ($salt_base64) < 1);

   return "" if (! defined ($digest_base64));

   return "" if (length ($digest_base64) < 1);

   my $salt = decode_base64 ($salt_base64);

   my $hash = decode_base64 ($digest_base64);
   $hash = unpack ("H*", $hash);
   $hash = hex_to_jtr ($hash);
   $hash = substr ($hash, 0, 43);

   # N
   my $N_conv = hex_to_jtr (decimal_to_hex (log ($N) / log (2)));
   $N_conv = substr ($N_conv, 0, 1);

   # r
   my $r_hex  = decimal_to_hex ($r);
   my $r_conv = uint32_to_jtr_conv ($r_hex); # pad to at least "30 bit"
   $r_conv = hex_to_jtr ($r_conv);
   $r_conv = substr ($r_conv, 0, 5); # truncate to 30 bit

   # p
   my $p_hex  = decimal_to_hex ($p);
   my $p_conv = uint32_to_jtr_conv ($p_hex);
   $p_conv = hex_to_jtr ($p_conv);
   $p_conv = substr ($p_conv, 0, 5);

   $out = sprintf ("\$7\$%s%s%s%s\$%s", $N_conv, $r_conv, $p_conv, $salt, $hash);
 }
 elsif ($format == 2) # convert from Jtr to Hashcat
 {
   my $index_last = rindex ($line, "\$");
   my $hash = substr ($line, $index_last + 1);

   my $settings = substr ($line, 3, 11);

   my $index = index ($line, "\$", 3);
   my $salt = substr ($line, 14, $index_last - 14);

   my $N_conv = substr ($settings, 0, 1);
   my $r_conv = substr ($settings, 1, 5);
   my $p_conv = substr ($settings, 6, 5);

   # N
   my $N = jtr_to_hex ($N_conv);
   $N = 1 << uint32_from_jtr_conv ($N);

   # r
   my $r = jtr_to_hex ($r_conv);
   $r = uint32_from_jtr_conv ($r);

   # p
   my $p = jtr_to_hex ($p_conv);
   $p = uint32_from_jtr_conv ($p);

   # convert hash
   my $hash_conv = jtr_to_hex ($hash);
   $hash_conv = substr ($hash_conv, 0, 64);
   my $hash_base64 = encode_base64 (pack ("H*", $hash_conv));
   $hash_base64 =~ s/[\r\n]//g;

   #convert salt
   my $salt_base64 = encode_base64 ($salt);
   $salt_base64 =~ s/[\r\n]//g;

   $out = sprintf ("SCRYPT:%i:%i:%i:%s:%s", $N, $r, $p, $salt_base64, $hash_base64);
 }

 return $out . "\n";
}

# Return codes - Scrypt formats
# 1 = Hashcat - Example: SCRYPT:16384:8:1:U29kaXVtQ2hsb3JpZGU=:cCO9yzr9c0hGHAbNgf046/2o+7qQT44+qbVD9lRdofI=
# 2 = Jtr     - Example: $7$C6..../....SodiumChloride$kBGj9fHznVYFQMEn/qDCfrDevf9YDtcDdKvEqHJLV8D

sub detect_format
{
 my $line = shift ;

 my $ret = 0;

 if (substr ($line, 0, 3) eq "\$7\$")
 {
   $ret = 2;
 }
 elsif (substr ($line, 0, 7) eq "SCRYPT:")
 {
   $ret = 1
 }

 return $ret;
}

sub jtr_to_hex
{
 my $str = shift;

 my $out = "";

 my $len = length ($str);

 for (my $i = 0; $i < $len; $i += 4)
 {
   my @nums = ();

   for (my $j = $i, my $k = 0; $k < 4; $j++, $k++)
   {
     if ($j > $len) # exception
     {
       $nums[$k] = 0;
     }
     else
     {
       $nums[$k] = index ($ITOA64, substr ($str, $j, 1));
     }
   }

   my $y = $nums[0] | ($nums[1] << 6) | ($nums[2] << 12) | ($nums[3] << 18);
   my $y1 =  $y        & 0xff;
   my $y2 = ($y >>  8) & 0xff;
   my $y3 = ($y >> 16) & 0xff;

   $out .= sprintf ("%02x%02x%02x", $y1, $y2, $y3)
 }

 return $out;
}

sub hex_to_jtr
{
 my $hex = shift;

 my $out = "";

 my $len = length ($hex);

 for (my $i = 0; $i < $len; $i += 3 * 2)
 {
   my @nums = ();

   for (my $j = $i, my $k = 0; $k < 3; $j += 2, $k++)
   {
     if ($j > $len) # exception
     {
       $nums[$k] = 0;
     }
     else
     {
       $nums[$k] = hex (substr ($hex, $j, 2));
     }
   }

   my $y = $nums[0] | ($nums[1] << 8) | ($nums[2] << 16);
   my $x1 =  $y        & 0x3f;
   my $x2 = ($y >>  6) & 0x3f;
   my $x3 = ($y >> 12) & 0x3f;
   my $x4 = ($y >> 18) & 0x3f;

   $out .= substr ($ITOA64, $x1, 1);
   $out .= substr ($ITOA64, $x2, 1);
   $out .= substr ($ITOA64, $x3, 1);
   $out .= substr ($ITOA64, $x4, 1);
 }

 return $out;
}

sub decimal_to_hex
{
 my $num = shift;

 $num = sprintf ("%x", $num);

 $num = "0" . $num unless ((length ($num) % 2) == 0);

 return $num;
}

# 1. left-to-right to right-to-left
# 2. pad to at least 30 bit (~ 4 x 8 bit blocks)

sub uint32_to_jtr_conv
{
 my $hex = shift;

 my $out = "";

 my $len = length ($hex);

 for (my $i = 0; $i < $len; $i += 2)
 {
   $out .= substr ($hex, $len - $i - 2, 2);
 }

 for (my $i = $len / 2; $i < 4; $i++)
 {
   $out .= "00";
 }

 return $out;
}

# 1. revert: right-to-left -> left-to-right
# (while skipping 00 at beginning (== end))

sub uint32_from_jtr_conv
{
 my $hex = shift;

 my $out = "";

 my $len = length ($hex);

 my $is_beginning = 1;

 for (my $i = 0; $i < $len; $i += 2)
 {
   my $num = substr ($hex, $len - $i - 2, 2);

   next if ($is_beginning && ($num eq "00"));

   $is_beginning = 0;

   $out .= $num;
 }

 return hex ($out);
}

#
# Start
#

my $INPUT = "-";

if ($ARGV[0])
{
 $INPUT = $ARGV[0];
}

my $detected_format = 0;

open (INFILE, "<" . $INPUT) or die ("ERROR: could not open input file");

while (my $line = <INFILE>)
{
 chomp $line;

 if ($detected_format == 0)
 {
   $detected_format = detect_format ($line);

   if ($detected_format == 0)
   {
     print STDERR "ERROR: could not detect hash format. EXIT\n";
     last;
   }
 }

 print STDOUT convert_line ($line, $detected_format);
}

close (INFILE);



Hey, philsmd!
Thanks a lot, this really helped me to see that my code wasn't wrong =) (I was comparing my results with john's converter).
However, hashcat is still unable to crack any Scrypt. I am using CPU with -D 1 option enabled. It also wasn't able to crack the example hash in your code (pleaseletmein).


Messages In This Thread
Scrypt + Salsa20/8 128 128 - by 0delay - 08-16-2017, 01:17 AM
RE: Scrypt + Salsa20/8 128 128 - by philsmd - 08-16-2017, 07:19 AM
RE: Scrypt + Salsa20/8 128 128 - by 0delay - 08-16-2017, 08:40 PM
RE: Scrypt + Salsa20/8 128 128 - by philsmd - 08-17-2017, 08:59 AM
RE: Scrypt + Salsa20/8 128 128 - by 0delay - 08-23-2017, 03:30 AM
RE: Scrypt + Salsa20/8 128 128 - by atom - 08-18-2017, 10:05 AM
RE: Scrypt + Salsa20/8 128 128 - by philsmd - 08-23-2017, 08:37 AM
RE: Scrypt + Salsa20/8 128 128 - by 0delay - 08-23-2017, 06:22 PM