gpg4win 3.1.15

Hallo,
nach dem Update auf 3.1.5 funktionieren meine .bat Skripte zum entschlüsseln und verschlüsseln nicht mehr für Dateien, deren Name Umlaute enthalten. Mit 3.1.4 haben die Skripte funktioniert.
Die Skripte stehen im Windows SendTo Ordner und ich starte sie aus dem Explorer mit Mausklick rechts und “Senden An”.
Aus dem Explorer mit rechtem Mausklick auf GpgEX - Entschlüsseln bzw. Verschlüsseln funktioniert.
Ich vermute ich muss in der GnuPG Konfiguration die Codepage ändern, aber in welcher Datei und was muss da stehen?

Sorry, ich hatte das Thema unvollständig angegeben.
Es sollte heißen:
gpg4win 3.1.5 - Dateinamen mit Umlaut in Kommandozeile

Ich nehme an, diu meinst 3.1.15 ?

Ich habe das Problem seit 3.1.13 - meine Lösung, die jahrelang funktionierte, ist nicht im SendTo-Ordner, sondern direkt im Kontextmenü.
Das Problem ist aber das selbe.

Moin, ja da wurde zuletzt etwas geändert damit wir damit umgehen können wenn Benutzerverzeichnisse nicht nur 8 Bit, also umlaute sondern voll Unicode Zeichen enthalten. Das das dadurch aber auch die Übergabe auf der Kommandozeile anders ist finde ich persönlich ganz und gar nicht gut. Ich werde das mit den GnuPG Entwicklern auch thematisieren. Sowas kann man nicht einfach von heute auf morgen ändern ohne das vernüftig zu dokumentieren. Ich verstehe den Grund dafür aber das hätte man dann ordentlich ankündigen müssen und sich eher für ein Major release wie Gpg4win 4 aufheben sollen.

Am besten du postest mal dein script damit man schauen kann wie die Dateien übergeben werden. Und vielleicht lernen andere auch davon.

Ich glaube man müsste jetzt UTF-8 übergeben. Also sowas:
chcp 65001

list_of_files.txt (for /f “delims=” %%a in (‘dir /B /O:N’) do echo %%a)

Müsste aber selbst etwas rumprobieren wie man damit dann GnuPG aufruft. Bin leider nicht der große Batch experte. Vielleicht ist Powershell da auch etwas besser aber Encoding des Dateisystems / scripts ist auf Windows schon seit Ahnengedenken ein fürchterliches Problem. Da findet man auch jede menge zu auf Stackoverflow und ähnlichen platformen.

Hallo und vielen Dank für die Antworten.
Mein Skript zum entschlüsseln sieht so aus:

cd /D %~dp1
gpg --decrypt --output “%~n1” “%~nx1”
pause

Im Kommandofenster sehe ich dann folgendes (ich habe zwecks Datenschutz den Pfad und Dateinamen geändert):

cd /D C:\Wilfried
C:\Wilfried>gpg --decrypt --output “Schüssel.xls” “Schüssel.xls.gpg”
gpg: ‘Sch³ssel.xls.gpg’ kann nicht geöffnet werden: Invalid argument
gpg: decrypt_message failed: Invalid argument

mit chcp 65001:

gpg: ‘Schssel.xls.gpg’ kann nicht geöffnet werden: Invalid argument

mit chcp 1252:

gpg: ‘Schüssel.xls.gpg’ kann nicht geöffnet werden: Invalid argument

Soweit ich das verstanden habe, wirkt sich chcp nur auf die Ausgabe aus.

Beim entschlüsseln kann ich genauso gut GpgEX verwenden,
aber verschlüsseln möchte ich standardmäßig für 2 Berechtigte, das ist mit GpgEX umständlicher.
Oder kann ich das irgendwo als Default einstellen?

Skript zum Verschlüsseln (Benutzer-IDs geändert):

cd /D %~dp1
gpg --encrypt -r ich@invalid.invalid -r sie@invalid.invalid -u ich@invalid.invalid “%~nx1”
pause

