<div dir="ltr">Hi everyone!<br><br>The following short Python script takes three command-line arguments: a passphrase, an input path, and an output path.  Then it uses the passphrase to decrypt the contents of the input path, and puts the decrypted content in the output path.<br><br><span style="font-family:monospace,monospace">    from gpg import Context<br>    import sys<br><br>    pp = sys.argv[1]    # passphrase<br>    enc = sys.argv[2]   # input file (assumed to be encrypted)<br>    dec = sys.argv[3]   # output file<br><br>    with open(enc, 'rb') as reader, open(dec, 'wb') as writer, Context() as ctx:<br><br>        try:<br><br>            ctx.decrypt(reader, sink=writer, passphrase=pp)<br><br>        except Exception as e:<br>            print(str(e), file=sys.stderr)<br></span><br><br>This decryption works fine, as long as the correct passphrase is provided, but it apparently results in the caching of such correct passphrase, so that any subsequent decryption attempts succeed irrespective of the passphrase one provides.  (I give a fuller illustration of what I mean at the end of this post, together with version details.)<br><br>Clearly, there's some passphrase caching going on, but I don't really understand the details.<br><br>What I want to know is: how can I modify the Python script so that it disables the caching of passphrases?  Note that I am not interested in how to disable passphrase caching outside of the script!  I want the script to disable passphrase caching autonomously.  Is that possible?<br><br>Thank you in advance!<br><br>kj<br><br>P.S. Here's a detailed example of what I alluded to in my post.  The script ./demo.py is the one whose source I listed above.  IMPORTANT: the code given below behaved as shown only when I executed it from the command line.  If I put in a file and execute it (or source it) as a script, then all decryptions with the wrong passphrase fail, irrespective of any prior successful decryptions with the correct passphrase.<br><span style="font-family:monospace,monospace"><br>    # Prologue: preparation<br><br>    # First, define some variables<br><br>    % ORIGINAL=/tmp/original.txt<br>    % ENCRYPTED=/tmp/encrypted.gpg<br>    % DECRYPTED=/tmp/decrypted.txt<br>    % PASSPHRASE=yowzayowzayowza<br><br>    # Next, create a cleartext original:<br><br>    % echo 'Cool story, bro!' > "$ORIGINAL"<br><br>    # Next, encrypt the original using /usr/bin/gpg<br><br>    % rm -f "$ENCRYPTED"<br>    % /usr/bin/gpg --batch --symmetric --cipher-algo=AES256 --compress-algo=zlib --passphrase="$PASSPHRASE" --output="$ENCRYPTED" "$ORIGINAL"<br><br>    # Confirm encryption<br><br>    % od -c "$ENCRYPTED"<br>    0000000 214  \r 004  \t 003 002 306 366   ^ 236   5 250   a   b 361 322<br>    0000020   X 001 263 332 302 250 027 300 222 271 345 235 027   E   K 302<br>    0000040 306   - 346 372 324   o   6 304  \a   "   9 270   ~ 307 361 302<br>    0000060 227 267  \f   ` 003   & 203 317 212   ^   1 240 267 234 321   '<br>    0000100 361 363 277  \v   :  \f   6 366 036 224   R 370   E 033  \r 261<br>    0000120   9 026 337   2 363 206 017 251 027   U   A 377 336 023 217 025<br>    0000140   p 333   ; 257   b 223 223   G   <<br>    0000151<br><br></span><div><span style="font-family:monospace,monospace"><br></span></div><div><span style="font-family:monospace,monospace">    # Now, the demonstration proper.<br></span></div><div><span style="font-family:monospace,monospace"><br></span></div><div><span style="font-family:monospace,monospace">    # Initially, decryption with the wrong passphrase fails:</span></div><div><span style="font-family:monospace,monospace"></span></div><span style="font-family:monospace,monospace"><br>    % rm -f "$DECRYPTED"<br>    % python ./demo.py "certainly the wrong $PASSPHRASE" "$ENCRYPTED" "$DECRYPTED"<br>    gpgme_op_decrypt_verify: GPGME: Decryption failed<br><br></span><div><span style="font-family:monospace,monospace"><br></span></div><div><span style="font-family:monospace,monospace">    # Decryption with the right passphrase succeeds:</span></div><div><span style="font-family:monospace,monospace"></span></div><span style="font-family:monospace,monospace"><br>    % rm -f "$DECRYPTED"<br>    % python ./demo.py "$PASSPHRASE" "$ENCRYPTED" "$DECRYPTED"<br>    % od -c "$DECRYPTED"<br>    0000000   C   o   o   l       s   t   o   r   y   ,       b   r   o   !<br>    0000020  \n<br>    0000021<br><br></span><div><span style="font-family:monospace,monospace"><br></span></div><div><span style="font-family:monospace,monospace">    # After the first successful decryption with the right</span></div><div><span style="font-family:monospace,monospace"></span></div><span style="font-family:monospace,monospace">    # passphrase, decryption with the wrong passphrase always<br>    # succeeds:<br></span><div><span style="font-family:monospace,monospace"><br></span></div><div><span style="font-family:monospace,monospace">    % rm -f "$DECRYPTED"</span></div><div><span style="font-family:monospace,monospace"></span></div><span style="font-family:monospace,monospace">    % python ./demo.py "certainly the wrong $PASSPHRASE" "$ENCRYPTED" "$DECRYPTED"<br>    % od -c "$DECRYPTED"<br>    0000000   C   o   o   l       s   t   o   r   y   ,       b   r   o   !<br>    0000020  \n<br>    0000021<br><br></span><div><span style="font-family:monospace,monospace"><br></span></div><div><span style="font-family:monospace,monospace">    # Some relevant version info</span></div><div><span style="font-family:monospace,monospace"></span></div><span style="font-family:monospace,monospace"><br>    % python -c 'import gpg; print((gpg.version.versionstr, gpg.version.gpgme_versionstr))'<br>    ('1.10.0', '1.8.0')<br><br>    % gpg --version<br>    gpg (GnuPG) 2.1.18<br>    libgcrypt 1.7.6-beta<br>    Copyright (C) 2017 Free Software Foundation, Inc.<br>    License GPLv3+: GNU GPL version 3 or later <<a href="https://gnu.org/licenses/gpl.html">https://gnu.org/licenses/gpl.html</a>><br>    This is free software: you are free to change and redistribute it.<br>    There is NO WARRANTY, to the extent permitted by law.<br><br>    Home: /home/kj146/.gnupg<br>    Supported algorithms:<br>    Pubkey: RSA, ELG, DSA, ECDH, ECDSA, EDDSA<br>    Cipher: IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH,<br>            CAMELLIA128, CAMELLIA192, CAMELLIA256<br>    Hash: SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224<br>    Compression: Uncompressed, ZIP, ZLIB, BZIP2<br><br>    % python --version<br>    Python 3.5.3<br><br>    % uname -ar<br>    Linux parakeet 3.16.0-4-amd64 #1 SMP Debian 3.16.43-2 (2017-04-30) x86_64 GNU/Linux<br></span><br></div>