.
.
Core Java
Technologies Technical Tips
.
 
2004³â 1¿ù 20ÀÏ  


Core Java Technologies Tech Tips¿¡ ¿À½Å ¿©·¯ºÐÀ» ȯ¿µÇÕ´Ï´Ù. Java 2 Platform, Standard Edition (J2SE)¿¡ ±â¹ÝÇÑ core Java technologies ¿Í APIsÀÇ »ç¿ë¿¡ °üÇÑ ÃֽŠÁ¤º¸¸¦ ¾ò¾î °¡½Ã±â ¹Ù¶ø´Ï´Ù. ÀÌ ±Û¿¡¼­´Â Java 2 SDK, Standard Edition, v 1.4¸¦ »ç¿ëÇÕ´Ï´Ù.

À̹ø È£¿¡¼­´Â,

-KEYPAIRGENERATOR¸¦ ÀÌ¿ëÇØ¼­ ºñ´ëĪ ¾ÏÈ£ Ű ±¸Çϱâ
-´ëĪ۸¦ ÀÌ¿ëÇÑ ¾Ïȣȭ¿Í º¹È£È­

À» ´Ù·ç°Ô µË´Ï´Ù.

ÀúÀÚ Daniel H. Steinberg

.
.

KEYPAIRGENERATOR¸¦ ÀÌ¿ëÇØ¼­ ºñ´ëĪ ¾ÏÈ£ Ű ±¸Çϱâ

°ø°³ Ű ¾Ïȣȭ(public key encryption)´Â »ç¿ëÀÚ°¡ ¾Ïȣȭ(encrypt)ÇÑ ¸Þ½ÃÁö¸¦ º¹È£È­(decrypt)Çϰųª º¹È£È­¸¸ÀÌ °¡´ÉÇÑ ¸Þ½ÃÁö¸¦ ¾ÏȣȭÇϴµ¥ »ç¿ëµÇ´Â °ø°³ Ű(public key)¸¦ Á¦°øÇÒ ¼ö ÀÖµµ·Ï ÇØÁØ´Ù. Dr. Ronald L. Rivest, Dr. Adi Shamir, ±×¸®°í Dr. Leonard M. Adleman°¡ RSA ¾Ïȣȭ ÄÚµåÀÇ R, S, A¿¡ ÇØ´çÇÑ´Ù. À̵éÀº °ø°³ Ű ¾ÏÈ£±â¹ý(cryptography)À¸·Î ACM's 2002 Turing Award Winners¸¦ ¼ö»óÇÏ¿´°í, ACM Turing Award WinnersÀ¥ÆäÀÌÁö¿¡¼­ "Early Days of RSA", "Cryptology: A Status Report", "Pre-RSA."¿¡ °üÇÑ À̵éÀÇ ÇÁ¸®Á¨Å×À̼ÇÀ» º¼ ¼ö ÀÖ´Ù.

RSA ¾Ïȣȭ ¾Ë°í¸®Áò(RSA encryption algorithm)Àº ÀÓÀÇÀûÀÌ°í »óÈ£ µ¶¸³ÀûÀÎ, °¡·É p=11, q=31°ú °°Àº Å©±â°¡ Å« µÎ °³ÀÇ ¼ÒÀμö¸¦ ¼±ÅÃÇÏ´Â °ÍÀ¸·ÎºÎÅÍ ½ÃÀÛÇÑ´Ù. ´ÙÀ½À¸·Î N=(p)(q)¸¦ °è»êÇϴµ¥, p=11, q=31ÀÎ °æ¿ì¿¡´Â N=(11)(31)=341ÀÌ´Ù. ±×¸®°í´Â Á¤¼ö e¸¦ Çϳª ¼±ÅÃÇϴµ¥ (p-1)(q-1)¿Í °øÅëÀμö°¡ ¾ø´Â 3°ú N-1 »çÀÌÀÇ ¹üÀ§¿¡¼­ ¼±ÅÃÇÑ´Ù. ¼ö 300Àº (2)(2)(3)(5)(5)À¸·Î ¼ÒÀμöºÐÇØ µÇ±â ¶§¹®¿¡ 2, 3, ȤÀº 5ÀÇ ¹è¼ö´Â Á¤¼ö eÀÇ ¼±ÅùüÀ§¿¡¼­ Á¦¿ÜµÈ´Ù. ÀÌ ¾Ë°í¸®Áò¿¡ ´ëÀÔÇÏ´Â ¼ö´Â ²À ¼ÒÀμö°¡ ¾Æ´Ï¾îµµ µÇ±â ¶§¹®¿¡ 49³ª 77°ú °°Àº ¼öµµ °¡´ÉÇÏ´Ù. °£´ÜÇÏ°Ô e= 7À» ´ëÀÔÇØº¸ÀÚ.