Lösung gefunden!
Das Problem ist anscheinend entstanden durch die Änderungen in gnupg 2.2.24:

Noteworthy changes in version 2.2.24

  • Allow Unicode file names on Windows almost everywhere. Note that
    it is still not possible to use Unicode strings on the command
    line.

gpg erlaubt allerdings auch die Nutzung von stdin und stdout.
Deshalb funktioniert folgendes Skript - nicht die Dateinamen werden an gpg übergeben, sondern die Inhalte:

cd /D %~dp1
gpg --decrypt >“%~n1” <“%~nx1”
pause

Ich habe das Problem mit folgender Lösung:
(alle Angaben anonymisiert)

d:\Programme\GNU\GnuPG\kc_decrypt.cmd

@echo off
chcp 1252
rem cmd.exe auf Lucida Console umstellen
cls
echo.
echo Bitte warten, bis das Fenster ‘pinentry’ gestartet wurde.
echo.
echo Dort kannst Du die Passphrase eingeben.
echo.
echo Manche Dateien sind doppelt verschlüsselt (in alphabetischer Reihenfolge):
echo - zuerst mit email@adresse.1.de
echo - dann mit email@adresse.2.de
echo.
echo Das heißt, wenn beim Entschlüsseln email@adresse.1.de da steht, bedeutet dies nicht,
echo dass die Datei nicht auch mit email@adresse.2.de verschlüsselt ist.
echo.
echo Um dies zu überprüfen, drücke einfach ‘Esc’, wenn ‘pinentry’ läuft und dort email@adresse.1.de steht.
echo Wenn die Datei ebenfalls mit email@adresse.2.de verschlüsselt ist, erscheint ein neues ‘pinentry’-Fenster.

set encfile=%1
set decfile=%encfile:.gpg=%
set decfile=%decfile:.pgp=%

“d:\Programme\GNU\GnuPG\bin\gpg.exe” --ignore-mdc-error -v -o %decfile% --decrypt %encfile%

echo.
echo.

rem taskkill /f /im gpg-agent.exe
taskkill /f /im dbus-daemon.exe

d:\Programme\GNU\GnuPG\kc_verify.cmd

@echo off
chcp 1252
rem cmd.exe auf Lucida Console umstellen
cls

echo.
echo Wenn die Dateiendung der Signatur nicht .sig oder .asc ist, dann bitte umbenennen…
echo.
echo.
set encfile=%1
“d:\Programme\GNU\GnuPG\bin\gpg.exe” --verify --verbose %encfile%

echo.
echo.
pause

kontextcrypt.reg

Windows Registry Editor Version 5.00

; Kontext Crypt
; (C) Ralf Dauberschmidt – www.dauberschmidt.de/?p=215
; Änderung von El Narizon

[-HKEY_CLASSES_ROOT*\shell\GnuPG signieren: AliasA]
[-HKEY_CLASSES_ROOT*\shell\GnuPG verschlüsseln: AliasA && AliasB]
[-HKEY_CLASSES_ROOT*\shell\GnuPG verschlüsseln: AliasA]
[-HKEY_CLASSES_ROOT*\shell\GnuPG verschlüsseln: AliasB]
[-HKEY_CLASSES_ROOT*\shell\GnuPG verschlüsseln: AliasC]
[-HKEY_CLASSES_ROOT*\shell\GnuPG verschlüsseln: AliasD]

[HKEY_CLASSES_ROOT*\shell\GnuPG]
“Position”=“Middle”
“MUIVerb”=“GnuPG: Datei verschlüsseln oder signieren”
“Icon”=“"d:\Programme\GNU\GnuPG\GPGShell.ico"”
“SubCommands”=“”

[HKEY_CLASSES_ROOT\Folder\shell\GnuPG]
“Position”=“Middle”
“MUIVerb”=“GnuPG: Alle Dateien im Ordner verschlüsseln oder entschlüsseln”
“Icon”=“"d:\Programme\GNU\GnuPG\GPGShell.ico"”
“SubCommands”=“”

