Skip to content

Instantly share code, notes, and snippets.

@xieyuschen
Last active December 10, 2020 09:05
Show Gist options
  • Save xieyuschen/2b57316c02f5730b449a2ea76a388ea1 to your computer and use it in GitHub Desktop.
Save xieyuschen/2b57316c02f5730b449a2ea76a388ea1 to your computer and use it in GitHub Desktop.
Encrypt and decrypt by ras pkcs1 by key-pair in pem files

Encrypt and decrypt by ras pkcs1 by key-pair in pem files

Generate Key-Pair randomly

Thanks to blog here, I finally understood how rsa encrypt and decrypt.

Generate public-private key pair

//copy from https://gist.github.com/miguelmota/3ea9286bd1d3c2a985b67cac4ba2130a 
//call GenerateKeyPair() can generate public-private key pem file for you
func GenerateKeyPair(){
	reader := rand.Reader
	bitSize := 2048

	key, err := rsa.GenerateKey(reader, bitSize)
	checkError(err)

	publicKey := key.PublicKey

	//saveGobKey("private.key", key)
	savePEMKey("private.pem", key)

	//saveGobKey("public.key", publicKey)
	savePublicPEMKey("public.pem", publicKey)
}

func savePEMKey(fileName string, key *rsa.PrivateKey) {
	outFile, err := os.Create(fileName)
	checkError(err)
	defer outFile.Close()

	var privateKey = &pem.Block{
		Type:  "RSA PRIVATE KEY",
		Bytes: x509.MarshalPKCS1PrivateKey(key),
	}

	err = pem.Encode(outFile, privateKey)
	checkError(err)
}

func savePublicPEMKey(fileName string, pubkey rsa.PublicKey) {
	asn1Bytes, err := asn1.Marshal(pubkey)
	checkError(err)

	var pemkey = &pem.Block{
		Type:  "RSA PUBLIC KEY",
		Bytes: asn1Bytes,
	}

	pemfile, err := os.Create(fileName)
	checkError(err)
	defer pemfile.Close()

	err = pem.Encode(pemfile, pemkey)
	checkError(err)
}

func checkError(err error) {
	if err != nil {
		fmt.Println("Fatal error ", err.Error())
		os.Exit(1)
	}
}

Use public-private key pair to encrypt and decrypt

First I will show .pem files to you:

  • My public.pem:
