You can generate a secp256k1 keypair using OpenSSL, but converting that to an Ethereum address is a bit tricky.
The private key is actually just a random 32-byte number (actually it needs to be a bit smaller than that, but there's almost no chance you'll pick a bad one)
The issue is that converting a secp256k1 public key into an address requires the keccak-256 hash function, which is not commonly used and thus will not be built into OpenSSL or GPG. The good news is since this step only uses public information, it can be done on an insecure computer.
(Much of the following is adapted from https://kobl.one/blog/create-full-ethereum-keypair-and-address/)
Now for the process:
Generate an ECDSA keypair with OpenSSL:
Get the raw public and private keys and save to a file:
openssl ecparam -name secp256k1 -genkey --noout | openssl ec -text -noout >> keypair.prv
read EC key
Private-Key: (256 bit)
priv:
d2:17:23:e4:e5:30:e5:94:97:11:70:97:e4:ac:e0:
0b:1c:2e:fa:14:76:5a:55:75:00:e3:4d:96:d9:57:
d8:67
pub:
04:28:13:c1:5f:59:d1:c8:f7:41:7a:ad:0b:60:d6:
01:22:5d:51:2a:e8:3b:79:f3:a7:8f:f3:73:7c:25:
28:84:1f:12:97:ed:1f:5e:a3:22:c5:d3:f4:a7:c9:
39:fd:53:93:87:20:96:0e:3b:7b:0d:b2:96:ba:c0:
43:72:fb:6d:b3
ASN1 OID: secp256k1
The private key is just the to section with colons and whitespace stripped off:
cat keypair.prv | grep priv -A 3 | tail -n +2 | tr -d ":\n[:space:]" >> privatekey.prv
Do the same for the public key, but also strip off the leading 0x04
cat keypair.prv | cat key.prv | grep pub -A 5 | tail -n +2 | tr -d ":\n[:space:]" | sed "s/^04//g" >> publickey.pub
Then you should write down the private key somewhere safe, and move the public key to a networked computer.
You then need to use an implementation of Keccak256 to hash the public key. A good python module is https://pypi.python.org/pypi/pysha3.
Then hash the address and take the last 20 bytes (40 characters). This is your address.
For example, if your raw public key is 2813c15f59d1c8f7417aad0b60d601225d512ae83b79f3a78ff3737c2528841f1297ed1f5ea322c5d3f4a7c939fd53938720960e3b7b0db296bac04372fb6db3
as in the example, then you would derive your address in python as
import binascii
from sha3 import keccak256
k = keccak256()
pubkey = binascii.unhexlify("2813c15f59d1c8f7417aad0b60d601225d512ae83b79f3a78ff3737c2528841f1297ed1f5ea322c5d3f4a7c939fd53938720960e3b7b0db296bac04372fb6db3")
k.update(pubkey[:32])
k.update(pubkey[32:])
address = "0x"+k.hexdigest()[24:]
>"0x0bed7abd61247635c1973eb38474a2516ed1d884"