この記事は機械翻訳のミラー記事です。元の記事にジャンプするにはこちらをクリックしてください。

眺める: 18182|答える: 0

[出典] C#はRSA暗号化と復号を詳細に実装しています

[リンクをコピー]
掲載地 2015/11/04 12:37:23 | | |
プロジェクトの要件は、秘密鍵と公開鍵を生成し、公開鍵で暗号化し、秘密鍵で復号することです。私はこのように実装しました。



このニーズを持つ友人たちの助けになればと思っています。







ソースコードは以下の通りです:



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;

    }

}

}

}

  1. static void Main(string[] args)
  2.         {
  3.             string encodeString = MyRSA.Encrypt("1234567");
  4.             Console.WriteLine(encodeString);


  5.             string decode = MyRSA.Decrypt(encodeString);
  6.             Console.WriteLine(decode);

  7.             Console.ReadLine();
  8.         }
コードをコピーします






先の:自分だけの個人フォーラムを無料で作り、代わりに作ってお金を稼げます。しかも3分でできます
次に:HTMLにおけるAタグにおけるonclickとhrefの使用
免責事項:
Code Farmer Networkが発行するすべてのソフトウェア、プログラミング資料、記事は学習および研究目的のみを目的としています。 上記の内容は商業的または違法な目的で使用されてはならず、そうでなければ利用者はすべての結果を負うことになります。 このサイトの情報はインターネットからのものであり、著作権紛争はこのサイトとは関係ありません。 ダウンロード後24時間以内に上記の内容を完全にパソコンから削除してください。 もしこのプログラムを気に入ったら、正規のソフトウェアを支持し、登録を購入し、より良い本物のサービスを受けてください。 もし侵害があれば、メールでご連絡ください。

Mail To:help@itsvse.com