-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEA1LShZoFPJ7GQivYYeaizoJYy83F9r1CQoiJAshEGz+3o9EZLhZ3h
N/gJQLUWloDip/anBhXusHBSNstAM3VEo2oPfNzq3dNvNJU6y5crEPSwpIu2vIk7
73oJtMw0AkmxhXNiB80HP8H7DTSbWuU67V0m14AmZJa/M9vEq+P8fIr7PohC6Z3I
YOY6BTnaMkK7nnnCr/n8skzenkQpSWiea7nlympNvUK0+K5RfJX+OAdC0oNH0Rs7
1U9DvVm44/4RcApLeFdKxapMf/v3w2YcJZ1Dw3LOB2MsL+WyTn8EQP3C+2kIDR3d
J+looIujc5cMGgNvJkKeQ6lMMf9H9xycdwIDAQAB
-----END RSA PUBLIC KEY-----
  • My private.pem
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEA1LShZoFPJ7GQivYYeaizoJYy83F9r1CQoiJAshEGz+3o9EZL
hZ3hN/gJQLUWloDip/anBhXusHBSNstAM3VEo2oPfNzq3dNvNJU6y5crEPSwpIu2
vIk773oJtMw0AkmxhXNiB80HP8H7DTSbWuU67V0m14AmZJa/M9vEq+P8fIr7PohC
6Z3IYOY6BTnaMkK7nnnCr/n8skzenkQpSWiea7nlympNvUK0+K5RfJX+OAdC0oNH
0Rs71U9DvVm44/4RcApLeFdKxapMf/v3w2YcJZ1Dw3LOB2MsL+WyTn8EQP3C+2kI
DR3dJ+looIujc5cMGgNvJkKeQ6lMMf9H9xycdwIDAQABAoIBAD7amY8WyvMpz1Kg
4h6hMWNUvv2dHcy+e97NTFzSFzc+UEZOt2ZmfvTxAJr0aBZVQ6Tqh/SOapgMuN6k
NPZ/wqafYrA8/9JI9mWNa3BZ3UoHZGNbPcZ8rw9W+qNIbF34tNKAhAlWFrxKcAs4
7mdvsXgOvLmVjsLOoPWMDZPVrPiH9w/A/EC+YDMaodfMpEkro3XuiQvqCO2L0M0l
CmfwF1S7gIvLx/47ANxBDlOVNoOgcYtPI2PmRU43AAeyo03qzEH9Rm6h1cpeK7Ut
ZuIypmjMIFJ/stqqFyAxuWBdPGzvQBStIlFoc7lDbBFLAWmyB4/8UVE1wwjzaA+f
sJhl5SECgYEA3G8R0ymJdh0XO+hiAaUTdEUoi4JjLiO1D+2nIHaPy+vKZWpF3KUD
ShL/WOxJKTR9ZJvfYHh3e6MVFdiR7vHIXNGFT2aEBaClwNx2S5V7x+PC+N3ExH07
OLZtZ5QUoF8RTe1ui3dw7Kd6WTVMQgxrHihIcwxRT7yL7KvL7iTSrukCgYEA9wZY
9T1jOgBoKZI4yxIQQiw2w7eOH8EAJ2dGuFVJMZz0HHmtXg8jzUG3L35a0Ql5df9t
skVzOI/5AZL/o6gMsqA+fsEbM9n15dPjofrDiVNmiCVecNQXRXtPL7URJrPYqwrK
MpPJy338g0mhbhWC//mOw1hSfWtm247gJbX3lF8CgYEAjCkXdWP44qBWsKHvB0q2
VvzObf6HH8RWkX00AkFA55HSzK9JIqXNtKDlud3sGwYkIP+3hfizSGsGsjBVglA8
bUBP+o+drJJcMog7s42l+hCJXYJtZd6W9FWStQSEJQCt2RX6bzWQGPnYorZv+aM5
zSAiCP0xCnlBo0gNUCwbxlkCgYEAu7g0I/GJlUs33NeElzVb652D5Il51MGrJ0aB
ZJVTMQOwMm95AvCIaXPWDJ59zzre9X+tUfsbC1HFjZ+y6yBKvfeuZk7DKE0rY4L5
Cl/w9kvNsAqN0TorkR6a14tGxF2JermRXIwYnq5YFUEADxMD4Rg5mFNnJG5Y1OKn
jaDRywsCgYBDpGuDCXdWu+W7eWvwyneQ4TC8PWeunV4uVcEokk0czNgUnxtpnKbc
FN2ueBemAB8xZsiIdcdLN9pFxNN4IbCpcEfcxAn+Q5MY68gVBraISCoJCaOn7JGb
OI8ehBRpcXVyhjJFKKR80XPVE4dwIlyYxHVdbaipN4lilbSQObe1zQ==
-----END RSA PRIVATE KEY-----

Encrypt and decrypt

I read key from pem files and do encrypt and decrypt. I do this as the following shows:

func main() {

	publicKeyStr,_:=ioutil.ReadFile("public.pem")
	block, _ := pem.Decode([]byte(publicKeyStr))
	key,_:=x509.ParsePKCS1PublicKey(block.Bytes)
	chiper,_:=rsa.EncryptPKCS1v15(rand.Reader,key,[]byte("helloworld"))
	fmt.Println("Chiper is: ")
	fmt.Println(string(chiper))

	privateKeyStr,_:=ioutil.ReadFile("private.pem")
	priblock,_:=pem.Decode([]byte(privateKeyStr))
	priKey,_:=x509.ParsePKCS1PrivateKey(priblock.Bytes)
	plaintext,_:=rsa.DecryptPKCS1v15(rand.Reader,priKey,chiper)
	fmt.Println("PlainText is: ",string(plaintext))
}

So when I do go run main.go, it shows me:

Chiper is: 
kI��n�s�޿���|{A��̰x�e��"��4�{4��t��F �뎓�z��VA�u����r�����
ͨQ�ca��C ��R��	<c��.���Ӭ�7h�����p����B�����B�>ʃ�̶K,�j����Z���AUB5�G��7�A�>���4�^��Ͽ�u���0�u��w�1A�hx��F�#��y+� =4�b��k
PlainText is:  helloworld
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment