Thread Entschlüsselung (2 answers)
Opened by MarkusH at 2016-04-02 18:11

MarkusH
 2016-04-03 09:31
#184341 #184341
User since
2012-04-08
161 Artikel
BenutzerIn
[default_avatar]
Hallo zusammen,

ich habe die Lösung gefunden.
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#!/usr/bin/perl -w
use strict;
use Crypt::Rijndael;
use Crypt::CBC;
use Convert::Base64;

my $encodedString = 'AI8Xv81IsklU/SLZDV8sW4EqUWKh4yiOm/y0WE5PPmXrciz1NyP3zDzirY1vq0/2wPD0m8ZlTHeGL4Cpygs7/CJAS9pyEz47/Apnn5qix45YpH7m2OXxug/04UyuOFnH';
my @keyArray = (231, 216, 3, 26, 247, 91, 73, 223, 222, 174, 20, 122, 30, 27, 240, 211, 219, 51, 217, 212, 22, 94, 219, 239, 147, 12, 164, 230, 73, 168, 72, 247);
my @ivArray = (222, 174, 20, 122, 30, 27, 240, 211, 95, 191, 236, 203, 64, 122, 254, 71);

my $key = CreateString(@keyArray);
my $initVector = CreateString(@ivArray);

my $decryptedString = Encode::decode("UTF-16LE",Decrypt($encodedString, $key, $initVector));
print $decryptedString;

sub Decrypt {
    my $encodedString = shift;
    my $key = shift;
    my $initVector = shift;
        
    my $base64String = DecodeBase64ToString($encodedString);
    
    my $cipher = Crypt::CBC->new(
    {
        key             => $key,            #The encryption/decryption key (required)
        cipher          => 'Rijndael',      #The cipher algorithm (defaults to Crypt::DES), or a preexisting cipher object.
        iv              => $initVector,     #The initialization vector (IV)
        header          => 'none',          #What type of header to prepend to ciphertext. One of 'salt'   -- use OpenSSL-compatible salted header 'randomiv' -- Randomiv-compatible "RandomIV" header 'none'   -- prepend no header at all
        padding         => 'standard',      #The padding method, one of "standard" (default), "space", "oneandzeroes", "rijndael_compat", "null", or "none" (default "standard").
        literal_key     => 1,               #If true, the key provided by "key" is used directly for encryption/decryption. Otherwise the actual key used will be a hash of the provided key. (default false)
        pcbc            => 0,               #Whether to use the PCBC chaining algorithm rather than the standard CBC algorithm (default false)
        keysize         => 32,              #Force the cipher keysize to the indicated number of bytes.
        blocksize       => 16               #Force the cipher blocksize to the indicated number of bytes.
    }
    );
    
    return $cipher->decrypt($base64String);
}

sub DecodeBase64ToString {
    my $encodedString = shift;
    
    return decode_base64($encodedString);
}

sub CreateString {
    my @array = @_;
    
    my @chars = ();
    
    foreach my $value (@array) {
        push(@chars, chr($value));
    }
    
    return join('', @chars);
}


Das Problem war ganz einfach ein Gedankenfehler. Ich ging davon aus, dass jedes Byte entschlüsselt werden muss, da in der C#-Methode immer mit Bytearrays gearbeitet wird.
In Perl reicht es aber, einfach nur mit den strings zu arbeiten.
Wie murphy schon anmerkte muss literal_key natürlich true sein.
Tja, viel Zeit verloren, aber auch wieder was dazugelernt. Hatte bis jetzt noch nie mit Cryptographie gearbeitet und auch noch nie Funktionen wie z.B. unpack gebraucht. Von daher ist es auch nicht ganz umsonst gewesen.
$q =~ /(bb|[^b]{2})/

View full thread Entschlüsselung