´ÙÀ½À¸·Î (d)(e)=1 (mod(p-1)(q-1))À» ¼º¸³ÇÏ´Â Á¤¼ö d°¡ ÇÊ¿äÇÏ´Ù. ¿©±â¼­ mod´Â ³ª¸ÓÁö ¿¬»êÀÌ´Ù. À§ÀÇ ¿¹Á¦¿¡¼­ e = 7 À̰í (p -1)(q-1) = 300À̱⠶§¹®¿¡ d´Â 7d % 300 = 1À» ÅëÇØ ±¸ÇÑ´Ù. ¿¬»êÀÇ ¹æ¹ýÀº 300ÀÇ ¹è¼ö¸¦ Çϳª ÀÌ»ó ã°í ÀÌ Áß, 7·Î ³ª´©¾î ¶³¾îÁö´Â ù¹øÂ° ¼ýÀÚ¸¦ ã¾Æ³»¸é µÈ´Ù. ´Ù½Ã ¸»Çϸé, 301, 601, 901 µîÀÌ °¡´ÉÇÑ °ªµéÀÌ´Ù. ÀÌÁß 301Àº 7·Î ³ª´©¾î ¶³¾îÁö±â ¶§¹®¿¡(43*7Àº 301ÀÌ´Ù.) d´Â 43ÀÌ´Ù.

¿©±â¼­ 2½ÖÀÇ ¼ýÀÚµéÀÌ Áß¿äÇѵ¥, RSA ¸ðµâ¿¡ µû¸£¸é N = (p)(q)À̰í, ÀÌ µÎ ½ÖÀÇ ¼ýÀÚµéÀÌ ÀÌ ½ÄÀÇ ÄÄÆ÷³ÍÆ®µéÀÌ´Ù. ù¹øÂ° ¼ýÀÚ½ÖÀÌ RSA ºñ¹Ð Ű(private key)ÀÎ (N,d)À̰í, µÎ ¹øÂ° ¼ýÀÚ½ÖÀÌ RSA °ø°³Å°(public key)ÀÎ (N,e)ÀÌ´Ù. D´Â RSA ºñ¹Ð Áö¼ö(private exponent) (d=7)À̰í e´Â RSA °ø°³ Áö¼ö(public exponent) (e=43)ÀÌ´Ù. ÀÌ¹Ì ¾Ë°í ÀÖ´Â °ø°³ Ű´Â °ø°³ÇÏÀÚ. ±×·¸Áö¸¸ ºñ¹Ð Ű(ƯÈ÷ d)¿Í ÃÖÃÊÀÇ ¼ÒÀμöµé(p¿Í q)Àº ºñ¹Ð·Î À¯ÁöÇØ¾ß ÇÑ´Ù.

±×·¸´Ù¸é ÀÚ¹Ù ÇÁ·Î±×·¡¹Ö ·©±ÍÁö°¡ RSA ±¸¼ºÀÇ ¾î´À ºÎºÐ¿¡¼­ ¾²¿©Áö´Â °ÍÀϱî? ÀÌ´Â java.security ÆÐŰÁö¸¦ ÅëÇØ ¾²¿©Áø´Ù. ÀÌ ÆÐŰÁö¸¦ ÀÌ¿ëÇϸé À§¿¡¼­ ¼³¸íÇÑ RSA ¾Ë°í¸®Áò¿¡ ÇÊ¿äÇÑ ½ÖÀ¸·Î ÀÌ·ïÁø ۸¦ »ý¼ºÇÒ ¼ö ÀÖ´Ù. ¸ÕÀú KeyPairGeneratorÀÇ ÀνºÅϽº¸¦ »ý¼ºÇÏ°í ±×°ÍÀ» ºñÆ®Çü½ÄÀÇ ¿øÇϴ Ű »çÀÌÁî·Î ÃʱâÈ­ÇÑ´Ù. ±×¸®°í generateKeyPair()¸Þ¼Òµå¸¦ È£ÃâÇϸé ÇÑ ½ÖÀÇ RSA ۸¦ »ý¼ºÇÒ ¼ö ÀÖ´Ù.

   KeyPairGenerator generator =
                   KeyPairGenerator.getInstance("RSA");
   generator.initialize(1024);
   KeyPair keyPair = generator.generateKeyPair();

ÀÌ ¾Ë°í¸®Áò¿¡¼­´Â factory getInstance() ¸Þ¼Òµå¿¡ ½ºÆ®¸µÀ» ÀÔ·ÂÇÑ´Ù. ¾Ë°í¸®ÁòÀÌ ÀνºÅçµÈ Á¦°øÀÚ(provider)¿¡ ÀÇÇØ Áö¿øµÇÁö ¾ÊÀ¸¸é NoSuchAlgorithmExceptionÀÌ ¹ß»ýÇÑ´Ù.

