原文地址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
例
4 更强壮的加密
kgen.init(256); // 128 and 192 bits also available
按照原文提示的地址可以更新下一个包,然后稍微修改下加密位数就可以了。不过jdk1.4默认只支持128位的加密,实际上,作者也建议同时利用SSL,比单独一味强调加密位数效果要好。
5 同时使用SSL和AES
server端
client端
运行结果
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
别人的例子
自己稍加修改的例子
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
例
import java.security.*; import javax.crypto.*; import javax.crypto.spec.*; import java.io.*; /** * This program generates a AES key, retrieves its raw bytes, and * then reinstantiates a AES key from the key bytes. * The reinstantiated key is used to initialize a AES cipher for * encryption and decryption. */ public class AES { /** * Turns array of bytes into string * * @param buf Array of bytes to convert to hex string * @return Generated hex string */ public static String asHex (byte buf[]) { StringBuffer strbuf = new StringBuffer(buf.length * 2); int i; for (i = 0; i < buf.length; i++) { if (((int) buf[i] & 0xff) < 0x10) strbuf.append("0"); strbuf.append(Long.toString((int) buf[i] & 0xff, 16)); } return strbuf.toString(); } public static void main(String[] args) throws Exception { String message="This is just an example"; // Get the KeyGenerator KeyGenerator kgen = KeyGenerator.getInstance("AES"); kgen.init(128); // 192 and 256 bits may not be available // Generate the secret key specs. SecretKey skey = kgen.generateKey(); byte[] raw = skey.getEncoded(); SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); // Instantiate the cipher Cipher cipher = Cipher.getInstance("AES"); cipher.init(Cipher.ENCRYPT_MODE, skeySpec); byte[] encrypted = cipher.doFinal((args.length == 0 ? "This is just an example" : args[0]).getBytes()); System.out.println("encrypted string: " + asHex(encrypted)); cipher.init(Cipher.DECRYPT_MODE, skeySpec); byte[] original = cipher.doFinal(encrypted); String originalString = new String(original); System.out.println("Original string: " + originalString + " " + asHex(original)); } }
4 更强壮的加密
kgen.init(256); // 128 and 192 bits also available
按照原文提示的地址可以更新下一个包,然后稍微修改下加密位数就可以了。不过jdk1.4默认只支持128位的加密,实际上,作者也建议同时利用SSL,比单独一味强调加密位数效果要好。
5 同时使用SSL和AES
server端
import java.io.*; import java.security.*; import javax.net.ssl.*; import java.util.regex.*; public class HelloServerSSL { public static void main(String[] args) { SSLServerSocket s; // Pick all AES algorithms of 256 bits key size String patternString = "AES.*256"; Pattern pattern = Pattern.compile(patternString); Matcher matcher; boolean matchFound; try { SSLServerSocketFactory sslSrvFact = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault(); s =(SSLServerSocket)sslSrvFact.createServerSocket(8181); SSLSocket in = (SSLSocket)s.accept(); String str[]=in.getSupportedCipherSuites(); int len = str.length; String set[] = new String[len]; int j=0, k = len-1; for (int i=0; i < len; i++) { // Determine if pattern exists in input 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("Available Suites after Set:"); for (int i=0; i < str.length; i++) System.out.println(str[i]); System.out.println("Using cipher suite: " + (in.getSession()).getCipherSuite()); PrintWriter out = new PrintWriter (in.getOutputStream(), true); out.println("Hello on a SSL socket"); in.close(); } catch (Exception e) { System.out.println("Exception" + e); } } }
client端
import java.io.*; import java.security.*; import javax.net.ssl.*; import java.util.regex.*; public class HelloClientSSL { public static void main(String[] args) { // Pick all AES algorithms of 256 bits key size String patternString = "AES.*256"; Pattern pattern = Pattern.compile(patternString); Matcher matcher; boolean matchFound; try { SSLSocketFactory sslFact = (SSLSocketFactory)SSLSocketFactory.getDefault(); SSLSocket s = (SSLSocket)sslFact.createSocket(args.length == 0 ? "127.0.0.1" : args[0], 8181); String str[]=s.getSupportedCipherSuites(); int len = str.length; String set[] = new String[len]; int j=0, k = len-1; for (int i=0; i < len; i++) { System.out.println(str[i]); // Determine if pattern exists in input 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("Available Suites after Set:"); for (int i=0; i < str.length; i++) System.out.println(str[i]); OutputStream out = s.getOutputStream(); BufferedReader in = new BufferedReader ( new InputStreamReader(s.getInputStream())); String mesg = in.readLine(); System.out.println("Socket message: " + mesg); in.close(); } catch (Exception e) { System.out.println("Exception" + e); } } }
运行结果
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
别人的例子
/** *PrivateExmaple.java *Copyright 2005-2-16 */ import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import java.security.Key; /** *˽?¼ÓÃÜ&&±&Ö¤Ï&Ï&&uÃÜÐÔ */ public class PrivateExample{ public static void main(String[] args) throws Exception{ byte[] plainText="12345678".getBytes(); //Í‥¹&KeyGeneratorÐγÉÒ&&&key System.out.println("\nStart generate AES key"); KeyGenerator keyGen=KeyGenerator.getInstance("AES"); keyGen.init(128); Key key=keyGen.generateKey(); System.out.println("Finish generating AES key"); //&&&ÃÒ&&&˽?¼ÓÃÜÀaCipher&&ECBÊǼÓÃÜ·½Ê½&&PKCS5PaddingÊÇÌ&³&·½·‥ Cipher cipher=Cipher.getInstance("AES/ECB/PKCS5Padding"); System.out.println("\n"+cipher.getProvider().getInfo()); //ʹÓÃ˽?¼ÓÃÜ System.out.println("\nStart encryption:"); cipher.init(Cipher.ENCRYPT_MODE,key); byte[] cipherText=cipher.doFinal(plainText); System.out.println("Finish encryption:"); System.out.println(new String(cipherText,"UTF8")); System.out.println("\nStart decryption:"); cipher.init(Cipher.DECRYPT_MODE,key); byte[] newPlainText=cipher.doFinal(cipherText); System.out.println("Finish decryption:"); System.out.println(new String(newPlainText,"UTF8")); } }
自己稍加修改的例子
byte[] plainText="12345678".getBytes(); //Í‥¹&KeyGeneratorÐγÉÒ&&&key System.out.println("\nStart generate AES key"); KeyGenerator keyGen=KeyGenerator.getInstance("AES"); String pwd = "passord"; keyGen.init(128, new SecureRandom(pwd.getBytes())); //keyGen.init(128); //Key key=keyGen.generateKey(); SecretKey skey = keyGen.generateKey(); byte[] raw = skey.getEncoded(); SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); System.out.println("Finish generating AES key"); //&&&ÃÒ&&&˽?¼ÓÃÜÀaCipher&&ECBÊǼÓÃÜE½Ê½&&PKCS5PaddingÊÇÌ&³&E½E‥ Cipher cipher=Cipher.getInstance("AES"); System.out.println("\n"+cipher.getProvider().getInfo()); //ʹÓÃ˽?¼ÓÃÜ System.out.println("\nStart encryption:"); cipher.init(Cipher.ENCRYPT_MODE,skeySpec); byte[] cipherText=cipher.doFinal(plainText); System.out.println("Finish encryption:"); System.out.println(new String(cipherText,"UTF8")); System.out.println("\nStart decryption:"); cipher.init(Cipher.DECRYPT_MODE,skeySpec); byte[] newPlainText=cipher.doFinal(cipherText); System.out.println("Finish decryption:"); System.out.println(new String(newPlainText,"UTF8")); }
发表评论
-
将博客搬至CSDN
2017-08-11 18:25 463将博客搬至CSDN http://blog.csdn.ne ... -
微信小程序的appid
2017-02-09 09:23 579从下面的地址下载模拟器后,新建项目的情况下需要appid, ... -
redmine自定义查询
2017-02-07 16:41 1650redmine有时候在同一个项目要反复查找同一个关键词,这个 ... -
nginx的使用
2016-09-18 16:12 459不指望守旧公司还能继续用上nginx这种已经在国内普及的东西 ... -
cnode社区使用的系统
2016-09-18 13:52 322https://github.com/cnodejs/nod ... -
gitlab的模型
2016-09-14 16:22 526Git工作流指南:集中式工作流 http://blog.jo ... -
一个不错的属性contenteditable
2016-07-30 17:05 551<script type="text/jav ... -
gitlab的一键安装以及https配置
2016-06-01 21:59 4315简明安装攻略 https://segmentfault. ... -
想不到进入PHP了
2014-10-17 13:44 643其实, 在这次跳槽之前怎么也没想到会做php项目 不过,既 ... -
自己用的toHex
2013-03-08 00:11 664Sub tohex() Dim I As Integer ... -
VISUALSVN SERVER
2012-04-10 22:01 1075公司里管代码用svn,管文档用vss 终于在家里也需要管理版 ... -
中国人说英语为什么听起来没有礼貌?【无老师力荐】
2011-01-06 21:05 1294http://www.ibtsat.com/archiv ... -
企业官方微博的运营策略(草案)
2010-12-31 16:47 969转载自http://www.dbanotes.ne ... -
linux ,我又来了
2010-11-04 18:17 884一直以为差了很多 但实际上差了也就那么一点 为了不死在终点 ... -
crontab就是个2
2010-08-24 15:03 1118今天设置一个简单的crontab -e 1 0 * * ... -
google的sitemaps
2010-08-23 11:19 897因为文章的列表页都是 ... -
黑白滤镜 ie专用
2010-08-16 10:22 902最近网站要求黑白的频率变多了 html { filte ... -
web.xml错误页面设置
2010-07-06 10:51 1196http://hi.baidu.com/%D3%D2%CA%D ... -
tomcat6的gzip传输
2010-07-01 10:37 1384<Connector port="80 ... -
图片不存在时自动转向替代图片
2010-04-26 18:03 1062<img src="xxx" bor ...
相关推荐
**AES非对称加密技术详解** 在信息安全领域,加密技术是保护数据安全的重要手段。AES(Advanced Encryption Standard),即高级加密标准,是一种广泛使用的对称加密算法,以其高效性和安全性著称。它在数据加密中...
### Aes对称加密算法原理 #### 概述 AES(高级加密标准,The Advanced Encryption Standard)是由美国国家标准与技术研究所(NIST)制定的一种用于加密电子数据的标准规范。自2002年5月26日确立以来,AES成为了...
对于大文件,可以先使用对称加密(如AES)加密数据,然后用RSA加密对称密钥。 在.NET中,`RSACrypto`可能包含了实现这些功能的示例代码,包括密钥生成、数据加密解密、签名验证等。通过分析和学习这个例子,你可以...
常见的对称加密算法有DES(Data Encryption Standard)、3DES(Triple DES)、AES(Advanced Encryption Standard)等。其中,AES由于其安全性更高,现在已被广泛采用。 在C#中,我们可以使用System.Security....
AES,全称为Advanced Encryption Standard,是目前广泛采用的一种对称加密标准,它提供了强大的数据保护能力。在Linux环境中,开发者通常利用C语言来编写底层的加密程序,以确保性能高效且灵活。 在TimeShatter前辈...
AES,全称为Advanced Encryption Standard,是目前广泛应用的一种对称加密算法,具有安全性高、速度快的特点。这个“Delphi AES,又一个加密算法例子.rar”文件很显然是一个包含Delphi编程环境下实现AES加密算法示例...
AES(Advanced Encryption Standard)是一种广泛使用的对称加密算法,它为数据提供了强大的安全性。在前端JavaScript和后端C#环境中,AES加密和解密是非常常见的需求,特别是在传输敏感信息时,如用户密码、个人信息...
常见的对称加密算法包括DES(Data Encryption Standard)、3DES(Triple DES)、AES(Advanced Encryption Standard)和Blowfish等。这些算法都有不同的安全性、速度和密钥长度,开发者可以根据具体需求进行选择。 ...
AES(Advanced Encryption Standard)是一种广泛使用的对称加密算法,它在信息安全领域中扮演着至关重要的角色。AES由比利时密码学家Joan Daemen和Vincent Rijmen设计,并在2001年由NIST(美国国家标准与技术研究院...
本压缩包“RSA、AES加密例子.zip”可能包含了关于这两种加密技术的实际应用示例,帮助用户理解和实践这两种加密方法。 RSA是一种非对称加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman于1977年提出,因此得名...
这个库提供了一种方便的方式来实现密码学中的各种操作,包括对称加密、非对称加密、消息认证码(MAC)、哈希函数等。它的设计目标是易于使用、高效且安全。 **AES加密原理** AES算法基于一个固定大小的块(128位)...
AES(Advanced Encryption Standard)是一种广泛应用的对称加密算法,常用于保护敏感信息。在这个场景中,"AES JS加密JAVA解密" 提到的是使用JavaScript进行AES加密,然后在Java环境中对加密后的数据进行解密的过程...
在本文中,我们将探讨如何使用C#编程语言实现对称加密算法,特别是以Rijndael算法为例。对称加密是一种常见的数据加密方法,它基于一个共享的秘密密钥来加密和解密信息。这种类型的加密在速度和效率上通常优于非对称...
在.NET中,`Aes`类是首选的对称加密工具,支持多种模式和填充方式。 4. MD5加密: MD5是一种哈希函数,而非加密算法。它将任意长度的数据转换为固定长度的摘要,常用于数据校验和密码存储。在.NET中,可以使用`MD5`...
由于AES是对称加密,意味着加密和解密使用相同的密钥,这使得它在速度和效率上优于非对称加密算法。 在AES的几种工作模式中,CBC(Cipher Block Chaining)模式常被用于增强安全性。在CBC模式下,每个明文块都会与...
AES是一种强大的对称加密算法,广泛应用于数据保护,确保信息在互联网上传输时不被窃取或篡改。 首先,我们来了解一下AES的基本原理。AES是一种块密码,它将明文数据分为128位(16字节)的数据块进行处理。加密和...
.NET框架下的C#语言提供了强大的加密解密功能,其中AES(Advanced Encryption Standard,高级加密标准)是一种广泛应用的对称加密算法。本项目是基于C#实现的AES文件加密解密工具,采用WinForm作为用户界面,提供了...
AES加密,全称为Advanced Encryption Standard,是目前广泛应用于数据安全领域的对称加密算法。VB,即Visual Basic,是Microsoft开发的一种编程语言,常用于构建Windows应用程序。本篇将深入探讨如何在VB环境中实现...
AES对称加密和解密过程是通过相同的密钥进行加密和解密操作,因此效率较高,但安全性相比非对称加密(如RSA)略低,因为如果密钥被泄露,数据就可能被破解。 以下是对AES对称加密和解密过程的详细解释: 1. **密钥...
AES,即高级加密标准,是一种广泛应用的对称加密算法,因其安全性高、效率优良而被广泛采用。AES的工作模式有多种,如ECB(电子密码本)、CBC(密文块链接)、CFB(密文反馈)、OFB(输出反馈)和CTR(计数器)等。...