AES对称加密例子

原文地址http://java.sun.com/developer/technicalArticles/Security/AES/AES_v1.html 
2000年9月开始,nist开始支持fips,来取代已经过时的des(Data Enryption Strandard). 

1 什么是AES 
     AES是一种对称的私钥加密技术。它支持128,192,256位加密。 
2 AES和Java 
     从j2se1.4.2开始,集成了JCE包。 
     现在的java支持128位key的加密。(下面的程序也是以128位为例讲解的) 


3 如何使用JCE 
例 
Java代码   收藏代码
  1. import java.security.*;  
  2. import javax.crypto.*;  
  3. import javax.crypto.spec.*;  
  4. import java.io.*;  
  5.   
  6. /** 
  7. * This program generates a AES key, retrieves its raw bytes, and 
  8. * then reinstantiates a AES key from the key bytes. 
  9. * The reinstantiated key is used to initialize a AES cipher for 
  10. * encryption and decryption. 
  11. */  
  12.   
  13. public class AES {  
  14.   
  15.   /** 
  16.   * Turns array of bytes into string 
  17.   * 
  18.   * @param buf  Array of bytes to convert to hex string 
  19.   * @return Generated hex string 
  20.   */  
  21.   public static String asHex (byte buf[]) {  
  22.    StringBuffer strbuf = new StringBuffer(buf.length * 2);  
  23.    int i;  
  24.   
  25.    for (i = 0; i < buf.length; i++) {  
  26.     if (((int) buf[i] & 0xff) < 0x10)  
  27.   strbuf.append("0");  
  28.   
  29.     strbuf.append(Long.toString((int) buf[i] & 0xff16));  
  30.    }  
  31.   
  32.    return strbuf.toString();  
  33.   }  
  34.   
  35.   public static void main(String[] args) throws Exception {  
  36.   
  37.     String message="This is just an example";  
  38.   
  39.     // Get the KeyGenerator  
  40.   
  41.     KeyGenerator kgen = KeyGenerator.getInstance("AES");  
  42.     kgen.init(128); // 192 and 256 bits may not be available  
  43.   
  44.   
  45.     // Generate the secret key specs.  
  46.     SecretKey skey = kgen.generateKey();  
  47.     byte[] raw = skey.getEncoded();  
  48.   
  49.     SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");  
  50.   
  51.   
  52.     // Instantiate the cipher  
  53.   
  54.     Cipher cipher = Cipher.getInstance("AES");  
  55.   
  56.     cipher.init(Cipher.ENCRYPT_MODE, skeySpec);  
  57.   
  58.     byte[] encrypted =  
  59.       cipher.doFinal((args.length == 0 ?  
  60.        "This is just an example" : args[0]).getBytes());  
  61.     System.out.println("encrypted string: " + asHex(encrypted));  
  62.   
  63.     cipher.init(Cipher.DECRYPT_MODE, skeySpec);  
  64.     byte[] original =  
  65.       cipher.doFinal(encrypted);  
  66.     String originalString = new String(original);  
  67.     System.out.println("Original string: " +  
  68.       originalString + " " + asHex(original));  
  69.   }  
  70. }  

4 更强壮的加密 
   kgen.init(256); // 128 and 192 bits also available 
   按照原文提示的地址可以更新下一个包,然后稍微修改下加密位数就可以了。不过jdk1.4默认只支持128位的加密,实际上,作者也建议同时利用SSL,比单独一味强调加密位数效果要好。 
5 同时使用SSL和AES 

server端 


Java代码   收藏代码
  1. import java.io.*;  
  2. import java.security.*;  
  3. import javax.net.ssl.*;  
  4.   
  5.   
  6. import java.util.regex.*;  
  7.   
  8.   
  9. public class HelloServerSSL {  
  10.   public static void main(String[] args) {  
  11.     SSLServerSocket s;  
  12.   
  13.   
  14.     // Pick all AES algorithms of 256 bits key size  
  15.     String patternString = "AES.*256";  
  16.     Pattern pattern = Pattern.compile(patternString);  
  17.     Matcher matcher;  
  18.     boolean matchFound;  
  19.   
  20.     try {  
  21.       SSLServerSocketFactory sslSrvFact =  
  22.         (SSLServerSocketFactory)  
  23.           SSLServerSocketFactory.getDefault();  
  24.       s =(SSLServerSocket)sslSrvFact.createServerSocket(8181);  
  25.   
  26.       SSLSocket in = (SSLSocket)s.accept();  
  27.   
  28.   
  29.       String str[]=in.getSupportedCipherSuites();  
  30.   
  31.       int len = str.length;  
  32.       String set[] = new String[len];  
  33.   
  34.       int j=0, k = len-1;  
  35.       for (int i=0; i < len; i++) {  
  36.   
  37.         // Determine if pattern exists in input  
  38.         matcher = pattern.matcher(str[i]);  
  39.         matchFound = matcher.find();  
  40.   
  41.         if (matchFound)  
  42.           set[j++] = str[i];  
  43.         else  
  44.           set[k--] = str[i];  
  45.       }  
  46.   
  47.       in.setEnabledCipherSuites(set);  
  48.   
  49.       str=in.getEnabledCipherSuites();  
  50.   
  51.       System.out.println("Available Suites after Set:");  
  52.       for (int i=0; i < str.length; i++)  
  53.         System.out.println(str[i]);  
  54.       System.out.println("Using cipher suite: " +  
  55.          (in.getSession()).getCipherSuite());  
  56.   
  57.       PrintWriter out = new PrintWriter (in.getOutputStream(),  
  58.                         true);  
  59.       out.println("Hello on a SSL socket");  
  60.       in.close();  
  61.     } catch (Exception e) {  
  62.       System.out.println("Exception" + e);  
  63.     }  
  64.   }  
  65. }  