°¢°¢ÀÇ Á¦°øÀÚ´Â ¹Ýµå½Ã µðÆúÆ® ÃʱâÈ­¸¦ °ø±ÞÇϰí À̸¦ ¹®¼­È­ÇؾßÇÑ´Ù. Á¦°øÀÚ µðÆúÆ®(provider default)°¡ »ç¿ëÀÚÀÇ ¿ä±¸¿Í ¸Â¾Æ ¶³¾îÁö¸é, Áß°£ KeyPairGenerator °´Ã¼ (intermediate KeyPairGenerator object)¸¦ ÀúÀåÇÒ Çʿ䰡 ¾ø´Ù. ÇÑ ÁÙÀÇ ÄÚµå·Î Ű ½ÖÀ» °£´ÜÇÏ°Ô »ý¼ºÇÒ ¼ö´Â ÀÖÁö¸¸ Çϳª ÀÌ»óÀÇ Å° ½ÖÀ» »ý¼ºÇØ¾ß ÇÑ´Ù¸é, KeyPairGenerator °´Ã¼¸¦ Àç»ç¿ëÇÏ´Â °ÍÀÌ ³´´Ù. ¿Ö³ÄÇϸé ÀÌ´Â »õ·Î¿î KeyPairGenerator °´Ã¼¸¦ ¸Å¹ø »ý¼ºÇÏ´Â °Íº¸´Ù ÈξÀ ³ªÀº ÆÛÆ÷¸Õ½º¸¦ Áֱ⠶§¹®ÀÌ´Ù.

   import java.security.KeyPairGenerator;
   import java.security.NoSuchAlgorithmException;
   import java.security.KeyPair;

   public class AsymmetricKeyMaker {

      public static void main(String[] args) {
        String algorithm = "";
        if (args.length == 1) algorithm = args[0];

        try {
          KeyPair keyPair = KeyPairGenerator
                               .getInstance(algorithm)
                               .generateKeyPair();

          System.out.println(keyPair.getPublic());
          System.out.println(keyPair.getPrivate());

        } catch (NoSuchAlgorithmException e) {
          System.err.println(
            "usage: java AsymmetricKeyMaker <RSA | DSA>");
        }

      }
   }

½ºÆ®¸µ RSA´Â rsa, Rsa ȤÀº ¾î¶² ÇüÅÂÀ̵çÁö »ó°üÀÌ ¾ø´Ù. ´ÙÀ½°ú °°Àº ÇÁ·Î±×·¥À» ½ÇÇàÇϸé

   java AsymmetricKeyMaker RSA

Ãâ·Â°ªÀº ÀÌÇÏ¿Í °°´Ù.

   SunJSSE RSA public key:
      public exponent:
        010001
      modulus:
        b24a9b5b ba01c0cd 65096370 0b5a1b92 08f8555e
        7c1b5017 ec444c58 422b4109
        59f2e15d 43714d92 031db66c 7f5d48cd 17ecd74c
        39b17be2 bf9677be d0a0f02d
        6b24aa14 ba827910 9b166847 8154a2fa 919e0a2a
        53a6e79e 7d2933d8 05fc023f
        bdc76eed aa306c5f 52ed3565 4b0ec8a7 12105637
        af11fa21 0e99fffa 8c658e6d

   SunJSSE RSA private CRT key:
      private exponent:
        78417240 9059965d f3843d99 d94e51c2 52628dd2
        490b731e 6fb2317c 66451e7c
        dc3ac25f 519a1ea4 198df4f9 817ebe17 f7c73c00
        a1f96082 348f9cfd 0b63421b
        7f45f131 c363475c c1b25f57 ee029f5e 0848ba74
        ba81b730 ac4c0135 ce46478c
        e462361a 650e3356 f9b7a0c4 b682557d 3655c052
        5e3554bd 970100bf 10dc1b51
      modulus:
        b24a9b5b ba01c0cd 65096370 0b5a1b92 08f8555e
        7c1b5017 ec444c58 422b4109
        59f2e15d 43714d92 031db66c 7f5d48cd 17ecd74c
        39b17be2 bf9677be d0a0f02d
        6b24aa14 ba827910 9b166847 8154a2fa 919e0a2a
        53a6e79e 7d2933d8 05fc023f
        bdc76eed aa306c5f 52ed3565 4b0ec8a7 12105637
        af11fa21 0e99fffa 8c658e6d
      public exponent:
        010001
      prime p:
        e768033e 21646824 7bd031a0 a2d9876d 79818f8f
        2d7a952e 559fd786 2993bd04
        7e4fdb56 f175d04b 003ae026 f6ab9e0b 2af4a8d7
        ffbe01eb 9b81c75f 0273e12b
      prime q:
        c53d78ab e6ab3e29 fd98d0a4 3e58ee48 45a366ac
        e94dbd60 ea24ffed 0c67c5fd
        3628ea74 88d1d1ad 58d7f067 20c1e3b3 db52adf3
        c421d88c 4c4127db d03592c7
      prime exponent p:
        e09942b4 76029755 f9da3ba0 d70edcf4 337fbdcf
        d0eb6e89 f74f5a07 7ca94947
        6835a805 3dfd047b 17310dc8 a39834a0 504400f1
        0ce6e5c4 413df83d 4e0b1cdb
      prime exponent q:
        829b8afd a1984168 c2d1df4e f32e2653 5b31b17a
        cc5ebb09 a2e26f4a 040def90
        15be104a ac92ebda 72db4308 b72b4ce1 bb58cb71
        80adbcdc 625e3ecb 92daf6df
      crt coefficient:
        4d8190c5 7730b729 00a8f1b4 ae526300 b22d3e7d
        d64df98a c1b19889 5240141b
        0e618ff4 be597979 95195c51 0866c142 30b37a86
        9f3ef519 a3ae6469 14075097

