my $ITERATIONS = 10000;
#
# Example
#
my $pass = "mysecretpassword";
my $blob = "wM+CSmCIIlaofXHPxCRFqbcPvEDZESBYM1XdAE8VFanedCIXvDEEt15nhzdv1pqzkW0MCQDBA5T1W1/Ltg7lKBszkoJJ1PtVHOpTn/afhvLyIp2VBBV1Tuj4s8LGo2GM9KOHn1Hn5BC1YhjP56opGrJlsIT9qnuGYHT8EtA5IiHP4zB4fwgGqDhtX+QUJi4rdm+apXZ1DpRvDq5J+bCca2GHXzU5H57Esn3THPXev3RdlkmjhuXVjV8=";
my $iv = "ejhZW94EsJZ049Sb/at0Xg==";
my $salt = "jgW3gi0eyPtXXguqMzi6uGyuR6m+lgQXw8onqivK5w0=";
#
# Start
#
my $blob_bin = decode_base64 ($blob);
my $iv_bin = decode_base64 ($iv);
my $salt_bin = decode_base64 ($salt);
my $data = substr ($blob_bin, 0, 169);
my $tag = substr ($blob_bin, 169, 16); # last 16 bytes make up the random tag
my $pbkdf2 = Crypt::PBKDF2->new
(
hasher => Crypt::PBKDF2->hasher_from_algorithm ('HMACSHA2', 256),
iterations => $ITERATIONS
);
my $key = $pbkdf2->PBKDF2 ($salt_bin, $pass);
# AES GCM
my $aes = Crypt::AuthEnc::GCM->new ("AES", $key, $iv_bin);
my $plain_text = $aes->decrypt_add ($data);
my $result_tag = $aes->decrypt_done ($tag);
if ($result_tag eq 1)
{
print "Password found: '$pass'\n";
exit (0);
}
exit (1);
public string password = "mysecretpassword";
public string blob = "wM+CSmCIIlaofXHPxCRFqbcPvEDZESBYM1XdAE8VFanedCIXvDEEt15nhzdv1pqzkW0MCQDBA5T1W1/Ltg7lKBszkoJJ1PtVHOpTn/afhvLyIp2VBBV1Tuj4s8LGo2GM9KOHn1Hn5BC1YhjP56opGrJlsIT9qnuGYHT8EtA5IiHP4zB4fwgGqDhtX+QUJi4rdm+apXZ1DpRvDq5J+bCca2GHXzU5H57Esn3THPXev3RdlkmjhuXVjV8=";
public string iv = "ejhZW94EsJZ049Sb/at0Xg==";
public string salt = "jgW3gi0eyPtXXguqMzi6uGyuR6m+lgQXw8onqivK5w0=";
private byte[] DecodeBase64(string value)
{
byte[] data = Convert.FromBase64String(value);
return data;
}
private void Form1_Load(object sender, EventArgs e)
{
var blob_bin = DecodeBase64(blob);
var iv_bin = DecodeBase64(iv);
var salt_bin = DecodeBase64(salt);
var data = Encoding.UTF8.GetString(blob_bin);
data = data.Substring(0, 169);
var tag = Encoding.UTF8.GetString(blob_bin);
tag = tag.Substring(169, 16);
byte[] key;
using (var pbkdf2 = new Rfc2898DeriveBytes(
password,
salt_bin,
10000,
HashAlgorithmName.SHA256))
{
key = pbkdf2.GetBytes(32);
}
string result = Decrypt(data, key,iv_bin,Encoding.UTF8.GetBytes(tag));
}
public string Decrypt(string cipher, byte[] key, byte[] iv, byte[] tag)
{
byte[] content = Convert.FromBase64String(cipher);
using var aes = new AesGcm(key);
byte[] result = null;
aes.Decrypt(iv, content, tag, null);
return Encoding.UTF8.GetString(result);
}
public string Decrypt(string cipher, byte[] key, byte[] iv, byte[] tag)
{
byte[] content = Convert.FromBase64String(cipher);
using var aes = new AesGcm(key);
byte[] result = null;
aes.Decrypt(iv, content, tag, null);
return Encoding.UTF8.GetString(result);
}
foreach (string line in System.IO.File.ReadLines("inputdata.txt"))
{
dataGridView1.Rows.Add(line.Split(':')[0], line.Split(':')[1], line.Split(':')[2]);
}
Иван:23:Россия
:а в моём примере он используется как разделитель . Думаю вы понимаете что нужно его заменить на удобный вам
Те он берёт строку $blob потом decode_base64 и получает массив байт $blob_bin а потом снова приводит массив байт в строку и получает только первые 169 символов ? я про эту строку my $data = substr ($blob_bin, 0, 169);
Просто мне кажется что я тут мог что-то напутать , так как у себя в c# я так и сделал