client端 


Java代码   收藏代码
  1. import java.io.*;  
  2. import java.security.*;  
  3. import javax.net.ssl.*;  
  4.   
  5.   
  6. import java.util.regex.*;  
  7.   
  8.   
  9. public class HelloClientSSL {  
  10.   public static void main(String[] args) {  
  11.   
  12.   
  13.     // Pick all AES algorithms of 256 bits key size  
  14.     String patternString = "AES.*256";  
  15.     Pattern pattern = Pattern.compile(patternString);  
  16.     Matcher matcher;  
  17.     boolean matchFound;  
  18.   
  19.     try {  
  20.   
  21.       SSLSocketFactory sslFact =  
  22.         (SSLSocketFactory)SSLSocketFactory.getDefault();  
  23.       SSLSocket s =  
  24.         (SSLSocket)sslFact.createSocket(args.length == 0 ?  
  25.           "127.0.0.1" : args[0], 8181);  
  26.   
  27.       String str[]=s.getSupportedCipherSuites();  
  28.   
  29.       int len = str.length;  
  30.       String set[] = new String[len];  
  31.   
  32.       int j=0, k = len-1;  
  33.       for (int i=0; i < len; i++) {  
  34.         System.out.println(str[i]);  
  35.   
  36.         // Determine if pattern exists in input  
  37.         matcher = pattern.matcher(str[i]);  
  38.         matchFound = matcher.find();  
  39.   
  40.         if (matchFound)  
  41.           set[j++] = str[i];  
  42.         else  
  43.           set[k--] = str[i];  
  44.       }  
  45.   
  46.       s.setEnabledCipherSuites(set);  
  47.   
  48.       str=s.getEnabledCipherSuites();  
  49.   
  50.       System.out.println("Available Suites after Set:");  
  51.       for (int i=0; i < str.length; i++)  
  52.         System.out.println(str[i]);  
  53.   
  54.       OutputStream out = s.getOutputStream();  
  55.       BufferedReader in = new BufferedReader (  
  56.         new InputStreamReader(s.getInputStream()));  
  57.   
  58.       String mesg = in.readLine();  
  59.       System.out.println("Socket message: " + mesg);  
  60.       in.close();  
  61.     } catch (Exception e) {  
  62.       System.out.println("Exception" + e);  
  63.     }  
  64.   }  
  65. }  




运行结果 
   
Available Suites after Set:TLS_RSA_WITH_AES_256_CBC_SHATLS_DHE_RSA_WITH_AES_256_CBC_SHATLS_DHE_DSS_WITH_AES_256_CBC_SHATLS_DH_anon_WITH_AES_256_CBC_SHASSL_DH_anon_EXPORT_WITH_DES40_CBC_SHASSL_DH_anon_EXPORT_WITH_RC4_40_MD5SSL_DH_anon_WITH_DES_CBC_SHASSL_DH_anon_WITH_3DES_EDE_CBC_SHATLS_DH_anon_WITH_AES_128_CBC_SHASSL_DH_anon_WITH_RC4_128_MD5SSL_RSA_WITH_NULL_SHASSL_RSA_WITH_NULL_MD5SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHASSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHASSL_RSA_EXPORT_WITH_DES40_CBC_SHASSL_RSA_EXPORT_WITH_RC4_40_MD5SSL_DHE_DSS_WITH_DES_CBC_SHASSL_DHE_RSA_WITH_DES_CBC_SHASSL_RSA_WITH_DES_CBC_SHASSL_DHE_DSS_WITH_3DES_EDE_CBC_SHASSL_DHE_RSA_WITH_3DES_EDE_CBC_SHASSL_RSA_WITH_3DES_EDE_CBC_SHATLS_DHE_DSS_WITH_AES_128_CBC_SHATLS_DHE_RSA_WITH_AES_128_CBC_SHATLS_RSA_WITH_AES_128_CBC_SHASSL_RSA_WITH_RC4_128_SHASSL_RSA_WITH_RC4_128_MD5Using cipher suite: TLS_RSA_WITH_AES_256_CBC_SHA 







别人的例子 

