You've already forked rsa-file-encryption
inital working commit
This commit is contained in:
130
crypt/keys.go
Normal file
130
crypt/keys.go
Normal file
@@ -0,0 +1,130 @@
|
||||
package crypt
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"crypto/rand"
|
||||
"crypto/rsa"
|
||||
"crypto/sha512"
|
||||
"crypto/x509"
|
||||
"encoding/pem"
|
||||
"os"
|
||||
)
|
||||
|
||||
func (f *EncryptedFile) encryptSymmetricKey() error {
|
||||
hash := sha512.New()
|
||||
ciphertext, err := rsa.EncryptOAEP(hash, rand.Reader, f.PublicKey, f.symmetricKey, nil)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
f.symmetricKeyEnc = ciphertext
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (f *EncryptedFile) decryptSymmetricKey() error {
|
||||
hash := sha512.New()
|
||||
plaintext, err := rsa.DecryptOAEP(hash, rand.Reader, f.privateKey, f.symmetricKeyEnc, nil)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
f.symmetricKey = plaintext
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (f *EncryptedFile) OsReadPublicKey(path string) error {
|
||||
pemKey, err := os.ReadFile(path)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
f.PublicPem = pemKey
|
||||
err = f.ParsePublicPem()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (f *EncryptedFile) OsReadPrivateKey(path string) error {
|
||||
pemKey, err := os.ReadFile(path)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
f.privatePem = pemKey
|
||||
|
||||
err = f.ParsePrivatePem()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (f *EncryptedFile) GenerateSymmetricKey() error {
|
||||
symKey := make([]byte, 32)
|
||||
_, err := rand.Read(symKey)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
f.symmetricKey = symKey
|
||||
|
||||
err = f.encryptSymmetricKey()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (f *EncryptedFile) ParsePublicPem() error {
|
||||
pemKeyBin, _ := pem.Decode(f.PublicPem)
|
||||
|
||||
if bytes.Contains(f.PublicPem, []byte("-----BEGIN PUBLIC KEY-----")) {
|
||||
key, err := x509.ParsePKIXPublicKey(pemKeyBin.Bytes)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
f.PublicKey = key.(*rsa.PublicKey)
|
||||
return nil
|
||||
}
|
||||
|
||||
pubKey, err := x509.ParsePKCS1PublicKey(pemKeyBin.Bytes)
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
f.PublicKey = pubKey
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (f *EncryptedFile) ParsePrivatePem() error {
|
||||
pemKeyBin, _ := pem.Decode(f.privatePem)
|
||||
|
||||
if bytes.Contains(f.privatePem, []byte("-----BEGIN PRIVATE KEY-----")) {
|
||||
key, err := x509.ParsePKCS8PrivateKey(pemKeyBin.Bytes)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
f.privateKey = key.(*rsa.PrivateKey)
|
||||
return nil
|
||||
}
|
||||
|
||||
privKey, err := x509.ParsePKCS1PrivateKey(pemKeyBin.Bytes)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
f.privateKey = privKey
|
||||
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user