[HKEY_CLASSES_ROOT*\shell\GnuPG\shell\a.verschlusselnAliasAAliasB]
“MUIVerb”=“Datei verschlüsseln: AliasA && AliasB”
“Icon”=“"d:\Programme\GNU\GnuPG\GPGShell.ico"”

[HKEY_CLASSES_ROOT*\shell\GnuPG\shell\a.verschlusselnAliasAAliasB\command]
@=“"d:\Programme\GNU\GnuPG\bin\gpg.exe" --interactive -z 9 -v -r AliasAkey -r AliasBkey --encrypt "%1"”

[HKEY_CLASSES_ROOT*\shell\GnuPG\shell\b.verschlusselnAliasA]
“MUIVerb”=“Datei verschlüsseln: AliasA”
“Icon”=“"d:\Programme\GNU\GnuPG\GPGShell.ico"”

[HKEY_CLASSES_ROOT*\shell\GnuPG\shell\b.verschlusselnAliasA\command]
@=“"d:\Programme\GNU\GnuPG\bin\gpg.exe" --interactive -z 9 -v -r AliasAkey --encrypt "%1"”

[HKEY_CLASSES_ROOT*\shell\GnuPG\shell\c.verschlusselnAliasB]
“MUIVerb”=“Datei verschlüsseln: AliasB”
“Icon”=“"d:\Programme\GNU\GnuPG\GPGShell.ico"”

[HKEY_CLASSES_ROOT*\shell\GnuPG\shell\c.verschlusselnAliasB\command]
@=“"d:\Programme\GNU\GnuPG\bin\gpg.exe" --interactive -z 9 -v -r AliasBkey --encrypt "%1"”

[HKEY_CLASSES_ROOT*\shell\GnuPG\shell\d.verschlusselnAliasC]
“MUIVerb”=“Datei verschlüsseln: AliasC”
“Icon”=“"d:\Programme\GNU\GnuPG\GPGShell.ico"”

[HKEY_CLASSES_ROOT*\shell\GnuPG\shell\d.verschlusselnAliasC\command]
@=“"d:\Programme\GNU\GnuPG\bin\gpg.exe" --interactive -z 9 -v -r AliasCkey --encrypt "%1"”

[HKEY_CLASSES_ROOT*\shell\GnuPG\shell\e.verschlusselnAliasD]
“MUIVerb”=“Datei verschlüsseln: AliasD”
“Icon”=“"d:\Programme\GNU\GnuPG\GPGShell.ico"”

[HKEY_CLASSES_ROOT*\shell\GnuPG\shell\e.verschlusselnAliasD\command]
@=“"d:\Programme\GNU\GnuPG\bin\gpg.exe" --interactive -z 9 -v -r AliasDkey --encrypt "%1"”

[HKEY_CLASSES_ROOT*\shell\GnuPG\shell\f.verschlusselnSymmetric]
“MUIVerb”=“Datei symmetrisch verschlüsseln (Passwort eingeben)”
“Icon”=“"d:\Programme\GNU\GnuPG\GPGShell.ico"”
“CommandFlags”=dword:00000020

[HKEY_CLASSES_ROOT*\shell\GnuPG\shell\f.verschlusselnSymmetric\command]
@=“"d:\Programme\GNU\GnuPG\bin\gpg.exe" --interactive -z 9 -v --symmetric "%1"”

[HKEY_CLASSES_ROOT*\shell\GnuPG\shell\g.signierenAliasA]
“MUIVerb”=“Datei signieren: AliasA”
“Icon”=“"d:\Programme\GNU\GnuPG\GPGShell.ico"”
“CommandFlags”=dword:00000020

[HKEY_CLASSES_ROOT*\shell\GnuPG\shell\g.signierenAliasA\command]
@=“"d:\Programme\GNU\GnuPG\bin\gpg.exe" --interactive -v -u AliasAkey --detach-sign "%1"”

