|
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 °´Ã¼¸¦ »ç¿ëÇØ¼ ÀÌ·ïÁ³´Ù. ¾ÏÈ£È¿Í º¹È£È´Â ´ë°Ô ¼·Î ´Ù¸¥ ¹öÃò¾ó ¸Ó½Å¿¡¼ ¹ß»ýÇϱ⠶§¹®¿¡ ¾ÈÀüÇÏ°Ô Å°¸¦ Àü¼ÛÇÒ ¼ö ÀÖ´Â ¸Þ¼Òµå°¡ ÇÊ¿äÇÏ´Ù.
ù¹øÂ° ±Û¿¡¼ ºñ´ëĪ ¾ÏÈ£ ¾Ë°í¸®ÁòÀ» À§ÇÑ Å° ½ÖÀ» »ý¼ºÇÏ´Â ¹æ¹ýÀ» °øºÎÇß°í, µÎ¹øÂ° ±Û¿¡¼´Â ´ëĪ Ű¸¦ »ç¿ëÇÏ´Â ¹æ¹ýÀ» »ìÆìº¸¾Ò´Ù. ÇÏÁö¸¸ ºñ´ëĪ Ű¿Í ´ëĪ Ű¸¦ °áÇÕÇØ¼ »ç¿ëÇÏ´Â ¶Ç ´Ù¸¥ Å×Å©´ÐÀÌ ÀÖ´Ù. ÀÌ ±â¹ýÀº ÀÓÀÇ´ë·Î ´ëĪ Ű¸¦ ¼±ÅÃÇØ¼ µ¥ÀÌÅ͸¦ ¾ÏÈ£ÈÇϴµ¥ »ç¿ëÇÑ´Ù. ±×¸®°í´Â ´Ù¸¥ ÆÄƼÀÇ °ø°³ ۸¦ ÀÌ¿ëÇØ¼ ´ëĪ Ű ±× ÀÚü°¡ ¾ÏȣȵȴÙ. ±×·¯¸é ¹Þ´Â »ç¶÷Àº ´ëĪ Ű¸¦ ¾ÏÈ£ÈÇϱâ À§Çؼ ±×µéÀÇ ºñ¹Ð ۸¦ ÀÌ¿ëÇÏ°í ¸Þ½ÃÁö¸¦ º¹È£ÈÇϱâ À§ÇØ º¹È£ÈµÈ ۸¦ ÀÌ¿ëÇÑ´Ù. ºñ´ëĪ ±â¹ý¿¡¼ »ç¿ëµÇ´Â ¸ðµâ·¯½º´Â ´ëĪ Ű¸¦ ¾ÏÈ£ÈÇÒ Á¤µµÀÇ Å©±â¸¸ µÇ¸é µÈ´Ù. ´ëĪ Ű´Â ´ÜÀÏ Àü¼ÛÀ» À§Çؼ »ç¿ëµÈ ÈÄ Á¦°ÅµÈ´Ù. ÀÌ·¯ÇÑ ¹æ¹ýÀ¸·Î °¢°¢ÀÇ Å¸ÀÔÀÇ ´ÜÁ¡ÀÌ º¸¿ÏµÈ´Ù.
°¢ ÁÖÁ¦¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ Á¤º¸´Â ´ÙÀ½À» Âü°íÇϱ⠹ٶõ´Ù.
º» ¸ÞÀÏÀº ¼ö½ÅÀ» µ¿ÀÇÇÑ È¸¿ø´Ô¿¡°Ô¸¸ ¹ß¼ÛµË´Ï´Ù. °ü·Ã¹®ÀÇ : SunKorea@sun.com
º» ¸ÞÀÏÀÇ ¼ö½ÅÀ» °ÅºÎÇϽ÷Á¸é ¼ö½Å°ÅºÎ¸¦
Ŭ¸¯ÇØ ÁÖ¼¼¿ä.
Copyright 2004 Sun Korea, Inc. All rights reserved.
|