ÀÚ¹Ù ÇÁ·Î±×·¡¹ÖÀÌ Ã³À½À̶ó¸é À§¿¡¼­ ÀûÀýÇÏ°Ô ¿À¹ö·ÎµùµÈ toString() ¸Þ¼ÒµåÀÇ Ãâ·Â°ªÀ» ÁÖ¸ñÇÒ Çʿ䰡 ÀÖ´Ù. "SunJSSE RSA public key:"À¸·Î ½ÃÀÛÇÏ´Â ÅØ½ºÆ®°¡ RSAPublicKey Ŭ·¡½º ³»ÀÇ toString() ¸Þ¼Òµå¸¦ È£ÃâÇÑ °á°ú°ªÀÌ´Ù. ÀÌ´Â e¶ó°í ºÒ¸®´Â °ø°³ Áö¼ö(public exponent)¿Í ¸ðµâ·¯½º(modulus) NÀ¸·Î ±¸¼ºµÇ¾î ÀÖ´Ù. "SunJSSE RSA private key:"·Î ½ÃÀÛÇÏ´Â ÅØ½ºÆ®´Â RSAPrivateKey Ŭ·¡½º ³»ÀÇ µ¿ÀÏÇÑ ¸Þ¼Òµå¸¦ È£ÃâÇÑ °á°úÀÌ´Ù. ÀÌ´Â ºñ¹Ð Áö¼ö d, ¸ðµâ·¯½º N, °ø°³ Áö¼ö e »Ó¸¸ ¾Æ´Ï¶ó »ý¼ºµÇ´Â ¼ÒÀμöµé¿¡ ´ëÇÑ Á¤º¸µµ Æ÷ÇÔÇϰí ÀÖ´Ù. ¸¸¾à µ¥ÀÌÅ͸¦ ¾ÏȣȭÇϰí ÀÖ´Â ÁßÀ̶ó¸é, °ø°³ Ű °ªÀ» Àü¼ÛÇÒ ¶§ ÁÖÀÇÇØ¾ß ÇÑ´Ù. ÇÏÁö¸¸, ÀÌ °ªµéÀÌ Àü¼ÛÀ» ÀÎÁõÇϴµ¥ »ç¿ëµÇ´Â ÁßÀ̶ó¸é, ´Ù¸¥ »ç¶÷µéÀÌ ÆÄÀÏÀ» Á¶È¸ ȤÀº °ËÁõÇÒ ¼ö ÀÖµµ·Ï À̸¦ °ø°³·Î ÇØ ³õ¾Æ¾ß ÇÑ´Ù.

Äڵ带 Àç½ÇÇàÇÏ°í ½ºÆ®¸µ DSA ¸¦ ÀÔ·ÂÇÏ¸é °ø°³ Ű¿Í ºñ¹Ð Ű ¸ðµÎ¿¡¼­ p, q ¿ÍgÀÇ °ªÀ» ãÀ» ¼ö°¡ ÀÖ´Ù. y °ªÀº °ø°³ Ű¿¡¼­, x°ªÀº ºñ¹Ð Ű¿¡¼­ Á¦°øµÈ´Ù. ÇÏÁö¸¸ ¾Ë°í¸®ÁòÀÌ ´Ù¸£±â ¶§¹®¿¡ ÀÌ·¯ÇÑ Á¤º¸´Â ´Ù¸¥ ¹æ¹ýÀ¸·Î °è»êµÇ°í °øÀ¯µÇ¾î¾ß ÇÑ´Ù.

