|
|
게시됨 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;
}
}
}
}
- static void Main(string[] args)
- {
- string encodeString = MyRSA.Encrypt("1234567");
- Console.WriteLine(encodeString);
- string decode = MyRSA.Decrypt(encodeString);
- Console.WriteLine(decode);
- Console.ReadLine();
- }
코드 복사
|
이전의:무료로 개인 포럼을 만들고, 대신 만들어 수익을 낼 수 있으며, 3분 만에 가능합니다다음:HTML의 A 태그에서 onclick과 href 사용
|