defgenerate_RSA(bits=2048): |
'' |
Generate an RSA keypair with an exponent of 65537 in PEM format |
param: bits The key length in bits |
Return private key and public key |
'' |
fromCrypto.PublicKeyimportRSA |
new_key=RSA.generate(bits, e=65537) |
public_key=new_key.publickey().exportKey('PEM') |
private_key=new_key.exportKey('PEM') |
returnprivate_key, public_key |
Pycrypto is unmaintained and has known vulnerabilities. Use pycryptodome , it is a drop-in replacement. |
e should be random methinks =P |
@miigotu 'youthinks' wrong. e should be chosen so that e and λ(n) are coprime. It is not chosen at random, and since it is usually small for computation reasons, and included in the public key, it can always be known by an attacker anyway. |
from Crypto.PublicKey import RSA code = 'nooneknows' key = RSA.generate(2048) privatekey = key.exportKey(passphrase=code, pkcs=8) publickey = key.publickey().exportKey() |
Nice But How Can I Write The Private Key I Tried This: f = open('PublicKey.pem','w') f.write(publick_key) f.close() BUT IT DOESN'T WORK WITH THE PRIVATE KEY, JUST RETURNS 0B |
@WarAtLord try publick_key.exportKey('PEM') |
60cf347dbc59d31c1358c8e5cf5e45b822ab85b79cb32a9f3d98184779a9efc2
y² = x³ + ax + b
with a chosen a
and b
. There is a whole family of such curves that are widely known and used. Bitcoin uses the secp256k1 curve. If you want to learn more about Elliptic Curve Cryptography, I’ll refer you to this article.1e7bcc70c72770dbb72fea022e8a6d07f814d2ebe4de9ae3f7af75bf706902a7b73ff919898c836396a6b0c96812c3213b99372050853bd1678da0ead14487d7
.ecdsa
module, I decoded the private key using codecs
. This is relevant more to the Python and less to the algorithm itself, but I will explain what are we doing here to remove possible confusion.4f3c
does not equal the byte array 4f3c
, it equals the byte array with two elements, O&
lt;. And that’s what codecs.dec
ode method does: it converts a string into a byte array. That will be the same for all cryptographic manipulations that we’ll do in this article.0x04
at the start of our public key. The result is a Bitcoin full public key, which is equal to: 041e7bcc70c72770dbb72fea022e8a6d07f814d2ebe4de9ae3f7af75bf706902a7b73ff919898c836396a6b0c96812c3213b99372050853bd1678da0ead14487d7
for us.0x02
if the last byte of Y is even, and the byte 0x03
if the last byte is odd.0x03
to get the compressed public key: 031e7bcc70c72770dbb72fea022e8a6d07f814d2ebe4de9ae3f7af75bf706902a7
. This key contains the same information, but it’s almost twice as short as the uncompressed key. Cool!453233600a96384bb8d73d400984117ac84d7e8b
.0x00
bytes to the encrypted public key. The result is 00453233600a96384bb8d73d400984117ac84d7e8b
. For the testnet, that would be 0x6f
bytes.512f43c48517a75e58a7ec4c554ecd1a8f9603c891b46325006abf39c5c6b995
and therefore the checksum is 512f43c4
(note that 4 bytes is 8 hex digits).00453233600a96384bb8d73d400984117ac84d7e8b512f43c4
for our example.17JsmEygbbEUEpvt4PFtYaTeSqfb9ki1F1
, a compressed Bitcoin wallet address.