±×·¸´Ù¸é ¾Ïȣȭ¿¡¼­ ÀÌ Å° ½ÖÀ» ¾î¶»°Ô »ç¿ëÇÒ °ÍÀΰ¡? RSAÀÇ °æ¿ì¸¦ ¸ÕÀú »ìÆìº¸¸é, ¾ÏȣȭÇÏ°í ½ÍÀº ÅØ½ºÆ®¸¦ Á¤ÇÏ°í ±×°ÍÀ» ¸ðµâ·¯½ºº¸´Ù ÀÛÀº ¼ö mÀ¸·Î ¹Ù²Û´Ù. ÀÌ¿¡ °üÇØ¼­´Â ÈÄ¿¡ ´õ ¾ð±ÞÇϵµ·Ï ÇϰڴÙ. ¿©±â¿¡¼­ Å©±â°¡ Å« ¼ÒÀμö¸¦ ¼±ÅÃÇÏ´Â ÀÌÀ¯¸¦ ¾Ë ¼ö Àִµ¥, ÀÌ´Â ¼ÒÀμöÀÇ °öÀÌ ¾Ïȣȭ µÉ ¼ö ÀÖ´Â °ÍµéÀÇ »çÀÌÁ °áÁ¤Çϱ⠶§¹®ÀÌ´Ù. ¿¹¸¦ µé¸é m=2¶ó°í °¡Á¤ÇÏÀÚ. ±×·¯¸é »ç¿ëÀÚ´Â c=m^e (mod N)¸¦ °è»êÇØ¼­ ¾ÏȣȭÇϱ⠽ÃÀÛÇÑ´Ù. ¹Ù²Ù¾î ¸»ÇÏÀÚ¸é, ¾ÏȣȭÇÏ´Â ¼ö¸¦ °ø°³ Áö¼öÀÇ °ÅµìÁ¦°ö±îÁö Áõ°¡½Ã۰í À̸¦ ¸ðµâ·¯½º·Î ³ª´« ³ª¸ÓÁö¸¦ ±¸ÇÑ´Ù. ÀÌ ¿¹¿¡¼­ 2^43 ´Â 341ÀÇ ¹è¼öº¸´Ù 8ÀÌ ´õ Å©±â ¶§¹®¿¡ c = 8À̶ó´Â ¾ÏȣȭµÈ ¸Þ½ÃÁö¸¦ Àü¼ÛÇØ¾ß ÇÑ´Ù.

º¹È£È­(decryption)´Â ºñ¹Ð ۸¦ ÀÌ¿ëÇØ¼­ ÇÁ·Î¼¼½º¸¦ ¹Ýº¹ÇÔÀ¸·Î½á ÀÌ·ïÁø´Ù. c^d(mod N)¸¦ ÀÌ¿ëÇÏÀÚ. ¿¹¸¦ ÅëÇØ »ìÆìº¸¸é, ¸ÕÀú 8^7 À» °è»êÇϰí À̸¦ 341À¸·Î ³ª´«´Ù. ³ª¸ÓÁö¸¦ ±¸Çغ¸¸é 2¶ó´Â ¸Þ½ÃÁö¸¦ ¹Þ°Ô µÈ´Ù. À̰ÍÀº ¿ì¿¬È÷ ³ª¿Â °ªÀÌ ¾Æ´Ï´Ù. ÀÌ´Â m^(e d) = m (mod N)¸¦ ³ªÅ¸³»´Â FermatÀÇ Á¤¸® ¾ÖÇø®ÄÉÀ̼ÇÀ» µû¸¥ °ÍÀÌ´Ù. º¸¾ÈÀ» À§Çؼ­ °¢°¢ÀÇ ÆÄƼ´Â ´Ù¸¥ ÆÄƼÀÇ °ø°³ ۸¦ ÀÌ¿ëÇØ¼­ ¾ÏȣȭÇÏ°Ô µÈ´Ù.

RSA ¾Ë°í¸®Áò¿¡ ´ëÇÑ Á¤º¸´Â RSA, DSA ¾Ë°í¸®Áò¿¡ ´ëÇÑ Á¤º¸´Â DSA¸¦ Âü°íÇϱ⠹ٶõ´Ù.

.
.

´ëĪ۸¦ ÀÌ¿ëÇÑ ¾Ïȣȭ¿Í º¹È£È­