[HKEY_CLASSES_ROOT*\shell\GnuPG\shell\h.signierenAliasB]
“MUIVerb”=“Datei signieren: AliasB”
“Icon”=“"d:\Programme\GNU\GnuPG\GPGShell.ico"”

[HKEY_CLASSES_ROOT*\shell\GnuPG\shell\h.signierenAliasB\command]
@=“"d:\Programme\GNU\GnuPG\bin\gpg.exe" --interactive -v -u AliasBkey --detach-sign "%1"”

[HKEY_CLASSES_ROOT*\shell\GnuPG\shell\i.PassphraseVergessen]
“MUIVerb”=“Passphrase vergessen”
“Icon”=“"d:\Programme\GNU\GnuPG\GPGShell.ico"”
“CommandFlags”=dword:00000020

[HKEY_CLASSES_ROOT*\shell\GnuPG\shell\i.PassphraseVergessen\command]
@=“"d:\Programme\GNU\GnuPG\gpgconf" --reload gpg-agent”

[HKEY_CLASSES_ROOT*\shell\GnuPG\shell\j.Kill.gpg-agent]
“MUIVerb”=“gpg-agent beenden”
“Icon”=“"d:\Programme\GNU\GnuPG\GPGShell.ico"”
“CommandFlags”=dword:00000020

[HKEY_CLASSES_ROOT*\shell\GnuPG\shell\j.Kill.gpg-agent\command]
@=“taskkill /f /im gpg-agent.exe”

[HKEY_CLASSES_ROOT\Folder\shell\GnuPG\shell\a.verschlusselnAliasAAliasB]
“MUIVerb”=“Alle Dateien im Ordner verschlüsseln: AliasA && AliasB”
“Icon”=“"d:\Programme\GNU\GnuPG\GPGShell.ico"”

[HKEY_CLASSES_ROOT\Folder\shell\GnuPG\shell\a.verschlusselnAliasAAliasB\command]
@=“"d:\Programme\GNU\GnuPG\bin\gpg.exe" --interactive -z 9 -v -r AliasAkey -r AliasBkey --encrypt-files "%1\."”

[HKEY_CLASSES_ROOT\Folder\shell\GnuPG\shell\b.verschlusselnAliasA]
“MUIVerb”=“Alle Dateien im Ordner verschlüsseln: AliasA”
“Icon”=“"d:\Programme\GNU\GnuPG\GPGShell.ico"”

[HKEY_CLASSES_ROOT\Folder\shell\GnuPG\shell\b.verschlusselnAliasA\command]
@=“"d:\Programme\GNU\GnuPG\bin\gpg.exe" --interactive -z 9 -v -r AliasAkey --encrypt-files "%1\."”

[HKEY_CLASSES_ROOT\Folder\shell\GnuPG\shell\c.verschlusselnAliasB]
“MUIVerb”=“Alle Dateien im Ordner verschlüsseln: AliasB”
“Icon”=“"d:\Programme\GNU\GnuPG\GPGShell.ico"”

[HKEY_CLASSES_ROOT\Folder\shell\GnuPG\shell\c.verschlusselnAliasB\command]
@=“"d:\Programme\GNU\GnuPG\bin\gpg.exe" --interactive -z 9 -v -r AliasBkey --encrypt-files "%1\."”

[HKEY_CLASSES_ROOT\Folder\shell\GnuPG\shell\d.verschlusselnAliasC]
“MUIVerb”=“Alle Dateien im Ordner verschlüsseln: AliasC”
“Icon”=“"d:\Programme\GNU\GnuPG\GPGShell.ico"”

[HKEY_CLASSES_ROOT\Folder\shell\GnuPG\shell\d.verschlusselnAliasC\command]
@=“"d:\Programme\GNU\GnuPG\bin\gpg.exe" --interactive -z 9 -v -r AliasCkey --encrypt-files "%1\."”

