JavaはBase 64、MD 5、MAC、HMAC暗号化を実現

20467 ワード

それらの基本的な暗号化はまだあまり熟練していないので、いくつかをまとめて、Base 64、MD 5、MAC、HMACの暗号化をサポートして、長い話をして、私たちはすべて自分で理解するのが好きで、コードを見ましょう!
採用した出力UTF-8のフォーマット...
  1 package visec;

  2 import java.security.MessageDigest;

  3 import javax.crypto.KeyGenerator;

  4 import javax.crypto.Mac;

  5 import javax.crypto.SecretKey;

  6 import javax.crypto.spec.SecretKeySpec;

  7 

  8 import Decoder.BASE64Decoder;

  9 import Decoder.BASE64Encoder;

 10 /**

 11  *  

 12  * @author Visec·Dana

 13  * @version 1.0

 14  * @since 1.0

 15  */

 16 public abstract class Coder {

 17     public static final String KEY_SHA = "SHA";

 18     public static final String KEY_MD5 = "MD5";

 19 

 20     /**

 21      * MAC 

 22      * <pre>

 23      * HmacMD5 

 24      * HmacSHA1 

 25      * HmacSHA256 

 26      * HmacSHA384 

 27      * HmacSHA512

 28      * </pre>

 29      */

 30     public static final String KEY_MAC = "HmacMD5";

 31 

 32     /**

 33      * BASE64 

 34      * @param key

 35      * @return

 36      * @throws Exception

 37      */

 38     public static byte[] decryptBASE64(String key) throws Exception {

 39         return (new BASE64Decoder()).decodeBuffer(key);

 40     }

 41 

 42     /**

 43      * BASE64 

 44      * @param key

 45      * @return

 46      * @throws Exception

 47      */

 48     public static String encryptBASE64(byte[] key) throws Exception {

 49         return (new BASE64Encoder()).encodeBuffer(key);

 50     }

 51     /**

 52      * MD5 

 53      * @param data

 54      * @return

 55      * @throws Exception

 56      */

 57     public static byte[] encryptMD5(byte[] data) throws Exception {

 58 

 59         MessageDigest md5 = MessageDigest.getInstance(KEY_MD5);

 60         md5.update(data);

 61         return md5.digest();

 62 

 63     }

 64     /**

 65      * SHA 

 66      * @param data

 67      * @return

 68      * @throws Exception

 69      */

 70     public static byte[] encryptSHA(byte[] data) throws Exception {

 71         MessageDigest sha = MessageDigest.getInstance(KEY_SHA);

 72         sha.update(data);

 73         return sha.digest();

 74 

 75     }

 76     /**

 77      *  HMAC 

 78      * @return

 79      * @throws Exception

 80      */

 81     public static String initMacKey() throws Exception {

 82         KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_MAC);

 83         SecretKey secretKey = keyGenerator.generateKey();

 84         return encryptBASE64(secretKey.getEncoded());

 85     }

 86     /**

 87      * MAC 

 88      * @param data

 89      * @param key

 90      * @return

 91      * @throws Exception

 92      */

 93     public static byte[] encryptHMAC(byte[] data, String key) throws Exception {

 94         SecretKey secretKey = new SecretKeySpec(decryptBASE64(key), KEY_MAC);

 95         Mac mac = Mac.getInstance(secretKey.getAlgorithm());

 96         mac.init(secretKey);

 97         return mac.doFinal(data);

 98 

 99     }

100 }

次はテストクラスと入力コマンドです.
 1 package visec;

 2 

 3 import java.math.BigInteger;

 4 

 5 /**

 6  *  

 7  * @author Visec·Dana

 8  * @version 1.0

 9  * @since 1.0

10  */

11 public class CoderTest {

12     public static void main(String[] args) throws Exception {

13         CoderTest.test(); 

14     }

15 

16     public static void test() throws Exception {

17         String inputStr = " ";

18         System.err.println(" :" + inputStr);

19 

20         byte[] inputData = inputStr.getBytes();

21         String code = Coder.encryptBASE64(inputData);

22 

23         System.err.println("BASE64 :" + code);

24 

25         byte[] output = Coder.decryptBASE64(code);

26 

27         String outputStr = new String(output);

28 

29         System.err.println("BASE64 :" + outputStr);

30 

31         //  Junit4[ ...]

32         /*//  BASE64 

33         assertEquals(inputStr, outputStr);

34 

35         //  MD5 

36         assertArrayEquals(Coder.encryptMD5(inputData), Coder

37                 .encryptMD5(inputData));

38 

39         //  SHA 

40         assertArrayEquals(Coder.encryptSHA(inputData), Coder

41                 .encryptSHA(inputData));

42 

43         String key = Coder.initMacKey();

44         System.err.println("Mac :/n" + key);

45 

46         //  HMAC , 

47         assertArrayEquals(Coder.encryptHMAC(inputData, key), Coder.encryptHMAC(

48                 inputData, key));

49         */

50         BigInteger md5 = new BigInteger(Coder.encryptMD5(inputData));

51         System.err.println("MD5:" + md5.toString(16));

52 

53         BigInteger sha = new BigInteger(Coder.encryptSHA(inputData));

54         System.err.println("SHA:" + sha.toString(32));

55 

56         BigInteger mac = new BigInteger(Coder.encryptHMAC(inputData, inputStr));

57         System.err.println("HMAC:" + mac.toString(16));

58     }

59 }

次はコンソール出力です.
これはいくつかの簡単な暗号化テストBASE 64暗号化後:6 L+Z 5 piv 5 LiA 5 Lqb 566 A 5 Y 2 V 55 qE 5 Yqg 5 a+G 5 rWL 6 K+V
BASE 64復号後:MD 5:76757 e 30 d 128 e 82 b 14488 b 115794 d 959 SHA:6 f 7 a fslor 1 oev 1 k 7 k 40 um 57 cscuqkjtnHMAC:782313 e 944 a 28 a 55 fc 20507 e 50 a 9 d 470