Áö³­ ±Û ¿¡¼­´Â ¼­·Î ´Ù¸¥ ۸¦ »ç¿ëÇÏ´Â ¾Ïȣȭ¿Í º¹È£È­, Áï ºñ´ëĪ ¾Ïȣȭ(asymmetric encryption)¿¡ °üÇØ ¼³¸íÇß´Ù. ÇÏÁö¸¸ ¾Ïȣȭ¿Í º¹È£È­´Â ´ëĪÀûÀ¸·Î ÀÛ¾÷ÇÒ ¼öµµ ÀÖ´Ù. ÀÌ ±Û¿¡¼­ µ¥ÀÌÅ͸¦ ¾ÏȣȭÇÏ°í º¹È£È­Çϴµ¥ °°Àº ۸¦ »ç¿ëÇϰí ÀÖ´Â ¿¹¸¦ º¼ ¼ö ÀÖ´Ù. ¾çÂÊ ´Ù µ¿ÀÏÇÑ Å°¸¦ »ç¿ëÇϱ⠶§¹®¿¡ º¹È£È­´Â ¾Ïȣȭ °úÁ¤ÀÇ ÀϺθ¦ ¿ªÀ¸·Î Àû¿ëÇÏ¸é µÈ´Ù. Blowfish ¾Ë°í¸®ÁòÀÌ ´ëĪ ŰÀÇ ÇÑ ¿¹ÀÌ´Ù. Blowfish ¾Ë°í¸®ÁòÀº Java Cryptography Extension (JCE)¿¡ ÀÇÇØ Áö¿øµÇ°í javax.crypto.* packages¿¡¼­ ÀûÀýÇÑ APIs¸¦ ãÀ» ¼ö°¡ ÀÖ´Ù. ÇöÀç JCE¿¡ ÀÇÇØ Áö¿øµÇ´Â ¾ÏÈ£ ¾Ë°í¸®Áò(cipher algorithm)Àº Blowfish»Ó¸¸ ¾Æ´Ï¶ó, Digital Encryption Standard (DES), Triple DES Encryption (DESede), Password-based encryption algorithm (PBEWithMD5AndDES)ÀÌ ÀÖ´Ù.

´ëĪ Ű ¾Ë°í¸®ÁòÀº ºñ´ëĪ Ű ¾Ë°í¸®Áòº¸´Ù ÈξÀ ºü¸¥ °æÇâÀÌ ÀÖ´Ù. °Ô´Ù°¡ ù¹øÂ° ±Û¿¡¼­ º» °Í°ú °°ÀÌ ¾ÏȣȭµÉ ¼ö ÀÖ´Â ÅØ½ºÆ®ÀÇ »çÀÌÁî°¡ °ø°³ Ű¿Í ºñ¹Ð ۸¦ »ý¼ºÇÒ ¶§ »ç¿ëµÇ¾ú´ø µÎ°³ÀÇ ¼ÒÀμö °öÀÇ Å©±â¿¡ ÀÇÇØ Á¿ìµÈ´Ù. ÇÏÁö¸¸ ´ëĪ Ű ¾Ë°í¸®ÁòÀ» »ç¿ëÇÏ¸é ¾ÏȣȭÇϰíÀÚ ÇÏ´Â ´ë»óÀÇ Àüü Å©±â¿¡ ÀüÇô Á¦ÇÑÀ» ¹ÞÁö ¾Ê´Â´Ù. ´ëĪ ¾ÏÈ£ ¾Ë°í¸®Áò(symmetric cipher algorithms)ÀÇ Á¾·ù¿¡ µû¶ó ´Ù¸£Áö¸¸, ÀüÁ¦ ÀÔ·Â »çÀÌÁî´Â ºí·Ï »çÀÌÁîÀÇ ¹è¼ö¿©¾ßÇÏ°í ÆÐµù(padding)ÀÌ ¿ä±¸µÉ ¼öµµ ÀÖ´Ù. ´ëĪ Ű¿Í °ü·ÃÇÑ ¹®Á¦´Â ÀÌ Å°µéÀÌ ¾Ïȣȭ³ª º¹È£È­¿¡ °ü·ÃµÈ ÆÄƼ³»¿¡¼­´Â °øÀ¯µÇ¾î¾ß¸¸ ÇÑ´Ù´Â µ¥¿¡ ÀÖ´Ù. ±×·¸±â ¶§¹®¿¡ Â÷´ÜÀÌ µÇ°Å³ª °øÀεÇÁö ¾ÊÀº »ç¿ëÀÚ°¡ °øÀ¯ÇÏ´Â µîÀÇ ¹®Á¦°¡ »ý±æ ¼ö ÀÖ´Ù.

´ëĪ Ű¸¦ »ý¼ºÇÏ´Â °ÍÀº Ű ½ÖÀ» »ý¼ºÇß´ø °Í°ú ¸Å¿ì Èí»çÇÏ´Ù. KeyGenerator Ŭ·¡½ºÀÇ factory ¸Þ¼Òµå¸¦ »ç¿ëÇÏ°í ½ºÆ®¸µ°ªÀ» ¾Ë°í¸®Áò¿¡ ´ëÀÔÇÏÀÚ. generateKey() ¸Þ¼Òµå¸¦ È£ÃâÇϸé KeyPair ÀÎÅÍÆäÀ̽º ´ë½Å Key ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇÏ´Â °´Ã¼¸¦ µÇ¹ÞÀ» ¼ö ÀÖ´Ù.

   SecretKey key =
         KeyGenerator.getInstance("DES").generateKey();

