OSDN Git Service

24793578ecb36f1cc8cda743e7bc79d4eca64034
[hayashilib/hayashi.git] / src / hayashi / yuu / tools / properties / Encrypt.java
1 package hayashi.yuu.tools.properties;\r
2 \r
3 import java.security.InvalidAlgorithmParameterException;\r
4 import java.security.InvalidKeyException;\r
5 import java.security.NoSuchAlgorithmException;\r
6 import java.security.spec.InvalidKeySpecException;\r
7 \r
8 import javax.crypto.BadPaddingException;\r
9 import javax.crypto.Cipher;\r
10 import javax.crypto.IllegalBlockSizeException;\r
11 import javax.crypto.NoSuchPaddingException;\r
12 import javax.crypto.SecretKey;\r
13 import javax.crypto.SecretKeyFactory;\r
14 import javax.crypto.spec.PBEKeySpec;\r
15 import javax.crypto.spec.PBEParameterSpec;\r
16 \r
17 /**\r
18  * 暗号化モドキ\r
19  * @author Hayashi,Yuu\r
20  * @version 2010/02/07\r
21  * @since 2009/01/27\r
22  */\r
23 public class Encrypt\r
24 {\r
25         /**\r
26          * @param args  コマンドパラメータ\r
27          */\r
28     public static void main(String[] args) {\r
29         String source = "deister07";\r
30         System.out.println("source \"" + source + "\"");\r
31         try {\r
32                 Encrypt.PASSWORD_KEY = "hayashihimitukagi";\r
33                 \r
34             // 暗号化\r
35                 String encStr = encrypt(source);\r
36             System.out.println("encStr \"" + encStr + "\"");\r
37 \r
38             // 復号\r
39             String decStr = decode(encStr);\r
40             System.out.println("decodeStr \"" + decStr + "\"");\r
41         }\r
42         catch (Exception e) {\r
43             e.printStackTrace();\r
44         }\r
45     }\r
46     \r
47         // ソルト\r
48         private static final byte[] SALT = {(byte)0xc7, (byte)0x73, (byte)0x21, (byte)0x8c, (byte)0x7e, (byte)0xc8, (byte)0xee, (byte)0x99};\r
49         private static final int NUM = 128;             // 繰り返し回数\r
50         \r
51         /**\r
52          * 暗号化のための秘密鍵\r
53          * 心配性の人は、この値を変えてください。\r
54          */\r
55         public static String PASSWORD_KEY = "himitukagi";               // 秘密鍵\r
56 \r
57         /**\r
58      * 指定された文字列を暗号化する。\r
59      * @param source    暗号化したい文字列\r
60      * @return  暗号化された文字列\r
61      * @throws NoSuchAlgorithmException         例外\r
62      * @throws NoSuchPaddingException           例外\r
63      * @throws InvalidKeyException                      例外\r
64      * @throws BadPaddingException                      例外\r
65      * @throws IllegalBlockSizeException        例外\r
66          * @throws InvalidKeySpecException              例外\r
67          * @throws InvalidAlgorithmParameterException   例外\r
68      */\r
69     public static String encrypt(String source) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, InvalidKeySpecException, InvalidAlgorithmParameterException {\r
70                 //16進数化\r
71                 return toHexString(encrypt(source.getBytes()));\r
72     }\r
73     \r
74     /**\r
75      * 指定されたバイト配列を暗号化する。\r
76      * @param source    暗号化したいバイト配列\r
77      * @return  暗号化されたバイト配列\r
78      * @throws NoSuchAlgorithmException         例外\r
79      * @throws NoSuchPaddingException           例外\r
80      * @throws InvalidKeyException                      例外\r
81      * @throws IllegalBlockSizeException        例外\r
82      * @throws BadPaddingException                      例外\r
83      * @throws InvalidKeySpecException          例外\r
84      * @throws InvalidAlgorithmParameterException       例外\r
85      */\r
86     public static byte[] encrypt(byte[] source) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, InvalidKeySpecException, InvalidAlgorithmParameterException {\r
87                 PBEParameterSpec pbeParam = new PBEParameterSpec(SALT, NUM);\r
88                     \r
89                 char[] pass = PASSWORD_KEY.toCharArray();\r
90                 PBEKeySpec pbeKey = new PBEKeySpec(pass);\r
91                 SecretKeyFactory secKeys = SecretKeyFactory.getInstance("PBEWithMD5AndDES");\r
92                 SecretKey secKey = secKeys.generateSecret(pbeKey);\r
93                 \r
94                 Cipher cipher = Cipher.getInstance("PBEWithMD5AndDES");\r
95                 cipher.init(Cipher.ENCRYPT_MODE, secKey, pbeParam);\r
96                 \r
97                 //暗号化\r
98                 return cipher.doFinal(source);\r
99     }\r
100     \r
101     /**\r
102      * 復号\r
103      * @param source    暗号化された文字列\r
104      * @return  復号された文字列\r
105      * @throws NoSuchAlgorithmException         例外\r
106      * @throws InvalidKeySpecException          例外\r
107      * @throws NoSuchPaddingException           例外\r
108      * @throws InvalidAlgorithmParameterException       例外\r
109      * @throws InvalidKeyException                      例外\r
110      * @throws BadPaddingException                      例外\r
111      * @throws IllegalBlockSizeException        例外\r
112      */\r
113     public static String decode(String source) throws NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException {\r
114         if (source == null) {\r
115                 return null;\r
116         }\r
117                 byte[] bytepass = toHexBin(source);\r
118                 return new String(decode(bytepass));\r
119     }\r
120 \r
121     /**\r
122      * 復号\r
123      * @param source    暗号化されたバイト配列\r
124      * @return  復号されたバイト配列\r
125      * @throws NoSuchAlgorithmException         例外\r
126      * @throws InvalidKeySpecException          例外\r
127      * @throws NoSuchPaddingException           例外\r
128      * @throws InvalidKeyException                      例外\r
129      * @throws InvalidAlgorithmParameterException       例外\r
130      * @throws IllegalBlockSizeException        例外\r
131      * @throws BadPaddingException                      例外\r
132      */\r
133     public static byte[] decode(byte[] source) throws NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException {\r
134                 // PBE を新たに生成\r
135         PBEParameterSpec pbeParamSpecDec = new PBEParameterSpec(SALT, NUM);\r
136         \r
137         PBEKeySpec pbeKeySpecDec = new PBEKeySpec(PASSWORD_KEY.toCharArray());\r
138         SecretKeyFactory keyFacDec = SecretKeyFactory.getInstance("PBEWithMD5AndDES");\r
139         SecretKey pbeKeyDec = keyFacDec.generateSecret(pbeKeySpecDec);\r
140 \r
141         Cipher cDec = Cipher.getInstance("PBEWithMD5AndDES");\r
142         cDec.init(Cipher.DECRYPT_MODE, pbeKeyDec, pbeParamSpecDec);\r
143         \r
144         return cDec.doFinal(source);\r
145     }\r
146 \r
147 \r
148     /**\r
149      * バイナリ配列を文字列に変換する。\r
150      * \r
151      * @param bs        バイト配列(バイナリ)\r
152      * @return  16進表現文字列\r
153      */\r
154         private static String toHexString(byte[] binStr) {\r
155                 StringBuffer buffer = new StringBuffer(binStr.length * 2);\r
156                 for (int i = 0; i < binStr.length; i++) {\r
157                         if ((binStr[i] >= 0) && (binStr[i] < 0x10)) {\r
158                                 buffer.append('0');\r
159                         }\r
160                         buffer.append(Integer.toHexString(0xff & binStr[i]));\r
161                 }\r
162                 return buffer.toString();\r
163         }\r
164 \r
165     /**\r
166      * バイナリ文字列をバイナリ配列に変換する。\r
167      * \r
168      * @param bs        16進表現文字列\r
169      * @return  バイナリ配列\r
170      */\r
171         private static byte[] toHexBin(String binStr) {\r
172                 byte[] bin = new byte[binStr.length() / 2];\r
173                 \r
174                 StringBuffer sbuf = new StringBuffer(binStr);\r
175                 for (int i = 0; i < bin.length; i++) {\r
176                         String s = sbuf.substring(i*2, i*2+2).toUpperCase();\r
177                         bin[i] = (byte)Integer.parseInt(s, 16);\r
178                 }\r
179                 return bin;\r
180         }\r
181 }\r