๐ป[C#]RSA ์ํธํ, ๋ณตํธํ
RSA
๋จผ์ RSA๋ ์ ์ธ๊ณ์์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ๊ณต๊ฐํค ์ํธ ์๊ณ ๋ฆฌ์ฆ์ด๋ผ๊ณ ํ๋ค. ๋ฐฉ์์ ๊ณต๊ฐํค(public key) ๋ ์ํธํ ํ๋๋ฐ ์ฐ์ด๋ฉฐ , ๊ฐ์ธํค(private key) ๋ ๋ณตํธํํ๋๋ฐ์ ์ฐ์ธ๋ค. RSA๋ ์์ธ์ ๋ถํด๊ฐ ์ฐ์ธ๋ค๋๋ฐ ์ํ์ ์ธ ๋ถ๋ถ์ ๋ค๋ฃจ์ง ์์๊ฒ์ด๋ฉฐ ์์ ๋ฅผ ํตํด C#์์ ์ด๋ป๊ฒ ๊ตฌํ๋๋์ง ์ดํด๋ณด์
์์ ๋ RSACryptoServiceProvider๋ฅผ ์ฐธ๊ณ ํ์๋ค.
๐ ๊ฐ๋ฐ ํ๊ฒฝ
์ค์ต
RSACryptoServiceProvider ํด๋์ค
CSP(์ํธํ ์๋น์ค ๊ณต๊ธ์)๊ฐ ์ ๊ณตํ๋ RSA ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํ์ ์ฌ์ฉํ์ฌ ๋น๋์นญ ์ํธํ ๋ฐ ์ํธํด๋ ์ ์คํ ๊ฐ๋ฅํจ
์ํธํ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public static byte[] RSAEncrypt(byte[] DataToEncrypt, RSAParameters RSAKeyInfo, bool DoOAEPPadding)
{
try
{
byte[] encryptedData;
// ์๋ก์ด RSACryptoServiceProvider ์ธ์คํด์ค๋ฅผ ์์ฑ
using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider())
{
// ๊ณต๊ฐํค ์ ๋ณด๋ง ํ์
RSA.ImportParameters(RSAKeyInfo);
// ์ ๋ฌ๋ ๋ฐ์ดํธ ๋ฐฐ์ด์ ์ํธํํ๊ณ OAEP ํจ๋ฉ์ ์ง์
// OAEP ํจ๋ฉ์ Microsoft Windows XP ์ด์์์๋ง ์ฌ์ฉํ ์ ์์
encryptedData = RSA.Encrypt(DataToEncrypt, DoOAEPPadding);
}
return encryptedData;
}
catch (CryptographicException e)
{
Console.WriteLine(e.Message);
return null;
}
}
๋ณตํธํ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public static byte[] RSADecrypt(byte[] DataToDecrypt, RSAParameters RSAKeyInfo, bool DoOAEPPadding)
{
try
{
byte[] decryptedData;
// ์๋ก์ด RSACryptoServiceProvider ์ธ์คํด์ค๋ฅผ ์์ฑ
using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider())
{
// ๋น๋ฐํค ์ ๋ณด๊ฐ ํ์
RSA.ImportParameters(RSAKeyInfo);
// ์ ๋ฌ๋ ๋ฐ์ดํธ ๋ฐฐ์ด์ ๋ณตํธํํ๊ณ OAEP ํจ๋ฉ์ ์ง์
// OAEP ํจ๋ฉ์ Microsoft Windows XP ์ด์์์๋ง ์ฌ์ฉํ ์ ์์
decryptedData = RSA.Decrypt(DataToDecrypt, DoOAEPPadding);
}
return decryptedData;
}
catch (CryptographicException e)
{
Console.WriteLine(e.ToString());
return null;
}
}
์ฌ์ฉ์์
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
static void Main()
{
try
{
// ๋ฌธ์์ด๊ณผ ๋ฐ์ดํธ ๋ฐฐ์ด ๊ฐ์ ๋ณํ์ ์ํด UnicodeEncoding ์ธ์คํด์ค๋ฅผ ์์ฑํฉ๋๋ค.
UnicodeEncoding ByteConverter = new UnicodeEncoding();
// ์๋ณธ ๋ฐ์ดํฐ, ์ํธํ๋ ๋ฐ์ดํฐ, ๋ณตํธํ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๋ฐ์ดํธ ๋ฐฐ์ด์ ์์ฑํฉ๋๋ค.
byte[] dataToEncrypt = ByteConverter.GetBytes("RSA Sample");
byte[] encryptedData;
byte[] decryptedData;
// ๊ณต๊ฐํค์ ๋น๋ฐํค ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๊ธฐ ์ํด RSACryptoServiceProvider์ ์๋ก์ด ์ธ์คํด์ค๋ฅผ ์์ฑํฉ๋๋ค.
using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider())
{
// ๊ณต๊ฐํค ์ ๋ณด๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ํธํํฉ๋๋ค.
encryptedData = RSAEncrypt(dataToEncrypt, RSA.ExportParameters(false), false);
// ๋น๋ฐํค ์ ๋ณด๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๋ณตํธํํฉ๋๋ค.
decryptedData = RSADecrypt(encryptedData, RSA.ExportParameters(true), false);
// ๋ณตํธํ๋ ํ๋ฌธ ๋ฐ์ดํฐ๋ฅผ ์ฝ์์ ์ถ๋ ฅํฉ๋๋ค.
Console.WriteLine("Decrypted plaintext: {0}", ByteConverter.GetString(decryptedData));
}
}
catch (ArgumentNullException)
{
Console.WriteLine("Encryption failed.");
}
}
RSA.ExportParameters(false) ๋ ๊ณต๊ฐํค๋ฅผ ์์ฑํ๊ณ RSA.ExportParameters(true) ๋ ๋น๋ฐํค๋ฅผ ์์ฑํจ
๊ฒฐ๊ณผ
์ถ์ฒ
This post is licensed under CC BY 4.0 by the author.
