Post

๐Ÿ’ป[C#]RSA ์•”ํ˜ธํ™”, ๋ณตํ˜ธํ™”

RSA

๋จผ์ € RSA๋Š” ์ „ ์„ธ๊ณ„์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ๊ณต๊ฐœํ‚ค ์•”ํ˜ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ผ๊ณ ํ•œ๋‹ค. ๋ฐฉ์‹์€ ๊ณต๊ฐœํ‚ค(public key) ๋Š” ์•”ํ˜ธํ™” ํ•˜๋Š”๋ฐ ์“ฐ์ด๋ฉฐ , ๊ฐœ์ธํ‚ค(private key) ๋Š” ๋ณตํ˜ธํ™”ํ•˜๋Š”๋ฐ์— ์“ฐ์ธ๋‹ค. RSA๋Š” ์†Œ์ธ์ˆ˜ ๋ถ„ํ•ด๊ฐ€ ์“ฐ์ธ๋‹ค๋Š”๋ฐ ์ˆ˜ํ•™์ ์ธ ๋ถ€๋ถ„์€ ๋‹ค๋ฃจ์ง€ ์•Š์„๊ฒƒ์ด๋ฉฐ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด C#์—์„œ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„๋˜๋Š”์ง€ ์‚ดํŽด๋ณด์ž


์˜ˆ์ œ๋Š” RSACryptoServiceProvider๋ฅผ ์ฐธ๊ณ ํ•˜์˜€๋‹ค.

๐Ÿ“š ๊ฐœ๋ฐœ ํ™˜๊ฒฝ

  • View VisualStudio 2022
  • View .NET 6
  • View Console APP

์‹ค์Šต

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) ๋Š” ๋น„๋ฐ€ํ‚ค๋ฅผ ์ƒ์„ฑํ•จ

๊ฒฐ๊ณผ

image

์ถœ์ฒ˜

https://gngsn.tistory.com/96

This post is licensed under CC BY 4.0 by the author.

ยฉ Gubeommo. Some rights reserved.

Using the Chirpy theme for Jekyll.