# OK to post
# HW24, Robert Dougherty-Bliss, 2024-04-20

# 1.

cemetaryResponse := proc()
    return {6, 8}:
end:

# 3.

# Just for the record, our code is really bad at generating keys!  On my
# desktop, MakeRSAkey(1000, 10) took about 11.6 seconds. That's a key of
# roughly 3321 bits. Really secure RSA keys have 4096+ bits. On linux, you can
# use openssl to generate keys using efficient algorithms:

#   openssl genpkey -algorithm rsa -pkeyopt rsa_keygen_bits:4096
#   openssl genpkey -algorithm rsa -pkeyopt rsa_keygen_bits:8192
#   etc.

# The first one takes about 0.5 seconds on my desktop, while the second one
# takes about 10 seconds.

# The output looks like this (using 2048 bits):

(*

$ openssl genpkey -algorithm rsa -quiet
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDxePnpTK9D1ocU
MSVCx+Zg/I2Rje8m9jheIvIJ/OPTBbieL+a1bUux/2DMxksCMkm6sht7MAukMPSN
kVfjBqindKguP06/l8vxF6jboz9SX2FtCBpHN0Irjtu60FDk7dIXMl5YnfQwHKRc
NHbBa2eAZQgucZsw+sFVCOPX4+ePjiREt2oVd4otgP06gMRglPImqgHxdUu/tXYt
PqPoqWqs/E7Z/Lj/GzVc7yLUVTLTD0xd0lfmpkfS2Z9Ztg6TMp+BXe2GVbD7a+A+
dTTGA+uBnbv86LlBfW4BPojiKuzgZwuavNPTFQfwwOgE2NK31jongHhc7SvptMWg
hOvKQmodAgMBAAECggEAAqLi+5iSO0fezqogsYN0MO/g7ctiZob+o4x3HwPLSvT/
iH6WYrmwP1+9405w6DO7WVXzddtW7TJ5oQgKsRhUBAwCgArB5daW6+lptwgnu1L+
Qc36V3ezeb1ECdyXXYB5MDalEAudbF8LrlQGTeNJzH2N4s/rtVOvg6mmryc2Unth
3SsFj9XVcO0LjUOERVK1CvPJ/5F35by4QMl0aSZBg3x1R1p9ms6I26eqF39MABDO
2XUdg9ViBpYO3xLcuo068PGN5pG+mv4z+zI3KjQCDtxYfL/PZfyYLiblc5qysf0g
LdY45D6WBcW9Jmod7pmv6NRDcdp6qxZTOz7Ns6iiIwKBgQD3jX1+IkEA7xRcS5+P
LMzt9IIsLkccwebgKfZ4PRWLttNcKfo+mYDm1qYF3tPRHbrm1wIrMXcw9si4EHqp
cuc3hiMk3rA2ii/x8hmhH4LmH0aC4yZrMDuWHb/UfT6XEwG5Pe7htie17Wmf0XSO
CT1Z80+YQ9406oAH9tkdcIp5uwKBgQD5tl9oVXbW+HsgjeTF/IKnHO1ajeGg3+Oy
/dc3cKlHtTsZwRZZuz55ZEmPwJeQzp9iY/DsJQfIVd03vfeqCCiGJw+L9wYyzIoe
GXsctri+OwSgpbphdfpndDG+De0fWeSisz8a6cVUv0RYyH7MvnnsXOrUP7opEGHj
NKkkO+biBwKBgQC/CWqRvz9oyBdvTlC4/bq721flXmU0dRKFZPy2N3V8Fz+uvRpH
2tAV1AnVN+tAUnAcmkorKQYxPBETsmvmfiyetZ5DYrKbtDJhxRIwPBAZJIOWmFLa
nyMsqpKSGYEGtv06hefmOVsV0zwSwGHxBoJY+yIugBlnvpvFCaLtTB8g5wKBgHoc
ZKtwn5ygBhX1TVpEEOAHlUoi96Lj2UU+PHAv95fJWA1QDs3ycqqKEC7rzzJQ2EAU
/0t7EEM3OeZ4TxQmySpRD5kyQyW0QBZX/4wbDlx4H9svL+VY/Ap7F5gI11vtaZDm
doWCq6y1m4aPBPK6coTTK0J/p1lNWZDxv4Sohk8hAoGAWatOc1JfobF8/AtCxxxY
h13RmzGoOb0dO++1CGvVls9HmcEF35lUIaIC6QjrVLfO4z4tOhJSKGfBvaD6vQPj
ySHBJvNZxzkxbeNhmxYzs76SOCjYGvnsJnx2N0U3rRCbJ89JGB+m+dBfOkUq7vt3
csnqECD904R6NGDcxxezzAw=
-----END PRIVATE KEY-----

*)

