プロジェクトの要件は、秘密鍵と公開鍵を生成し、公開鍵で暗号化し、秘密鍵で復号することです。私はこのように実装しました。
このニーズを持つ友人たちの助けになればと思っています。
ソースコードは以下の通りです:
1. キーのペアを生成する:
/// <summary> 秘密鍵と公開鍵 arr[0] を生成し、公開鍵 arr[1] を公開鍵に対して生成します /// </summary> /// <returns></returns> 公開静的文字列[] GenerateKeys() { string[] sKeys = 新しい文字列[2]; RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); sKeys[0] = rsa。 ToXmlString(true); sKeys[1] = RSA。 ToXmlString(false); sKeysを返します。 }
2. 暗号化:
/// <summary> RSA暗号化 /// </summary> <param name="sSource" >Source string</param> <param name="sPublicKey" >公開鍵</param> /// <returns></returns> public static string EncryptString(string sSource,string sPublicKey) { RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); 文字列平文 = sSource; RSA。 FromXmlString(sPublicKey); byte[] cipherbytes; byte[] byteEn = rsa。 Encoding.UTF8.GetBytes("a"), false); 暗号バイト = RSA。 Encoding.UTF8.GetBytes(平文)、false);
StringBuilder sbString = new StringBuilder(); (int i = 0; 私は暗号バイト<。 長さ; i++) { sbString.Append(cipherbytes+ ","); }
3. 復号化:
/// <summary> RSA復号 /// </summary> <param name="sSource">Source文字列</param> <param name="sPrivateKey">Private Key</param> /// <returns></returns> 公開静的文字列DecryptString(String sSource, string sPrivateKey) { RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); RSA。 FromXmlString(sPrivateKey); byte[] byteEn = rsa。 Encoding.UTF8.GetBytes("a"), false); string[] sBytes = sSource.Split(',');
(int j = 0; j < sBytes.Length; j++) { もし (sBytes[j] != """) { byteEn[j] = Byte.Parse(sBytes[j]); } } byte[] plaintbytes = RSA。 Decrypt(byteEn, false); return Encoding.UTF8.GetString(plaintbytes); } sbString.ToString(); }
--------------------------------------------------------------------
RSA暗号化および復号化のソースコード:
Systemを使い、 System.Collections.Genericを使い、 System.Linqを使い、 System.Textを使い、 System.Security.Cryptographyを用い、
名前空間 MyRSA 名前空間 MyRSA
{
パブリッククラスMyRSA
{
privatestaticstring publicKey =
「<RSAKeyValue><Modulus>6CdsXgYOyya/yQH」+
"TO96dB3gEurM2UQDDVGrZoe6RcAVTxAqDDf5L"+
"wPycZwtNOx3Cfy44/D5Mj86koPew5soFIz9sx"+
「PAHRF5hcqJoG+q+UfUYTHYCsMH2cnqGVtnQiE」+
"/PMRMmY0RwEfMIo+TDpq3QyO03MaEsDGf13sP"+
「w9YRXiac=</Modulus><Exponent>AQAB」</Exponent></RSAKeyValue>;
privatestaticstring privateKey =
「<RSAKeyValue><Modulus>6CdsXgYOyya/yQH」+
"TO96dB3gEurM2UQDDVGrZoe6RcAVTxAqDDf5L"+
"wPycZwtNOx3Cfy44/D5Mj86koPew5soFIz9sx"+
「PAHRF5hcqJoG+q+UfUYTHYCsMH2cnqGVtnQiE」+
"/PMRMmY0RwEfMIo+TDpq3QyO03MaEsDGf13sP"+
"w9YRXiac=</Modulus><Exponent>AQAB"</Exponent>+
"<P>/aoce2r6tonjzt1IQI6FM4ysR40j/gKvt4d"+
"L411pUop1Zg61KvCm990M4uN6K8R/DUvAQdrRd"+
"VgzvvAxXD7ESw==</P><Q>6kqclrEunX/fmOle"+
"VTxG4oEpXY4IJumXkLpylNR3vhlXf6ZF9obEpG"+
"lq0N7sX2HBxa7T2a0WznOAb0si8FuelQ==</Q>"+
"<DP>3XEvxB40GD5v/Rr4BENmzQW1MBFqpki6FU"+
「GrYiUd2My+iAW26nGDkUYMBdYHxUWYlIbYo6Te」+
"zc3d/oW40YqJ2Q==</DP><DQ>LK0XmQCmY/ArY"+
"gw2Kci5t51rluRrl4f5l+aFzO2K+9v3PGcndjA"+
"StUtIzBWGO1X3zktdKGgCLlIGDrLkMbM21Q==</DQ><InverseQ>"+
"GqC4Wwsk2fdvJ9dmgYlej8mTDBWg0Wm6aqb5kjn"+
「cWK6WUa6CfD+XxfewIIq26+4Etm2A8IAtRdwPl4"+
"aPjSfWdA==</InverseQ><D>a1qfsDMY8DSxB2D"+
"Cr7LX5rZHaZaqDXdO3GC01z8dHjI4dDVwOS5ZFZ"+
"s7MCN3yViPsoRLccnVWcLzOkSQF4lgKfTq3IH40"+
"H5N4gg41as9GbD0g9FC3n5IT4VlVxn9ZdW+WQry"+
"oHdbiIAiNpFKxL/DIEERur4sE1Jt9VdZsH24CJE=</D></RSAKeyValue>";
staticpublicstring Decrypt(string base64code)
{
やってみて
{
バイト配列と文字列を変換するためのUnicodeEncoderを作成します。
UnicodeEncoding ByteConverter =新しいUnicodeEncoding();
RSACryptoServiceProviderの新しいインスタンスを作成して生成します
公開鍵および秘密鍵データ。
RSACryptoServiceProvider RSA =new RSACryptoServiceProvider();
RSA。 FromXmlString(privateKey);
byte[] encryptedData;
byte[] decryptedData;
encryptedData = Convert.FromBase64String(base64code);
データをDECRYPT(秘密鍵情報)に渡します
(RSACryptoServiceProvider.ExportParameters(true)を使用)、
OAEPのパディングを使わないブールフラグが使われています。
decryptedData = RSADecrypt(
暗号化データ、RSA。 ExportParameters(true)、false;
復号された平文をコンソールに表示してください。
return ByteConverter.GetString(decryptedData);
}
キャッチ(例外 exc)
{
Exceptions.LogException(exc);
Console.WriteLine(例: メッセージ);
「戻る」;
}
}
staticpublicstring Encrypt(string toEncryptString)
{
やってみて
{
バイト配列と文字列を変換するためのUnicodeEncoderを作成します。
UnicodeEncoding ByteConverter =新しいUnicodeEncoding();
元のデータ、暗号化済み、復号されたデータを保持するバイト配列を作成します。
byte[] dataToEncrypt =
ByteConverter.GetBytes(toEncryptString);
byte[] encryptedData;
byte[] decryptedData;
RSACryptoServiceProviderの新しいインスタンスを作成して生成します
公開鍵および秘密鍵データ。
RSACryptoServiceProvider RSA =new RSACryptoServiceProvider();
RSA。 FromXmlString(privateKey);
データをENCRYPTに渡す、公開鍵情報
(RSACryptoServiceProvider.ExportParameters(false)を使用)、
OAEPのパディングを使わないブールフラグが使われています。
encryptedData = RSAEncrypt(
dataToEncrypt、RSA。 ExportParameters(false)、false);
string base64code = Convert.ToBase64String(encryptedData);
返却base64code;
}
キャッチ(例外 exc)
{
暗号化がそうなった場合に備えて、この例外を把握してください
成功しなかった。
Exceptions.LogException(exc);
Console.WriteLine(例: メッセージ);
「戻る」;
}
}
staticprivatebyte[] RSAEncrypt(
バイト[] DataToEncrypt,
RSAParameters RSAKeyInfo、
bool DoOAEPPadding)
{
やってみて
{
RSACryptoServiceProviderの新しいインスタンスを作成します。
RSACryptoServiceProvider RSA =new RSACryptoServiceProvider();
RSAキーの情報をインポートしてください。 これだけでいい
公開鍵情報を含めること。
RSA。 ImportParameters(RSAKeyInfo);
パスバイト配列を暗号化し、OAEPパディングを指定します。
OAEPのパディングはMicrosoft Windows XPでのみ利用可能です。
あとで。
RSAを返却してください。 Encrypt(DataToEncrypt, DoOAEPPadding);
}
CryptographicExceptionをキャッチして表示する
コンソールへ。
catch(CryptographicException e)
{
Exceptions.LogException(e);
Console.WriteLine(e.Message);
returnnull;
}
}
staticprivatebyte[] RSADecrypt(
バイト[] DataToDecrypt、
RSAParameters RSAKeyInfo、
bool DoOAEPPadding)
{
やってみて
{
RSACryptoServiceProviderの新しいインスタンスを作成します。
RSACryptoServiceProvider RSA =new RSACryptoServiceProvider();
RSAキーの情報をインポートしてください。 この必要性
秘密鍵情報を含めるために。
RSA。 ImportParameters(RSAKeyInfo);
パスバイト配列を復号し、OAEPパディングを指定します。
OAEPのパディングはMicrosoft Windows XPでのみ利用可能です。
あとで。
RSAを返却してください。 Decrypt(DataToDecrypt, DoOAEPPadding);
}
CryptographicExceptionをキャッチして表示する
コンソールへ。
catch(CryptographicException e)
{
Exceptions.LogException(e);
Console.WriteLine(e.Message);
returnnull;
}
}
}
}
- static void Main(string[] args)
- {
- string encodeString = MyRSA.Encrypt("1234567");
- Console.WriteLine(encodeString);
- string decode = MyRSA.Decrypt(encodeString);
- Console.WriteLine(decode);
- Console.ReadLine();
- }
コードをコピーします
|