C#でRSA暗号化・復号化を実装する

以前、暗号化して通信をやり取りするという記事ではAES256という方式を紹介しました
今回はRSAと呼ばれる方式を紹介します

RSA暗号については以下を参考にしてください

それぞれの鍵を生成する

RSAを使用する際に必要となる公開鍵と秘密鍵を生成します。今回はファイルとして書き出していますが、使用用途に応じて変更してください

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(2048);

//公開鍵をXML形式で取得
String publicKey = rsa.ToXmlString(false);
//秘密鍵をXML形式で取得
String privateKey = rsa.ToXmlString(true);

byte[] bytesPublicKey = Encoding.UTF8.GetBytes(publicKey);
byte[] bytesPrivateKey = Encoding.UTF8.GetBytes(privateKey);

//公開鍵を保存
FileStream puKey = new FileStream(publicKeyPath, FileMode.Create, FileAccess.Write);
puKey.Write(bytesPublicKey, 0, bytesPublicKey.Length);
puKey.Close();

//秘密鍵を保存
FileStream prKey = new FileStream(privateKeyPath, FileMode.Create, FileAccess.Write);
prKey.Write(bytesPrivateKey, 0, bytesPrivateKey.Length);
prKey.Close();

rsa.Clear();

公開鍵を使用して暗号化する

先ほど生成した公開鍵を使用して暗号化します

StreamReader sr = new StreamReader(publicKeyPath, Encoding.UTF8);
string PublicKey = sr.ReadToEnd();
sr.Close();

// RSACryptoServiceProviderオブジェクトの作成
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(2048);
rsa.FromXmlString(PublicKey);

byte[] data = Encoding.UTF8.GetBytes(_planText);

data = rsa.Encrypt(data, false);

Convert.ToBase64String(data);

秘密鍵を使用して復号化する

今度は先ほど作成した公開鍵を使用して暗号化したものを秘密鍵を使用して復号化します

StreamReader sr = new StreamReader(privateKeyPath, Encoding.UTF8);
string PrivateKey = sr.ReadToEnd();
sr.Close();

// RSACryptoServiceProviderオブジェクトの作成
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(2048);
// 秘密鍵を指定
rsa.FromXmlString(PrivateKey);  

byte[] data = Convert.FromBase64String(_cipherText);

data = rsa.Decrypt(data, false);

Encoding.UTF8.GetString(data);

最後に

実際に実行すると以下のように問題なく、暗号化・復号化できました
今回作成したコードをGitHubにアップしていますので参考にしてみてください

タイトルとURLをコピーしました