´ÙÀ½À¸·Î Cipher¸¦ »ý¼ºÇϴµ¥, ÀÌ´Â JCE¸¦ ÀÌ¿ëÇÒ ¶§ Æí¸®ÇÏ´Ù. ¾ÖÇø®ÄÉÀ̼ÇÀ» ¹Ù²Ü ÇÊ¿ä ¾øÀÌ ¼­·Î ´Ù¸¥ Á¦°øÀÚÀÇ ÀÌÁ¡À» ÃëÇϱâ À§Çؼ­ Cipher Ŭ·¡½ºÀÇ factory ¸Þ¼Òµå¸¦ Àç»ç¿ëÇÏÀÚ. ÀÌÇÏÀÇ ¹æ¹ýÀ¸·Î Cipher¸¦ »ý¼ºÇÑ´Ù.

   Cipher cipher = Cipher.getInstance("DES");

Cipher´Â ¹ÙÀÌÆ® ¾î·¹ÀÌ ÇüÅ·Π³Ñ°ÜÁø µ¥ÀÌÅ͸¦ ¾Ïȣȭ ȤÀº º¹È£È­Çϴµ¥ »ç¿ëµÈ´Ù. ¾î¶² µ¿ÀÛÀÌ È£ÃâµÉÁö¸¦ ÁöÁ¤ÇÏ´Â init()°ú ±× ¿¬»êÀ» ½ÇÇàÇÏ´Â doFinal() ¸Þ¼Òµå°¡ ²À »ç¿ëÇØ¾ß¸¸ ÇÏ´Â Çʼö ¸Þ¼ÒµåµéÀÌ´Ù. °¡·É, ´ÙÀ½ 2ÁÙÀÇ ÄÚµùÀº ¹ÙÀÌÆ® ¾î·¹À̸¦ ¾ÏȣȭÇϱâ À§ÇØ »ý¼ºÇÑ textBytes¶ó°í ºÒ¸®´Â cipher¿Í key ÀνºÅϽº¸¦ »ç¿ëÇϰí ÀÖ´Ù. °á°ú´Â encryptedBytes¶ó°í ºÒ¸®´Â ¹ÙÀÌÆ® ¾î·¹ÀÌ ³»¿¡ ÀúÀåµÈ´Ù.

   cipher.init(Cipher.ENCRYPT_MODE, key);
   byte[] encryptedBytes =
      cipher.doFinal( textBytes );

´ÙÀ½ ÇÁ·Î±×·¥Àº À§ÀÇ °ªÀ» ¸ðÀ¸¸é¼­ ÀÔ·Â ½ºÆ®¸µÀ» ¹ÞÀº ÈÄ¿¡ ±×°ÍÀ» ¾ÏȣȭÇÑ´Ù. ±×¸®°í³ª¼­ ¾ÏȣȭµÈ ½ºÆ®¸µÀº ´Ù½Ã º¹È£È­µÈ´Ù.

   import javax.crypto.Cipher;
   import javax.crypto.BadPaddingException;
   import javax.crypto.IllegalBlockSizeException;
   import javax.crypto.KeyGenerator;
   import java.security.Key;
   import java.security.InvalidKeyException;

   public class LocalEncrypter {

        private static String algorithm = "DESede";
        private static Key key = null;
        private static Cipher cipher = null;

        private static void setUp() throws Exception {
            key = KeyGenerator.getInstance(algorithm).generateKey();
            cipher = Cipher.getInstance(algorithm);
        }

        public static void main(String[] args) 
           throws Exception {
            setUp();
            if (args.length !=1) {
                System.out.println(
                  "USAGE: java LocalEncrypter " +
                                         "[String]");
                System.exit(1);
            }
            byte[] encryptionBytes = null;
            String input = args[0];
            System.out.println("Entered: " + input);
            encryptionBytes = encrypt(input);
            System.out.println(
              "Recovered: " + decrypt(encryptionBytes));
        }

        private static byte[] encrypt(String input)
            throws InvalidKeyException, 
                   BadPaddingException,
                   IllegalBlockSizeException {
            cipher.init(Cipher.ENCRYPT_MODE, key);
            byte[] inputBytes = input.getBytes();
            return cipher.doFinal(inputBytes);
        }

        private static String decrypt(byte[] encryptionBytes)
            throws InvalidKeyException, 
                   BadPaddingException,
                   IllegalBlockSizeException {
            cipher.init(Cipher.DECRYPT_MODE, key);
            byte[] recoveredBytes = 
              cipher.doFinal(encryptionBytes);
            String recovered = 
              new String(recoveredBytes);
            return recovered;
          }
   }

Ä¿¸Çµå ¶óÀÎÀÇ ÆÄ¶ó¹ÌÅÍ·Î ¾î¶² ÅØ½ºÆ®³ª ÀÔ·ÂÇÒ ¼ö ÀÖ´Ù. °¡·É, Ä¿¸Çµå ¶óÀο¡ ´ÙÀ½À» ÀÔ·ÂÇϸé,

   java LocalEncrypter "Whatever phrase we would like to
    input at this point"