[HKEY_CLASSES_ROOT\Folder\shell\GnuPG\shell\e.verschlusselnAliasD]
“MUIVerb”=“Alle Dateien im Ordner verschlüsseln: AliasD”
“Icon”=“"d:\Programme\GNU\GnuPG\GPGShell.ico"”

[HKEY_CLASSES_ROOT\Folder\shell\GnuPG\shell\e.verschlusselnAliasD\command]
@=“"d:\Programme\GNU\GnuPG\bin\gpg.exe" --interactive -z 9 -v -r AliasDkey --encrypt-files "%1\."”

[HKEY_CLASSES_ROOT\Folder\shell\GnuPG\shell\f.Entschlusseln]
“MUIVerb”=“Alle *.gpg-Dateien im Ordner entschlüsseln”
“Icon”=“"d:\Programme\GNU\GnuPG\GPGShell.ico"”
“CommandFlags”=dword:00000020

[HKEY_CLASSES_ROOT\Folder\shell\GnuPG\shell\f.Entschlusseln\command]
@=“"d:\Programme\GNU\GnuPG\bin\gpg.exe" -v --decrypt-files "%1\*.gpg"”

[HKEY_CLASSES_ROOT\Folder\shell\GnuPG\shell\g.PassphraseVergessen]
“MUIVerb”=“Passphrase vergessen”
“Icon”=“"d:\Programme\GNU\GnuPG\GPGShell.ico"”
“CommandFlags”=dword:00000020

[HKEY_CLASSES_ROOT\Folder\shell\GnuPG\shell\g.PassphraseVergessen\command]
@=“"d:\Programme\GNU\GnuPG\gpgconf" --reload gpg-agent”

[HKEY_CLASSES_ROOT\Folder\shell\GnuPG\shell\h.Kill.gpg-agent]
“MUIVerb”=“gpg-agent beenden”
“Icon”=“"d:\Programme\GNU\GnuPG\GPGShell.ico"”
“CommandFlags”=dword:00000020

[HKEY_CLASSES_ROOT\Folder\shell\GnuPG\shell\h.Kill.gpg-agent\command]
@=“taskkill /f /im gpg-agent.exe”

[HKEY_CLASSES_ROOT.gpg]
@=“gpgfile”

[HKEY_CLASSES_ROOT.gpg\shell]
[HKEY_CLASSES_ROOT.gpg\shell\Mit GnuPG &entschlüsseln]
[HKEY_CLASSES_ROOT.gpg\shell\Mit GnuPG &entschlüsseln\command]
@=“"d:\Programme\GNU\GnuPG\kc_decrypt.cmd" "%1"”

[HKEY_CLASSES_ROOT.gpg\shell\Mit GnuPG &verifizieren]
[HKEY_CLASSES_ROOT.gpg\shell\Mit GnuPG &verifizieren\command]
@=“"d:\Programme\GNU\GnuPG\kc_verify.cmd" "%1"”

[HKEY_CLASSES_ROOT\gpgfile]
[HKEY_CLASSES_ROOT\gpgfile\DefaultIcon]
@=“d:\Programme\GNU\GnuPG\GPGShell.ico”

[HKEY_CLASSES_ROOT\gpgfile\shell]
[HKEY_CLASSES_ROOT\gpgfile\shell\Mit GnuPG &entschlüsseln]
[HKEY_CLASSES_ROOT\gpgfile\shell\Mit GnuPG &entschlüsseln\command]
@=“"d:\Programme\GNU\GnuPG\kc_decrypt.cmd" "%1"”

[HKEY_CLASSES_ROOT\gpgfile\shell\Mit GnuPG &verifizieren]
[HKEY_CLASSES_ROOT\gpgfile\shell\Mit GnuPG &verifizieren\command]
@=“"d:\Programme\GNU\GnuPG\kc_verify.cmd" "%1"”

[HKEY_CLASSES_ROOT.pgp]
@=“pgpfile”

