Solved

Crypt::OpenPGP without external dependencies

Posted on 2006-07-18
6
257 Views
Last Modified: 2008-03-06
I'm trying to write a subroutine to GnuPG encrypt a report (generated from a database query) given only the report contents and the encryption key as arguments. No external dependencies (other than Perl modules and specifically excluding GPG binaries and its keyring files).

This concept test script looks like it should work (I had help from the module author, but I guess, I don't fully understand his comments).  Does anyone have any other bright ideas?


#!/usr/bin/perl

use strict;
use warnings;
use Crypt::OpenPGP;
use Crypt::OpenPGP::KeyBlock;
use Crypt::OpenPGP::KeyRing;

my $plaintext = qq^
Dummy report data
^;

my $ring = Crypt::OpenPGP::KeyRing->new( Data => "-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: PGP 6.5.1

mQGiBES0BisRBAD11RjxN2lk+2eKsVjfJSrjkrbhoIRS1eduMb1Q1dzbqNAG1L/j
Srd+T/dfWEqWu0LqBwgSK/P6a+cdnENSFj8LQOWD8zbrXbok2gFoIkF/L1O/7znC
5IwFPP+2FZe1kFyY36PKooot+okYG/G16HNAuU3CzxBYCuqkxqEDeU1kdwCg/1jI
FrbO0cUrJrit/6NIyzDBCOMEANgBXtHtdrdtmwE35HcFO2sdywvvIOE+L1Wouwku
ewK6/bpLGa1LnYu7T7xO+CziYqjp9SIGiSPmZjQQPXfBrEtCvLMCTC/mdylOP6Sh
hrnLWgPgAV5d7wpR1VUQCugDDZ9s/ExQuQEeD3dHt2dBBco5/+lvdr/cXE06J3x2
fETgA/9dhSfdp4h4PIKYkgDvTGIpFp6JeKTVd5PnTu80JO9JkkSWtPryukDT/smq
ACzyrCkexY0zdGgFJ5mmrK/S5KNyrUOw46noCj07k6/l4dl5CCM0K670JpoYijL5
rAUnfvvcozjhqKpgwalGDsIZ+pDNTL2BjREZulU6mTEiO9iAxLQMZnR0LXRlc3Qt
a2V5iQBOBBARAgAOBQJEtAYrBAsDAQICGQEACgkQ7PgWEnFENBZ0NACgl4QXiLg5
3ziImum1iWQDTjSFBA8AoI9A3rEbeeaqUAHWQMn7x2wtofPiuQMNBES0Bi8QDADM
HXdXJDhK4sTw6I4TZ5dOkhNh9tvrJQ4X/faY98h8ebByHTh1+/bBc8SDESYrQ2DD
4+jWCv2hKCYLrqmus2UPogBTAaB81qujEh76DyrOH3SET8rzF/OkQOnX0ne2Qi0C
NsEmy2henXyYCQqNfi3t5F159dSST5sYjvwqp0t8MvZCV7cIfwgXcqK61qlC8wXo
+VMROU+28W65Szgg2gGnVqMU6Y9AVfPQB8bLQ6mUrfdMZIZJ+AyDvWXpF9Sh01D4
9Vlf3HZSTz09jdvOmeFXklnN/biudE/F/Ha8g8VHMGHOfMlm/xX5u/2RXscBqtNb
no2gpXI61Brwv0YAWCvl9Ij9WE5J280gtJ3kkQc2azNsOA1FHQ98iLMcfFstjvbz
ySPAQ/ClWxiNjrtVjLhdONM0/XwXV0OjHRhs3jMhLLUq/zzhsSlAGBGNfISnCnLW
hsQDGcgHKXrKlQzZlp+r0ApQmwJG0wg9ZqRdQZ+cfL2JSyIZJrqrol7DVelMMm8A
AgIL/jQq8VcNbVMOJVW9ijKHVg/wbx6wzqYEOedqsbLjcX0TNvrp2aL2RDK4xq/E
oIERKZftsI2TvglcgNrw8NXnps1hT5lP1oEjmRF8B57bm4p4fScfaPEodzCTsbX7
KFI+ie/XbApHrcFnQzfQFA0hqDFidATSxf6mWPPMUVSvDTaNbq1Ps88OLeSoF3kE
58hMm9x8xZJOnQeTe4gvX2uDz+F6daxC7xBd73axc2KS9mnBqj9Xw2qLm438TuKC
V7ioOXxzeSVioDNsnh+PLYhEBPFCgsjEqKu0TXWDVkkzzxLO11Uq6VTYt/ve1cVz
mq2vLN3km1kZoumXHYROV9mg2Zr7Y6604r+OAVHxNgJz5X6OB36bjQgpWDPuNWmk
uh1PrZAT6WB2LJDaSZk6y3EQfGWvnZ5OqgqhIVl2HlyMGU4E8C8iTkuCStpndMFw
ZchMKR7UbTswzI7m4t4RPLvpaF8YxmAJy9UzZEK3Ycnq5oNsgicKqgM2GVpky1GO
oAtMaIkARgQYEQIABgUCRLQGLwAKCRDs+BYScUQ0FoObAKD1vGbfNCeu/CVvwsTr
9mz6nUmeTgCeNO9P7OkUuySN6D2YTYbKvgIAEes=
=+ksY
-----END PGP PUBLIC KEY BLOCK-----" );

my $kb = Crypt::OpenPGP::KeyBlock->new;
$kb->add( ($ring->blocks)[0] );

my $cert = $kb->encrypting_key;

my $pgp = Crypt::OpenPGP->new( Compat => 'GnuPG' );

my $ct = $pgp->encrypt( Key => $cert, Data => $plaintext )
  or die "ERROR: " . $pgp->errstr;

print $ct;
0
Comment
Question by:builder110697
  • 3
6 Comments
 
LVL 17

Expert Comment

by:mjcoyne
ID: 17137704
I don't have the Crypt::OpenPGP module installed, so I can't run your code.  What problems are there with the code you posted? Do you get errors?
0
 
LVL 1

Author Comment

by:builder110697
ID: 17138834
Unfortunately it doesn't help too much.

<code>
[builder@engproto crypt]$ perl crypt
ERROR: Need something to encrypt with
[builder@engproto crypt]$
</code>
0
 
LVL 1

Author Comment

by:builder110697
ID: 17138844
Sorry about the "<code>" tags - wrong website ;-)
0
 
LVL 1

Author Comment

by:builder110697
ID: 17154306
This script works thanks to a lot of help from Benjamin Trott.

#!/usr/bin/perl

use strict;
use warnings;
use Crypt::OpenPGP;

my $ring = Crypt::OpenPGP::KeyRing->new(
  Data => qq^-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: PGP 6.5.1

mQGiBES0BisRBAD11RjxN2lk+2eKsVjfJSrjkrbhoIRS1eduMb1Q1dzbqNAG1L/j
Srd+T/dfWEqWu0LqBwgSK/P6a+cdnENSFj8LQOWD8zbrXbok2gFoIkF/L1O/7znC
5IwFPP+2FZe1kFyY36PKooot+okYG/G16HNAuU3CzxBYCuqkxqEDeU1kdwCg/1jI
FrbO0cUrJrit/6NIyzDBCOMEANgBXtHtdrdtmwE35HcFO2sdywvvIOE+L1Wouwku
ewK6/bpLGa1LnYu7T7xO+CziYqjp9SIGiSPmZjQQPXfBrEtCvLMCTC/mdylOP6Sh
hrnLWgPgAV5d7wpR1VUQCugDDZ9s/ExQuQEeD3dHt2dBBco5/+lvdr/cXE06J3x2
fETgA/9dhSfdp4h4PIKYkgDvTGIpFp6JeKTVd5PnTu80JO9JkkSWtPryukDT/smq
ACzyrCkexY0zdGgFJ5mmrK/S5KNyrUOw46noCj07k6/l4dl5CCM0K670JpoYijL5
rAUnfvvcozjhqKpgwalGDsIZ+pDNTL2BjREZulU6mTEiO9iAxLQMZnR0LXRlc3Qt
a2V5iQBOBBARAgAOBQJEtAYrBAsDAQICGQEACgkQ7PgWEnFENBZ0NACgl4QXiLg5
3ziImum1iWQDTjSFBA8AoI9A3rEbeeaqUAHWQMn7x2wtofPiuQMNBES0Bi8QDADM
HXdXJDhK4sTw6I4TZ5dOkhNh9tvrJQ4X/faY98h8ebByHTh1+/bBc8SDESYrQ2DD
4+jWCv2hKCYLrqmus2UPogBTAaB81qujEh76DyrOH3SET8rzF/OkQOnX0ne2Qi0C
NsEmy2henXyYCQqNfi3t5F159dSST5sYjvwqp0t8MvZCV7cIfwgXcqK61qlC8wXo
+VMROU+28W65Szgg2gGnVqMU6Y9AVfPQB8bLQ6mUrfdMZIZJ+AyDvWXpF9Sh01D4
9Vlf3HZSTz09jdvOmeFXklnN/biudE/F/Ha8g8VHMGHOfMlm/xX5u/2RXscBqtNb
no2gpXI61Brwv0YAWCvl9Ij9WE5J280gtJ3kkQc2azNsOA1FHQ98iLMcfFstjvbz
ySPAQ/ClWxiNjrtVjLhdONM0/XwXV0OjHRhs3jMhLLUq/zzhsSlAGBGNfISnCnLW
hsQDGcgHKXrKlQzZlp+r0ApQmwJG0wg9ZqRdQZ+cfL2JSyIZJrqrol7DVelMMm8A
AgIL/jQq8VcNbVMOJVW9ijKHVg/wbx6wzqYEOedqsbLjcX0TNvrp2aL2RDK4xq/E
oIERKZftsI2TvglcgNrw8NXnps1hT5lP1oEjmRF8B57bm4p4fScfaPEodzCTsbX7
KFI+ie/XbApHrcFnQzfQFA0hqDFidATSxf6mWPPMUVSvDTaNbq1Ps88OLeSoF3kE
58hMm9x8xZJOnQeTe4gvX2uDz+F6daxC7xBd73axc2KS9mnBqj9Xw2qLm438TuKC
V7ioOXxzeSVioDNsnh+PLYhEBPFCgsjEqKu0TXWDVkkzzxLO11Uq6VTYt/ve1cVz
mq2vLN3km1kZoumXHYROV9mg2Zr7Y6604r+OAVHxNgJz5X6OB36bjQgpWDPuNWmk
uh1PrZAT6WB2LJDaSZk6y3EQfGWvnZ5OqgqhIVl2HlyMGU4E8C8iTkuCStpndMFw
ZchMKR7UbTswzI7m4t4RPLvpaF8YxmAJy9UzZEK3Ycnq5oNsgicKqgM2GVpky1GO
oAtMaIkARgQYEQIABgUCRLQGLwAKCRDs+BYScUQ0FoObAKD1vGbfNCeu/CVvwsTr
9mz6nUmeTgCeNO9P7OkUuySN6D2YTYbKvgIAEes=
=+ksY
-----END PGP PUBLIC KEY BLOCK-----^ );

my $datafile = "TESTING_MerlintoMerlin-op071106_QAOPT1.csv";
open( INFILE, "< $datafile" )
  or die "Could not open csv file - $!";
my $plaintext = <INFILE>;
close INFILE;

$ring->read;
my $kb = $ring->find_keyblock_by_index(0);
my $cert = $kb->encrypting_key;

my $pgp = Crypt::OpenPGP->new( Compat => 'GnuPG' );

my $ct = $pgp->encrypt( Key => $cert, Data => $plaintext )
  or die "ERROR: " . $pgp->errstr;

open( OUTFILE, "> $datafile.pgp" )
  or die "Could not open file for encrypted data - $!";
print OUTFILE $ct;
close OUTFILE;
0
 
LVL 1

Accepted Solution

by:
GhostMod earned 0 total points
ID: 17185271
Closed, 250 points refunded.

GhostMod
Community Support Moderator
0

Featured Post

Gigs: Get Your Project Delivered by an Expert

Select from freelancers specializing in everything from database administration to programming, who have proven themselves as experts in their field. Hire the best, collaborate easily, pay securely and get projects done right.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Email validation in proper way is  very important validation required in any web pages. This code is self explainable except that Regular Expression which I used for pattern matching. I originally published as a thread on my website : http://www…
In the distant past (last year) I hacked together a little toy that would allow a couple of Manager types to query, preview, and extract data from a number of MongoDB instances, to their tool of choice: Excel (http://dilbert.com/strips/comic/2007-08…
Explain concepts important to validation of email addresses with regular expressions. Applies to most languages/tools that uses regular expressions. Consider email address RFCs: Look at HTML5 form input element (with type=email) regex pattern: T…
Established in 1997, Technology Architects has become one of the most reputable technology solutions companies in the country. TA have been providing businesses with cost effective state-of-the-art solutions and unparalleled service that is designed…

815 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

11 Experts available now in Live!

Get 1:1 Help Now