プログラム 技術

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

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

関連記事
データを暗号化してやり取りする(C#とJavaScript) - ナストンのまとめ
データを暗号化してやり取りする(C#とJavaScript) - ナストンのまとめ

業務でJavaScriptとAzureFunctionでデータをやり取りする際に暗号化する必要がありました違う言語での暗 ...

続きを読む

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

参考サイト
公開鍵暗号方式のRSA暗号とは?暗号の仕組み4つと応用事例を紹介 | テックマガジン from ネプラス
公開鍵暗号方式のRSA暗号とは?暗号の仕組み4つと応用事例を紹介 | テックマガジン from ネプラス

インターネットを介して情報を送ったり受け取ったりすることが増えたことで、情報の暗号化は必須の技術となっています。本記事で ...

続きを読む

それぞれの鍵を生成する

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にアップしていますので参考にしてみてください

サンプル
BlogSampleCodeProjects/RSAEncrytDecry at main · nasuton/BlogSampleCodeProjects · GitHub
BlogSampleCodeProjects/RSAEncrytDecry at main · nasuton/BlogSampleCodeProjects · GitHub

Project for sample code used in the blog.(Blogで記載しているサンプルコード ...

続きを読む

-プログラム, 技術
-