Hallo Linuxer und haj,
vielen Dank fürs Mitgrübeln!
Ich bin leider nicht zum Ziel gekommen. Vermutlich fehlt es mir an zu vielen Stellen an tieferem (Crypto-)Verständnis.
Mein Skript sieht jetzt so aus:
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
use strict;
use warnings;
use Crypt::CBC;
use MIME::Base64;
use Crypt::Digest::SHA1 qw( sha1 );
use Crypt::Digest::SHA256 qw( sha256 );
use IO::Uncompress::Inflate qw(inflate $InflateError);
use IO::Compress::Deflate qw(deflate $DeflateError);
use File::Slurp;
my $xml_encr = read_file('content.xml') or die $!;
my $iv = "b6PjQ7EG+uWyhk/z29dJJQ==";
$iv = decode_base64($iv);
print "IV: $iv\n";
my $salt = "tHaDznWSd1OYCyWzFGx1YA==";
$salt = decode_base64($salt);
print "Salt: $salt\n";
my $pwd = 'pwd123';
$pwd = sha256($pwd);
print "PWD: $pwd\n\n";
my $cipher = Crypt::CBC->new(
-pass => $pwd
, -iv => $iv
, -salt => $salt
, -cipher => 'Cipher::AES'
, -chain_mode => 'cbc'
, -keysize => 32
, -pbkdf => 'pbkdf2'
, -iter => 100000
, -header => 'none'
, -padding => 'none'
);
my $xml_decr = $cipher->decrypt($xml_encr);
print $xml_decr;
print "\n\n----------------------------------------------------------------------\n\n";
my $xml_decr_inflated;
inflate \$xml_decr => \$xml_decr_inflated or die "inflate failed: $InflateError\n";
print $xml_decr_inflated;
__END__
print "\n\n----------------------------------------------------------------------\n\n";
my $txt = "Foo-nder-Bar";
my ($txt_deflated, $txt_inflated);
deflate \$txt => \$txt_deflated or die "deflate failed: $InflateError\n";
print $txt_deflated;
print "\n\n----------------------------------------------------------------------\n\n";
my $txt_deflated_encr = $cipher->encrypt($txt_deflated);
print $txt_deflated_encr;
print "\n\n----------------------------------------------------------------------\n\n";
my $txt_deflated_decr = $cipher->decrypt($txt_deflated_encr);
print $txt_deflated_decr;
print "\n\n----------------------------------------------------------------------\n\n";
inflate \$txt_deflated_decr => \$txt_inflated or die "inflate failed: $InflateError\n";
print $txt_inflated
Zu den verwendeten Dateien (content.xml, manifest.xml und die ods-Datei) siehe oben (
mein erstes Posting).
Der Teil unterhalb von Zeile 92 (bei Bedarf auskommentieren) ist ein Beispiel, in dem Text mit den aktuellen Einstellungen deflatet, encryptet und dann wieder decryptet und inflatet wird. Hier sieht man, dass es prinzipiell funktioniert, und zwar übrigens mit allen Einstellungen, die ich bisher ausprobiert habe (wenn sie nicht direkt auf Fehler liefen).
Nun fällt es mir schwer, auf eine systematische Vorgehensweise bei der Weiterarbeit zu kommen, denn es sind viele Parameter, an denen man schrauben kann. Wie die einzelnen Parameter sich (in ihrem Zusammenspiel) auswirken, kann man nicht feststellen, denn solange nicht
alles stimmt, kommt natürlich immer Datenmüll heraus. Ich habe also keine Ahnung, wie nah ich der richtigen Lösung bin.
- Ich weiß nicht, ob die beiden Änderungen in Crypt::CBC nicht zu Fehlfunktionen führen. (Es wird schon irgendeinen Grund für die Festlegung auf 8 Byte gegeben haben.) Letztlich weiß ich nicht, ob man mit Crypt::CBC überhaupt zum Ziel kommen kann.
- Ich habe nicht genau verstanden, welche der Schritte im
encryption process, bzw. im rückwärts verlaufenden Entschlüsselungsprozess explizit ausgeführt werden müssen und welche durch Crypt::CBC ausgeführt werden. Die Schlüsselerzeugung via pbkdf2 sollte z.B. inkludiert sein, wenn ich es richtig deute. (Aber wo legt man fest, ob dabei HMAC-SHA1 oder HMAC-SHA256 angewandt wird?)
- Bei manchen Parametern der Crypt::CBC weiß ich nicht, ob ich die Einträge aus dem manifest richtig interpretiert habe, und in manchen Fällen habe ich überhaupt keinen Hinweis auf die richtige Einstellung gefunden.
- Diese beiden fertigen Non-Perl-Lösungen habe ich gefunden; sie behandeln aber ältere ODF-Versionen und haben mir leider für meine Perl-Lösung auch nicht weitergeholfen:
https://selliott.org/encryption/oodecr
https://ringlord.com/odfdecrypt.html
- Und hierfür fehlen mir leider Zeit, Muße und Verständnis:
https://github.com/LibreOffice/core/tree/master/oo...
Schade. Ich lasse das jetzt so stehen und liegen – vielleicht greift es ja mal jemand auf.
Viele Grüße
payx