[HKEY_CLASSES_ROOT.pgp\shell]
[HKEY_CLASSES_ROOT.pgp\shell\Mit GnuPG &entschlüsseln]
[HKEY_CLASSES_ROOT.pgp\shell\Mit GnuPG &entschlüsseln\command]
@=“"d:\Programme\GNU\GnuPG\kc_decrypt.cmd" "%1"”

[HKEY_CLASSES_ROOT.pgp\shell\Mit GnuPG &verifizieren]
[HKEY_CLASSES_ROOT.pgp\shell\Mit GnuPG &verifizieren\command]
@=“"d:\Programme\GNU\GnuPG\kc_verify.cmd" "%1"”

[HKEY_CLASSES_ROOT\pgpfile]
[HKEY_CLASSES_ROOT\pgpfile\DefaultIcon]
@=“d:\Programme\GNU\GnuPG\GPGShell.ico”

[HKEY_CLASSES_ROOT\pgpfile\shell]
[HKEY_CLASSES_ROOT\pgpfile\shell\Mit GnuPG &entschlüsseln]
[HKEY_CLASSES_ROOT\pgpfile\shell\Mit GnuPG &entschlüsseln\command]
@=“"d:\Programme\GNU\GnuPG\kc_decrypt.cmd" "%1"”

[HKEY_CLASSES_ROOT\pgpfile\shell\Mit GnuPG &verifizieren]
[HKEY_CLASSES_ROOT\pgpfile\shell\Mit GnuPG &verifizieren\command]
@=“"d:\Programme\GNU\GnuPG\kc_verify.cmd" "%1"”

[HKEY_CLASSES_ROOT.sig]
@=“sigfile”

[HKEY_CLASSES_ROOT.sig\shell]
[HKEY_CLASSES_ROOT.sig\shell\Mit GnuPG &verifizieren]
[HKEY_CLASSES_ROOT.sig\shell\Mit GnuPG &verifizieren\command]
@=“"d:\Programme\GNU\GnuPG\kc_verify.cmd" "%1"”

[HKEY_CLASSES_ROOT\sigfile]
[HKEY_CLASSES_ROOT\sigfile\DefaultIcon]
@=“d:\Programme\GNU\GnuPG\GPGShell.ico”

[HKEY_CLASSES_ROOT\sigfile\shell]
[HKEY_CLASSES_ROOT\sigfile\shell\Mit GnuPG &verifizieren]
[HKEY_CLASSES_ROOT\sigfile\shell\Mit GnuPG &verifizieren\command]
@=“"d:\Programme\GNU\GnuPG\kc_verify.cmd" "%1"”

Vielen Dank für das teilen eurer Scripts. Gut das es einen workaround gibt. Die idee mit stdin und stout finde ich gut. Das ist vermutlich erstmal die beste Lösung.

Das sich CHCP auf den output auswirkt verstehe ich, aber die idee von dem snippet das ich geteilt hatte war das man durch CHCP die ausgabe von “dir” im UTF-8 encoding bekommt und dann in variablen verwenden kann.

Ich hab mal nen Fall im Tracker aufgemacht https://dev.gnupg.org/T5285 ich finde das wir da einen Weg brauchen um Dateinamen auch wieder auf der Kommandozeile übergeben zu können wenn Sie Sonderzeichen haben.

Ich habe mir daran die Zähne ausgebissen, meine am 02.02.2021 erwähnte Lösung https://wald.intevation.org/forum/message.php?msg_id=7685&group_id=11 dahingehend zu ändern.

Aber ich hatte keinen Erfolg und warte seitdem darauf, dass eine neue Version erscheint, mit der es wieder läuft. (jetzt 3.1.15)

Hallo El,
tut mir leid, dass es so schwer funktioniert. Ich es mal ausprobiert, die Umgehung per --multifile funktioniert zumindest in einem einfachen Fall für mich, siehe https://dev.gnupg.org/T5285#146359

Hilft Dir das weiter?

Gruß,
Bernhard