RSA og public private keys
Hej eksperter.Jeg har prøvet og forstå hvordan RSA i C# Core fungere, siden den er meget anderledes end i .Net Framework
Jeg har f.eks været nødsaget til og bruge RSAParameters til og importere og exportere mine keypairs, desværre er den lidt svær og serializere da den prøver og holde den private nøgle hemmelig, som er lidt træls, hvis man f.eks prøver og gemme den private nøgle til en fil.
efter hvad jeg kan forstå er en private nøgle {e,n} mens den offentlige nøgle er {d,n}.
e er Exponent i RSAParameters
n er Modulus i RsAParameters
d er D i RSAParameters
men hvis jeg kun importere og exportere disse componenter, brokker den sig med exeption..
jeg under mig bare om jeg gøre dette korrekt ved og parse aller parameters, eller om man kan gøre de anderledes?
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
namespace RsaEncrypt
{
class Program
{
static void Main(string[] args)
{
MakeKeyIfNeeded();
bool finish = false;
do
{
Console.Write("(R)ead / (W)rite / (Q)uit?:");
var keyInfo = Console.ReadKey();
Console.WriteLine();
if(keyInfo.Key == ConsoleKey.R)
{
ReadAction();
}
else if(keyInfo.Key == ConsoleKey.W)
{
WriteAction();
}
else if(keyInfo.Key == ConsoleKey.Q)
{
finish = true;
}
} while (!finish);
Console.WriteLine("Press Any Key to Exit");
Console.ReadKey();
}
private static void MakeKeyIfNeeded()
{
if (!System.IO.File.Exists("secret.json"))
{
Console.WriteLine("Key Not Found... Creating One");
KeyHandler kh = new KeyHandler();
kh.Save();
}
}
static void WriteAction()
{
KeyHandler kh = new KeyHandler();
kh.Open();
Console.Write("Write message to Encrypt:");
string text = Console.ReadLine();
kh.SaveData(kh.Encrypt(text));
}
static void ReadAction()
{
KeyHandler kh = new KeyHandler();
kh.Open();
string text = kh.Decrypt(kh.OpenData());
Console.WriteLine("Encrypted Message is: "+text);
}
}
class KeyHandler
{
RSA rsa;
RSAEncryptionPadding encryptionPadding;
public KeyHandler()
{
rsa = RSA.Create();
rsa.KeySize = 2048;
encryptionPadding = RSAEncryptionPadding.OaepSHA1;
}
public void Save()
{
var keyPair= rsa.ExportParameters(true);
Dictionary<string, byte[]> keyData = new Dictionary<string, byte[]>();
keyData.Add("D", keyPair.D);
keyData.Add("DP", keyPair.DP);
keyData.Add("DQ", keyPair.DQ);
keyData.Add("E", keyPair.Exponent);
keyData.Add("InverseQ", keyPair.InverseQ);
keyData.Add("N", keyPair.Modulus);
keyData.Add("P", keyPair.P);
keyData.Add("Q", keyPair.Q);
string json = JsonConvert.SerializeObject(keyData);
System.IO.File.WriteAllText("secret.json",json);
}
public void SaveData(string data)
{
System.IO.File.WriteAllText("data.txt", data);
}
public string OpenData()
{
return System.IO.File.ReadAllText("data.txt");
}
public void Open()
{
string json = System.IO.File.ReadAllText("secret.json");
var keyData = JsonConvert.DeserializeObject<Dictionary<string, byte[]>>(json);
RSAParameters keyPair = new RSAParameters { D = keyData["D"], DP=keyData["DP"],DQ=keyData["DQ"],Exponent = keyData["E"],InverseQ=keyData["InverseQ"], Modulus = keyData["N"],P=keyData["P"],Q=keyData["Q"] };
rsa.ImportParameters(keyPair);
}
public string Encrypt(string m)
{
byte[] inData = System.Text.Encoding.UTF8.GetBytes(m);
byte[] outData = rsa.Encrypt(inData,encryptionPadding);
return BA2HS(outData);
}
public string Decrypt(string hs)
{
byte[] inData = HS2BA(hs);
byte[] outData = rsa.Decrypt(inData, encryptionPadding);
return System.Text.Encoding.UTF8.GetString(outData);
}
private string BA2HS(byte[] array)
{
return String.Join("", array.Select(b => b.ToString("X2")));
}
private byte[] HS2BA(string hexstring)
{
return Enumerable.Range(0, hexstring.Length)
.Where(x => x % 2 == 0)
.Select(x => Convert.ToByte(hexstring.Substring(x, 2), 16))
.ToArray();
}
}
}