#!/bin/bash
openssl genrsa -out mykey.pem 2048
openssl rsa -in mykey.pem -pubout -out mykey.pub
openssl rsautl -sign -inkey mykey.pem -in message.txt -out secret.bin
openssl rsautl -verify -pubin -inkey mykey.pub -in secret.bin -out recovered.txt
# cat << EOF > convert.c
# #include <stdio.h>
# int main() { for (int i = 0; i < 256; i++) printf("%02x", (unsigned)getchar()); }
# EOF
# g++ convert.c -o convert
# rm convert.c
# echo -n "const char* secretMessage = \"" > secret.txt
# cat secret.bin | ./convert >> secret.txt
# echo "\";" >> secret.txt
# echo >> secret.txt
# echo "Public Modulus and Exponent:" >> secret.txt
# echo >> secret.txt
# openssl asn1parse -in mykey.pub -strparse 19 >> secret.txt
echo "const char* secretMessage = " > secret.cpp
cat secret.bin | xxd -p | sed 's/^/ "/' | sed 's/$/"/' | head -c -1 >> secret.cpp
echo -e ";\n" >> secret.cpp
echo "const char* publicModulus = " >> secret.cpp
# Dump the contents of the public key
openssl asn1parse -in mykey.pub -strparse 19 -offset 4 -length 261 | cut -d ':' -f 4 | fold -w 60 | sed 's/^/ "/' | sed 's/$/"/' | head -c -1 >> secret.cpp
echo -e ";\n" >> secret.cpp
echo "const char* publicExponent = " >> secret.cpp
# Dump the contents of the public key
openssl asn1parse -in mykey.pub -strparse 19 -offset 265 | cut -d ':' -f 4 | fold -w 60 | sed 's/^/ "/' | sed 's/$/"/' | head -c -1 >> secret.cpp
echo -e ";\n" >> secret.cpp
# Dump the contents of the private key
# openssl asn1parse -in mykey.pem
#RSAPrivateKey ::= SEQUENCE {
# version Version,
# modulus INTEGER, -- n
# publicExponent INTEGER, -- e
# privateExponent INTEGER, -- d
# prime1 INTEGER, -- p
# prime2 INTEGER, -- q
# exponent1 INTEGER, -- d mod (p-1)
# exponent2 INTEGER, -- d mod (q-1)
# coefficient INTEGER, -- (inverse of q) mod p
# otherPrimeInfos OtherPrimeInfos OPTIONAL
#}