Scrypt + Salsa20/8 128 128
#4
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);


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