# This output is not actually just the private key, but all of the parameters
# together (N, e, d, etc.). So this is very secret. If you just want the public
# key, then you would save this somewhere then use openssl again. I generated a
# 4096-bit (2466 digits) key (different than the one above) and got the public
# key like this:

(*
$ openssl rsa -pubout < key.txt
writing RSA key
-----BEGIN PUBLIC KEY-----
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAv3IvoDUCVHV4aCUnVtk4
VRT5aPR2i0H7WrHKkWCphS7PtnziHKfT+/TcbE4gCIlwuhPLB0NIwE8d8If9u03w
06qG1IU5RfYA6mFZpCP2Jf6siVcqldpdvtBoXK2cowigHzHdjKG/xm58cRX10bxY
amn3IIij/dZRZbhGKUM+xiz+EBnlwqDhzDqpuCj+v0oJ2h3PY+6qarOG5R9oC4w6
eO1Ylv60OCL/fPTjAprR9fN3Jbpntb4ejqio585yngxkgXVgRJMnvJE4bUlARsdI
kJb6mvL+UBk1CesiiLUUXdKsUy+X4Rq4Cvn5GF+n4z239s9bZdPkOUgA1SnKuyp0
95wPj5MScsuXDnxXMmTc5O/YWJpNhv3YdwoFikbdqwHgP1M2bDAAvm0Eu3Y7sM2o
fUKlH9gVSBsif8QWMCLQSfP1IxJf7XsAFXIH9ldtDoy3SOQriKhhNfSI5zh7mCxL
JUWvBpdEVmuTcGd9jDMEVOJzKFSxM8DmGaADTeMJKyB/SQlOQmdCNNR3ZXRGq7uX
OAYjJUdXkDFLaJNCFfMb1sObiWWIoy/JeiN+U/ULSfXQSKPZ/NXzYastb9hM1xHd
SJDSn4hzLx5w9nxmsk3DGJwOD5ZKllMQ9DcuNQOssALoG0LxfsSIHfsnthL75aKW
RtCdZGonbCEHizFAsj+Aao8CAwEAAQ==
-----END PUBLIC KEY-----
*)

# The parameters are as follows:

#   e = 65537 (everyone uses this by default)
#   N = 781031698217883042398890730588167007882753212312082463232625329429118308310700557226161167257864287497112646594083423739642856291713565876625980189273341617453296899265578536263772290719418809181289833873674466243735227170670747623731988888385475296513452691261296092088186595847190487484931619714612529041666895402387685839287384762848588078447029927783219111285572597724398689074360810786955072555913196849206252722952514822675486809906466904331236284216176894185287595913548875533977388179481458323646315143278086824654932577425491784595310574742954469002750038852791885437112141385501497033688351168039005975648776602234669602153777671309634931623194197525489751480366060594189076267130414967739155316040950648115500963210117071811910989047225658621754476375166781416632894855243464523714749416318518825790970384344337623363487021750848634301101882030448509042252397897612215439718705285976714636648986158554927938016438511288092137337703354586413203223814977591982788320753945520522155052965844593510495432059323088820333396387922533145400849774252574298970423764475804862809053455077077794767512417798804364205337309645960443188549312321332618576197481427323910025987316528972695113429854135692596148192594644555765051759291023