ÀÌÇÏÀÇ Ãâ·Â°ªÀ» º¸°Ô µÈ´Ù.

   Entered: Whatever phrase we would like to 
    input at this point
   Recovered: Whatever phrase we would like to 
    input at this point

À§ÀÇ ¿¹¿¡¼­ ¾Ïȣȭ¿Í º¹È£È­ ¸ðµÎ µ¿ÀÏÇÑ Key °´Ã¼¸¦ »ç¿ëÇØ¼­ ÀÌ·ïÁ³´Ù. ¾Ïȣȭ¿Í º¹È£È­´Â ´ë°Ô ¼­·Î ´Ù¸¥ ¹öÃò¾ó ¸Ó½Å¿¡¼­ ¹ß»ýÇϱ⠶§¹®¿¡ ¾ÈÀüÇÏ°Ô Å°¸¦ Àü¼ÛÇÒ ¼ö ÀÖ´Â ¸Þ¼Òµå°¡ ÇÊ¿äÇÏ´Ù.

ù¹øÂ° ±Û¿¡¼­ ºñ´ëĪ ¾ÏÈ£ ¾Ë°í¸®ÁòÀ» À§ÇÑ Å° ½ÖÀ» »ý¼ºÇÏ´Â ¹æ¹ýÀ» °øºÎÇß°í, µÎ¹øÂ° ±Û¿¡¼­´Â ´ëĪ Ű¸¦ »ç¿ëÇÏ´Â ¹æ¹ýÀ» »ìÆìº¸¾Ò´Ù. ÇÏÁö¸¸ ºñ´ëĪ Ű¿Í ´ëĪ Ű¸¦ °áÇÕÇØ¼­ »ç¿ëÇÏ´Â ¶Ç ´Ù¸¥ Å×Å©´ÐÀÌ ÀÖ´Ù. ÀÌ ±â¹ýÀº ÀÓÀÇ´ë·Î ´ëĪ Ű¸¦ ¼±ÅÃÇØ¼­ µ¥ÀÌÅ͸¦ ¾ÏȣȭÇϴµ¥ »ç¿ëÇÑ´Ù. ±×¸®°í´Â ´Ù¸¥ ÆÄƼÀÇ °ø°³ ۸¦ ÀÌ¿ëÇØ¼­ ´ëĪ Ű ±× ÀÚü°¡ ¾ÏȣȭµÈ´Ù. ±×·¯¸é ¹Þ´Â »ç¶÷Àº ´ëĪ Ű¸¦ ¾ÏȣȭÇϱâ À§Çؼ­ ±×µéÀÇ ºñ¹Ð ۸¦ ÀÌ¿ëÇÏ°í ¸Þ½ÃÁö¸¦ º¹È£È­Çϱâ À§ÇØ º¹È£È­µÈ ۸¦ ÀÌ¿ëÇÑ´Ù. ºñ´ëĪ ±â¹ý¿¡¼­ »ç¿ëµÇ´Â ¸ðµâ·¯½º´Â ´ëĪ Ű¸¦ ¾ÏȣȭÇÒ Á¤µµÀÇ Å©±â¸¸ µÇ¸é µÈ´Ù. ´ëĪ Ű´Â ´ÜÀÏ Àü¼ÛÀ» À§Çؼ­ »ç¿ëµÈ ÈÄ Á¦°ÅµÈ´Ù. ÀÌ·¯ÇÑ ¹æ¹ýÀ¸·Î °¢°¢ÀÇ Å¸ÀÔÀÇ ´ÜÁ¡ÀÌ º¸¿ÏµÈ´Ù. °¢ ÁÖÁ¦¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ Á¤º¸´Â ´ÙÀ½À» Âü°íÇϱ⠹ٶõ´Ù.

.
.
.

Reader Feedback

  ¸Å¿ì ÁÁ´Ù    ÁÁ´Ù    ±×Àú ±×·¸´Ù 

 

ÀÚ¹Ù ÇÁ·Î±×·¡¹ÖÀÌ ±Ã±ÝÇϼ¼¿ä? Java Online SupportÀ» Âü°íÇϼ¼¿ä.

.
.

º» ¸ÞÀÏÀº ¼ö½ÅÀ» µ¿ÀÇÇÑ È¸¿ø´Ô¿¡°Ô¸¸ ¹ß¼ÛµË´Ï´Ù. °ü·Ã¹®ÀÇ : SunKorea@sun.com
º» ¸ÞÀÏÀÇ ¼ö½ÅÀ» °ÅºÎÇϽ÷Á¸é ¼ö½Å°ÅºÎ¸¦ Ŭ¸¯ÇØ ÁÖ¼¼¿ä.

Copyright 2004 Sun Korea, Inc. All rights reserved.

Sun Microsystems, Inc.
.
.