이 글은 기계 번역의 미러 문서이며, 원본 기사로 바로 이동하려면 여기를 클릭해 주세요.

보기: 18182|회답: 0

[출처] C#은 RSA 암호화 및 복호화를 상세히 구현합니다

[링크 복사]
게시됨 2015. 11. 4. 오후 12:37:23 | | |
프로젝트 요구사항은, 개인 키와 공개 키 생성, 공개 키로 암호화, 개인 키로 복호화하는 것, 저는 이렇게 구현했습니다,



이런 도움이 필요한 친구들에게 도움이 되고 싶습니다.







소스 코드는 다음과 같습니다:



1. 키 쌍을 생성한다:



          /// <summary>
        개인 키에 대해 arr[1] 사익 키 생성 및 공개 키 arr[0]
        /// </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 문자열</param>
        <param name="sPublicKey" >공개키</param>
        /// <returns></returns>
        공개 정적 문자열 EncryptString(문자열 sSource,문자열 sPublicKey)
        {
            RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
            문자열 평문 = sSource;
            RSA. FromXmlString(sPublicKey);
            byte[] 암호 bytes;
            byte[] byteEn = rsa. Encoding.UTF8.GetBytes("a"), false);
            암호 단위 = RSA. Encoding.UTF8.GetBytes(평문), false);



            StringBuilder sbString = 새로운 StringBuilder();
            (정수: 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++)
            {
                if (sBytes[j] != "")
                {
                    byteEn[j] = Byte.Parse(sBytes[j]);
                }
            }
            바이트[] plaintbytes = RSA. Decrypt(byteEn, false);
            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 =new 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;



        복호화된 평문을 콘솔에 표시하세요.

        ByteConverter.GetString(decryptedData);

    }

    catch (예외 exc)

    {

        Exceptions.LogException(exc);

        Console.WriteLine(제외) 메시지);

        "귀속";

    }

}



staticpublicstring Encrypt(string toEncryptString)

{

    시도해

    {

        바이트 배열과 문자열 간 변환을 위해 UnicodeEncoder를 만드세요.

        UnicodeEncoding ByteConverter =new 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);

        return: base64code;

    }

    catch (예외 exc)

    {

        암호화가 문제될 경우를 대비해 이 예외를 찾아

        성공하지 못했다.

        Exceptions.LogException(exc);

        Console.WriteLine(제외) 메시지);

        "귀속";

    }







}



staticprivatebyte[] RSAEncrypt(

    바이트[] 데이터투암호화,

    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);

        콘솔.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);

        콘솔.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