There is no off the shelf software that I know of but most programming languages have crypto libraries. Using GPG is clunky because it is intended for asynchronous encryption. It can be used but if you lose the key then you lose the coins. You could print the key and store it with the cipher text but then your security becomes only the passphrase.
I would use AES.
Take a bulk wallet from bitcoin address.
1,"1P51sZbG4LNQP5Qq8VPKjexzStcTL29uJK","5KW4jRYUbux8tW7pvC6V5JxbLkF2w5LMMHUT8R2Dx5SSRBT73Ep"
2,"1G3Wyaea8AvamHT18d1Fa7VtsTbuGA7xrQ","5J2YdatPXojY39LgxbXcSkUvxNbbykYxAh6sDPHeemQYMdehKq3"
3,"14Cw7yBMzwGN5yxyx1uNdvi7QSpeb4A1LV","5JW4MHQYWTfXoM5vznEyGjr29g2YrSZUqVfA8UcQEwiJNkacJ5v"
4,"1ECEFCrAQVq2yDNhm1dKZCz9ApR2jGRRi3","5JSUmPoitJWmWDWkEHoqokASEy7yUNAsdB8saVzt8Dr985mbMMd"
5,"1EMhEniDqonMZqUCG3TYNdVCqQUKWGviNY","5Kfi3cciHfpFwhjuaGdHpGUzh5K3Sx9A2vyTBpUsML7tzZ8SFvn"
6,"1KdKYsU2bydotUgHWTnJWS4UTPWuYfaFPP","5KUxqY7Vu5cpTw78TvFxCzaLupNMRgqF8kFSudAkhvsRra1dGMc"
7,"1FxT8MP44tJ8ffUiJqFp2EK7mreBKQaxYi","5JGkVfJdsj1Wn1R1UD8yQmt2tENzde3Q6DF1kxgq4oBc1tbAvth"
8,"1P4Bv5bRGKK4S3QKHBj4DEsN1GsbZoCdyF","5J72q9KUP3uPmJBqX4zNtdKAcfjFayRLPmBkUG22cGjaNNDuV9G"
9,"1CtL8w7BrjUsXFA7nRJfV4YcNC8jzAzMA7","5KAqsqkG3wM9xfAATdVdhTfm6X1wd1xEtotBgsCrdLPiVzkBoAS"
10,"1JP37Lb84tsWs729fgez4hsuT8zRzfKnPK","5Kb4SAQveqH4btPFjaWSn7aNTv1BDUgfQapedaTeMeNUTRorEbV"
Split the output into list of private keys and public keys.
Store the public key as plaintext.
1,1P51sZbG4LNQP5Qq8VPKjexzStcTL29uJK
2,1G3Wyaea8AvamHT18d1Fa7VtsTbuGA7xrQ
3,14Cw7yBMzwGN5yxyx1uNdvi7QSpeb4A1LV
4,1ECEFCrAQVq2yDNhm1dKZCz9ApR2jGRRi3
5,1EMhEniDqonMZqUCG3TYNdVCqQUKWGviNY
6,1KdKYsU2bydotUgHWTnJWS4UTPWuYfaFPP
7,1FxT8MP44tJ8ffUiJqFp2EK7mreBKQaxYi
8,1P4Bv5bRGKK4S3QKHBj4DEsN1GsbZoCdyF
9,1CtL8w7BrjUsXFA7nRJfV4YcNC8jzAzMA7
10,1JP37Lb84tsWs729fgez4hsuT8zRzfKnPK
Encrypt the private keys using AES.
1,5KW4jRYUbux8tW7pvC6V5JxbLkF2w5LMMHUT8R2Dx5SSRBT73Ep
2,5J2YdatPXojY39LgxbXcSkUvxNbbykYxAh6sDPHeemQYMdehKq3
3,5JW4MHQYWTfXoM5vznEyGjr29g2YrSZUqVfA8UcQEwiJNkacJ5v
4,5JSUmPoitJWmWDWkEHoqokASEy7yUNAsdB8saVzt8Dr985mbMMd
5,5Kfi3cciHfpFwhjuaGdHpGUzh5K3Sx9A2vyTBpUsML7tzZ8SFvn
6,5KUxqY7Vu5cpTw78TvFxCzaLupNMRgqF8kFSudAkhvsRra1dGMc
7,5JGkVfJdsj1Wn1R1UD8yQmt2tENzde3Q6DF1kxgq4oBc1tbAvth
8,5J72q9KUP3uPmJBqX4zNtdKAcfjFayRLPmBkUG22cGjaNNDuV9G
9,5KAqsqkG3wM9xfAATdVdhTfm6X1wd1xEtotBgsCrdLPiVzkBoAS
10,5Kb4SAQveqH4btPFjaWSn7aNTv1BDUgfQapedaTeMeNUTRorEbV
for example encrypted with "this is my password there are many like it this is mine" the output is:
U2FsdGVkX19/9w7Eu8JcYRKadE02TuYxG9CA3V3aEjLwTr/Gi7h8p9Iwk3Z7yjYG
lqqHa2bAOcD1Xr+KDIGz/uDg4zRD/K0x5cOb2C53Nbsk+D3c9fgIBwhzVfboz7ZU
swNq65U8/oqnvYPKON1RwpmvzJNnCCC3BCf2St4Jaj0cc/J+w/pMkjVfPiK8zfD5
0vhQYe3e3fsfhcbhyctpfO411cqVieCNgTgXR03sNLmseXJpnc8VvU6anazMnnCc
4j+0BaoM8h7M3+kz7EzZMxKC+equNVEJgFhoXCfVKddsDj2HhsbkkdoKCoQlrlAJ
TLS1gVaUi6beA4MlT/exvFPSsZ0oisH5JDZwltsn+1RHP7dXlorzZ2u0U6ngm4kb
EzTkB0nZVhAOiYQxSAlKqhwTyKdEdklXE6egg4eRJ4xj9Y9XzIq/ckpd0gE8s/Nx
UAteXWk0Y+cXLSRGiATkjUTOj0TFC+h0VxUioOv+oE3L7q6C4XeyJc+khAAjENX4
H1V0KtXtrVBfQR8uJg1Wih+9Z1b+hG+5KRzXfpqTZojdpQl1T1FcJMsuJ65plH8F
Sxknnt0Lgp+yJyymPa0l5mfbas5Dkw+mTVl5bankbqqe0kYqyGoZhySZicy1WTaG
AVfYTCc6Qm99U5LVqZBgC28QD5JvuKQPhn3uiiCNQZseIlDsXylYS0xHQIUp7PO1
v4pyAslgSDUK6IOtZ0mG68vffAE7M8izE5Iax1vVu3M=
I would then include information and instructions on the page and print multiple copies.
Example:
10 bitcoin private keys.
Created 07/09/2012
Encrypted using reference implementation of AES algorithm using a 128 bit key from a passphrase.
============= BEGIN AES PROTECTED BLOCK =============
U2FsdGVkX19/9w7Eu8JcYRKadE02TuYxG9CA3V3aEjLwTr/Gi7h8p9Iwk3Z7yjYG
lqqHa2bAOcD1Xr+KDIGz/uDg4zRD/K0x5cOb2C53Nbsk+D3c9fgIBwhzVfboz7ZU
swNq65U8/oqnvYPKON1RwpmvzJNnCCC3BCf2St4Jaj0cc/J+w/pMkjVfPiK8zfD5
0vhQYe3e3fsfhcbhyctpfO411cqVieCNgTgXR03sNLmseXJpnc8VvU6anazMnnCc
4j+0BaoM8h7M3+kz7EzZMxKC+equNVEJgFhoXCfVKddsDj2HhsbkkdoKCoQlrlAJ
TLS1gVaUi6beA4MlT/exvFPSsZ0oisH5JDZwltsn+1RHP7dXlorzZ2u0U6ngm4kb
EzTkB0nZVhAOiYQxSAlKqhwTyKdEdklXE6egg4eRJ4xj9Y9XzIq/ckpd0gE8s/Nx
UAteXWk0Y+cXLSRGiATkjUTOj0TFC+h0VxUioOv+oE3L7q6C4XeyJc+khAAjENX4
H1V0KtXtrVBfQR8uJg1Wih+9Z1b+hG+5KRzXfpqTZojdpQl1T1FcJMsuJ65plH8F
Sxknnt0Lgp+yJyymPa0l5mfbas5Dkw+mTVl5bankbqqe0kYqyGoZhySZicy1WTaG
AVfYTCc6Qm99U5LVqZBgC28QD5JvuKQPhn3uiiCNQZseIlDsXylYS0xHQIUp7PO1
v4pyAslgSDUK6IOtZ0mG68vffAE7M8izE5Iax1vVu3M=
============= END AES PROTECTED BLOCK =============
You can test the above example using this site.
http://www.everpassword.com/aes-encryptorWARNING: Don't use this site to encrypt any real secrets. I have no idea the security of it. You may be handing the site operator a plaintext list of your keys.Personally I would enhance the above concept to use PBKDF2 for producing the decryption key. This would provide brute-force resistance. If the wallet is very large I would also use PBKDF2 produce a key which encrypt a random 256 bit number that is actual key for the rest of the wallet. The example above encrypts all the keys a single block of text. A better solution might be to encrypt each key seperately and include the public key. Then you can selectively decrypt one key as needed. Essentially the method used by bitcoin wallet except on paper. That might be an interesting enhancement to pywallet.
If you do encrypt your paper wallet remember
the algorithm, key generation method, salt, and other technical details ARE NOT SECRETS. Include plain English instructions maybe even source code to ensure it can be decrypted later. Good encryption doesn't work on obscurity it works based on mathematical theories that certain operations are cost prohibitive without the secret. The only thing missing from your encrypted paper wallet should be the passphrase. It is a common misconception that encryption should be sneaky (like just including a paper with nothing but cipher text) and that adds security. The only thing that adds it the likelihood that at some point in the future you never will figure out how to decrypt it even WITH the passphrase.