AES对称加密例子.docx
- 文档编号:11444923
- 上传时间:2023-03-01
- 格式:DOCX
- 页数:17
- 大小:16.80KB
AES对称加密例子.docx
《AES对称加密例子.docx》由会员分享,可在线阅读,更多相关《AES对称加密例子.docx(17页珍藏版)》请在冰豆网上搜索。
AES对称加密例子
1什么是AES
AES是一种对称的私钥加密技术。
它支持128,192,256位加密。
2AES和Java
从j2se1.4.2开始,集成了JCE包。
现在的java支持128位key的加密。
(下面的程序也是以128位为例讲解的)
3如何使用JCE
例
Java代码
importjava.security.*;
importjavax.crypto.*;
importjavax.crypto.spec.*;
importjava.io.*;
/**
*ThisprogramgeneratesaAESkey,retrievesitsrawbytes,and
*thenreinstantiatesaAESkeyfromthekeybytes.
*ThereinstantiatedkeyisusedtoinitializeaAEScipherfor
*encryptionanddecryption.
*/
publicclassAES{
/**
*Turnsarrayofbytesintostring
*
*@parambuf Arrayofbytestoconverttohexstring
*@returnGeneratedhexstring
*/
publicstaticStringasHex(bytebuf[]){
StringBufferstrbuf=newStringBuffer(buf.length*2);
inti;
for(i=0;i if(((int)buf[i]&0xff)<0x10) strbuf.append("0"); strbuf.append(Long.toString((int)buf[i]&0xff,16)); } returnstrbuf.toString(); } publicstaticvoidmain(String[]args)throwsException{ Stringmessage="Thisisjustanexample"; //GettheKeyGenerator KeyGeneratorkgen=KeyGenerator.getInstance("AES"); kgen.init(128);//192and256bitsmaynotbeavailable //Generatethesecretkeyspecs. SecretKeyskey=kgen.generateKey(); byte[]raw=skey.getEncoded(); SecretKeySpecskeySpec=newSecretKeySpec(raw,"AES"); //Instantiatethecipher Ciphercipher=Cipher.getInstance("AES"); cipher.init(Cipher.ENCRYPT_MODE,skeySpec); byte[]encrypted= cipher.doFinal((args.length==0? "Thisisjustanexample": args[0]).getBytes()); System.out.println("encryptedstring: "+asHex(encrypted)); cipher.init(Cipher.DECRYPT_MODE,skeySpec); byte[]original= cipher.doFinal(encrypted); StringoriginalString=newString(original); System.out.println("Originalstring: "+ originalString+""+asHex(original)); } } importjava.security.*; importjavax.crypto.*; importjavax.crypto.spec.*; importjava.io.*; /** *ThisprogramgeneratesaAESkey,retrievesitsrawbytes,and *thenreinstantiatesaAESkeyfromthekeybytes. *ThereinstantiatedkeyisusedtoinitializeaAEScipherfor *encryptionanddecryption. */ publicclassAES{ /** *Turnsarrayofbytesintostring * *@parambufArrayofbytestoconverttohexstring *@returnGeneratedhexstring */ publicstaticStringasHex(bytebuf[]){ StringBufferstrbuf=newStringBuffer(buf.length*2); inti; for(i=0;i if(((int)buf[i]&0xff)<0x10) strbuf.append("0"); strbuf.append(Long.toString((int)buf[i]&0xff,16)); } returnstrbuf.toString(); } publicstaticvoidmain(String[]args)throwsException{ Stringmessage="Thisisjustanexample"; //GettheKeyGenerator KeyGeneratorkgen=KeyGenerator.getInstance("AES"); kgen.init(128);//192and256bitsmaynotbeavailable //Generatethesecretkeyspecs. SecretKeyskey=kgen.generateKey(); byte[]raw=skey.getEncoded(); SecretKeySpecskeySpec=newSecretKeySpec(raw,"AES"); //Instantiatethecipher Ciphercipher=Cipher.getInstance("AES"); cipher.init(Cipher.ENCRYPT_MODE,skeySpec); byte[]encrypted= cipher.doFinal((args.length==0? "Thisisjustanexample": args[0]).getBytes()); System.out.println("encryptedstring: "+asHex(encrypted)); cipher.init(Cipher.DECRYPT_MODE,skeySpec); byte[]original= cipher.doFinal(encrypted); StringoriginalString=newString(original); System.out.println("Originalstring: "+ originalString+""+asHex(original)); } } 下一页 4更强壮的加密 kgen.init(256);//128and192bitsalsoavailable 按照原文提示的地址可以更新下一个包,然后稍微修改下加密位数就可以了。 不过jdk1.4默认只支持128位的加密,实际上,作者也建议同时利用SSL,比单独一味强调加密位数效果要好。 5同时使用SSL和AES server端 Java代码 importjava.io.*; importjava.security.*; import.ssl.*; importjava.util.regex.*; publicclassHelloServerSSL{ publicstaticvoidmain(String[]args){ SSLServerSockets; //PickallAESalgorithmsof256bitskeysize StringpatternString="AES.*256"; Patternpattern=Ppile(patternString); Matchermatcher; booleanmatchFound; try{ SSLServerSocketFactorysslSrvFact= (SSLServerSocketFactory) SSLServerSocketFactory.getDefault(); s=(SSLServerSocket)sslSrvFact.createServerSocket(8181); SSLSocketin=(SSLSocket)s.accept(); Stringstr[]=in.getSupportedCipherSuites(); intlen=str.length; Stringset[]=newString[len]; intj=0,k=len-1; for(inti=0;i //Determineifpatternexistsininput matcher=pattern.matcher(str[i]); matchFound=matcher.find(); if(matchFound) set[j++]=str[i]; else set[k--]=str[i]; } in.setEnabledCipherSuites(set); str=in.getEnabledCipherSuites(); System.out.println("AvailableSuitesafterSet: "); for(inti=0;i System.out.println(str[i]); System.out.println("Usingciphersuite: "+ (in.getSession()).getCipherSuite()); PrintWriterout=newPrintWriter(in.getOutputStream(), true); out.println("HelloonaSSLsocket"); in.close(); }catch(Exceptione){ System.out.println("Exception"+e); } } } importjava.io.*; importjava.security.*; import.ssl.*; importjava.util.regex.*; publicclassHelloServerSSL{ publicstaticvoidmain(String[]args){ SSLServerSockets; //PickallAESalgorithmsof256bitskeysize StringpatternString="AES.*256"; Patternpattern=Ppile(patternString); Matchermatcher; booleanmatchFound; try{ SSLServerSocketFactorysslSrvFact= (SSLServerSocketFactory) SSLServerSocketFactory.getDefault(); s=(SSLServerSocket)sslSrvFact.createServerSocket(8181); SSLSocketin=(SSLSocket)s.accept(); Stringstr[]=in.getSupportedCipherSuites(); intlen=str.length; Stringset[]=newString[len]; intj=0,k=len-1; for(inti=0;i //Determineifpatternexistsininput matcher=pattern.matcher(str[i]); matchFound=matcher.find(); if(matchFound) set[j++]=str[i]; else set[k--]=str[i]; } in.setEnabledCipherSuites(set); str=in.getEnabledCipherSuites(); System.out.println("AvailableSuitesafterSet: "); for(inti=0;i System.out.println(str[i]); System.out.println("Usingciphersuite: "+ (in.getSession()).getCipherSuite()); PrintWriterout=newPrintWriter(in.getOutputStream(), true); out.println("HelloonaSSLsocket"); in.close(); }catch(Exceptione){ System.out.println("Exception"+e); } } } 下一页 client端 Java代码 importjava.io.*; importjava.security.*; import.ssl.*; importjava.util.regex.*; publicclassHelloClientSSL{ publicstaticvoidmain(String[]args){ //PickallAESalgorithmsof256bitskeysize StringpatternString="AES.*256"; Patternpattern=Ppile(patternString); Matchermatcher; booleanmatchFound; try{ SSLSocketFactorysslFact= (SSLSocketFactory)SSLSocketFactory.getDefault(); SSLSockets= (SSLSocket)sslFact.createSocket(args.length==0? "127.0.0.1": args[0],8181); Stringstr[]=s.getSupportedCipherSuites(); intlen=str.length; Stringset[]=newString[len]; intj=0,k=len-1; for(inti=0;i System.out.println(str[i]); //Determineifpatternexistsininput matcher=pattern.matcher(str[i]); matchFound=matcher.find(); if(matchFound) set[j++]=str[i]; else set[k--]=str[i]; } s.setEnabledCipherSuites(set); str=s.getEnabledCipherSuites(); System.out.println("AvailableSuitesafterSet: "); for(inti=0;i System.out.println(str[i]); OutputStreamout=s.getOutputStream(); BufferedReaderin=newBufferedReader( newInputStreamReader(s.getInputStream())); Stringmesg=in.readLine(); System.out.println("Socketmessage: "+mesg); in.close(); }catch(Exceptione){ System.out.println("Exception"+e); } } } importjava.io.*; importjava.security.*; import.ssl.*; importjava.util.regex.*; publicclassHelloClientSSL{ publicstaticvoidmain(String[]args){ //PickallAESalgorithmsof256bitskeysize StringpatternString="AES.*256"; Patternpattern=Ppile(patternString); Matchermatcher; booleanmatchFound; try{ SSLSocketFactorysslFact= (SSLSocketFactory)SSLSocketFactory.getDefault(); SSLSockets= (SSLSocket)sslFact.createSocket(args.length==0? "127.0.0.1": args[0],8181); Stringstr[]=s.getSupportedCipherSuites(); intlen=str.length; Stringset[]=newString[len]; intj=0,k=len-1; for(inti=0;i System.out.println(str[i]); //Determineifpatternexistsininput matcher=pattern.matcher(str[i]); matchFound=matcher.find(); if(matchFound) set[j++]=str[i]; else set[k--]=str[i]; } s.setEnabledCipherSuites(set); str=s.getEnabledCipherSuites(); System.out.println("AvailableSuitesafterSet: "); for(inti=0;i System.out.println(str[i]); OutputStreamout=s.getOutputStream(); BufferedReaderin=newBufferedReader( newInputStreamReader(s.getInputStream())); Stringmesg=in.readLine(); System.out.println("Socketmessage: "+mesg); in.close(); }catch(Exceptione){ System.out.println("Exception"+e); } } } 运行结果 AvailableSuitesafterSet: 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_SH
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- AES 对称 加密 例子