Java代码   收藏代码
  1. /** 
  2. *PrivateExmaple.java 
  3. *Copyright 2005-2-16 
  4. */  
  5. import javax.crypto.Cipher;  
  6. import javax.crypto.KeyGenerator;  
  7. import java.security.Key;  
  8.   
  9. /** 
  10. *&Euml;&frac12;?&frac14;&Oacute;&Atilde;&Uuml;&amp;&amp;±&amp;&Ouml;¤&Iuml;&amp;&Iuml;&amp;&amp;u&Atilde;&Uuml;&ETH;&Ocirc; 
  11. */  
  12. public class PrivateExample{  
  13.     public static void main(String[] args) throws Exception{  
  14.       
  15.     byte[] plainText="12345678".getBytes();  
  16.   
  17.     //&Iacute;‥&sup1;&amp;KeyGenerator&ETH;&Icirc;&sup3;&Eacute;&Ograve;&amp;&amp;&amp;key  
  18.     System.out.println("\nStart generate AES key");  
  19.     KeyGenerator keyGen=KeyGenerator.getInstance("AES");  
  20.     keyGen.init(128);  
  21.     Key key=keyGen.generateKey();  
  22.     System.out.println("Finish generating AES key");  
  23.   
  24.     //&amp;&amp;&amp;&Atilde;&Ograve;&amp;&amp;&amp;&Euml;&frac12;?&frac14;&Oacute;&Atilde;&Uuml;&Agrave;aCipher&amp;&amp;ECB&Ecirc;&Ccedil;&frac14;&Oacute;&Atilde;&Uuml;·&frac12;&Ecirc;&frac12;&amp;&amp;PKCS5Padding&Ecirc;&Ccedil;&Igrave;&amp;&sup3;&amp;·&frac12;·‥  
  25.     Cipher cipher=Cipher.getInstance("AES/ECB/PKCS5Padding");  
  26.     System.out.println("\n"+cipher.getProvider().getInfo());  
  27.   
  28.     //&Ecirc;&sup1;&Oacute;&Atilde;&Euml;&frac12;?&frac14;&Oacute;&Atilde;&Uuml;  
  29.     System.out.println("\nStart encryption:");  
  30.     cipher.init(Cipher.ENCRYPT_MODE,key);  
  31.     byte[] cipherText=cipher.doFinal(plainText);  
  32.     System.out.println("Finish encryption:");  
  33.     System.out.println(new String(cipherText,"UTF8"));  
  34.   
  35.     System.out.println("\nStart decryption:");  
  36.     cipher.init(Cipher.DECRYPT_MODE,key);  
  37.     byte[] newPlainText=cipher.doFinal(cipherText);  
  38.     System.out.println("Finish decryption:");  
  39.   
  40.     System.out.println(new String(newPlainText,"UTF8"));  
  41.     }  
  42. }  


自己稍加修改的例子 

Java代码   收藏代码
  1. byte[] plainText="12345678".getBytes();  
  2.   
  3.         //&Iacute;‥&sup1;&amp;KeyGenerator&ETH;&Icirc;&sup3;&Eacute;&Ograve;&amp;&amp;&amp;key  
  4.         System.out.println("\nStart generate AES key");  
  5.         KeyGenerator keyGen=KeyGenerator.getInstance("AES");  
  6.           
  7.         String pwd = "passord";  
  8.         keyGen.init(128new SecureRandom(pwd.getBytes()));  
  9.         //keyGen.init(128);  
  10.           
  11.         //Key key=keyGen.generateKey();  
  12.         SecretKey skey = keyGen.generateKey();  
  13.         byte[] raw = skey.getEncoded();  
  14.   
  15.         SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");  
  16.   
  17.         System.out.println("Finish generating AES key");  
  18.   
  19.         //&amp;&amp;&amp;&Atilde;&Ograve;&amp;&amp;&amp;&Euml;&frac12;?&frac14;&Oacute;&Atilde;&Uuml;&Agrave;aCipher&amp;&amp;ECB&Ecirc;&Ccedil;&frac14;&Oacute;&Atilde;&Uuml;E&frac12;&Ecirc;&frac12;&amp;&amp;PKCS5Padding&Ecirc;&Ccedil;&Igrave;&amp;&sup3;&amp;E&frac12;E‥  
  20.         Cipher cipher=Cipher.getInstance("AES");  
  21.         System.out.println("\n"+cipher.getProvider().getInfo());  
  22.   
  23.         //&Ecirc;&sup1;&Oacute;&Atilde;&Euml;&frac12;?&frac14;&Oacute;&Atilde;&Uuml;  
  24.         System.out.println("\nStart encryption:");  
  25.         cipher.init(Cipher.ENCRYPT_MODE,skeySpec);  
  26.           
  27.         byte[] cipherText=cipher.doFinal(plainText);  
  28.         System.out.println("Finish encryption:");  
  29.         System.out.println(new String(cipherText,"UTF8"));  
  30.   
  31.         System.out.println("\nStart decryption:");  
  32.         cipher.init(Cipher.DECRYPT_MODE,skeySpec);  
  33.         byte[] newPlainText=cipher.doFinal(cipherText);  
  34.         System.out.println("Finish decryption:");  
  35.   
  36.         System.out.println(new String(newPlainText,"UTF8"));  
  37.     }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值