`
fighter1945
  • 浏览: 230805 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

AES对称加密例子

    博客分类:
  • 7788
阅读更多
原文地址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

   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;

/**
*&Euml;&frac12;?&frac14;&Oacute;&Atilde;&Uuml;&amp;&amp;±&amp;&Ouml;¤&Iuml;&amp;&Iuml;&amp;&amp;u&Atilde;&Uuml;&ETH;&Ocirc;
*/
public class PrivateExample{
    public static void main(String[] args) throws Exception{
    
    byte[] plainText="12345678".getBytes();

    //&Iacute;‥&sup1;&amp;KeyGenerator&ETH;&Icirc;&sup3;&Eacute;&Ograve;&amp;&amp;&amp;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");

    //&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;·‥
    Cipher cipher=Cipher.getInstance("AES/ECB/PKCS5Padding");
    System.out.println("\n"+cipher.getProvider().getInfo());

    //&Ecirc;&sup1;&Oacute;&Atilde;&Euml;&frac12;?&frac14;&Oacute;&Atilde;&Uuml;
    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();

	    //&Iacute;‥&sup1;&amp;KeyGenerator&ETH;&Icirc;&sup3;&Eacute;&Ograve;&amp;&amp;&amp;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");

	    //&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‥
	    Cipher cipher=Cipher.getInstance("AES");
	    System.out.println("\n"+cipher.getProvider().getInfo());

	    //&Ecirc;&sup1;&Oacute;&Atilde;&Euml;&frac12;?&frac14;&Oacute;&Atilde;&Uuml;
	    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"));
	}




分享到:
评论

相关推荐

    AES非对称加密(简单易用)

    **AES非对称加密技术详解** 在信息安全领域,加密技术是保护数据安全的重要手段。AES(Advanced Encryption Standard),即高级加密标准,是一种广泛使用的对称加密算法,以其高效性和安全性著称。它在数据加密中...

    Aes对称加密算法原理

    ### Aes对称加密算法原理 #### 概述 AES(高级加密标准,The Advanced Encryption Standard)是由美国国家标准与技术研究所(NIST)制定的一种用于加密电子数据的标准规范。自2002年5月26日确立以来,AES成为了...

    .net RSA非对称加密例子

    对于大文件,可以先使用对称加密(如AES)加密数据,然后用RSA加密对称密钥。 在.NET中,`RSACrypto`可能包含了实现这些功能的示例代码,包括密钥生成、数据加密解密、签名验证等。通过分析和学习这个例子,你可以...

    c# 对称加密算法 例子

    常见的对称加密算法有DES(Data Encryption Standard)、3DES(Triple DES)、AES(Advanced Encryption Standard)等。其中,AES由于其安全性更高,现在已被广泛采用。 在C#中,我们可以使用System.Security....

    Linux上运行的C语言的AES加密算法

    AES,全称为Advanced Encryption Standard,是目前广泛采用的一种对称加密标准,它提供了强大的数据保护能力。在Linux环境中,开发者通常利用C语言来编写底层的加密程序,以确保性能高效且灵活。 在TimeShatter前辈...

    Delphi AES,又一个加密算法例子.rar

    AES,全称为Advanced Encryption Standard,是目前广泛应用的一种对称加密算法,具有安全性高、速度快的特点。这个“Delphi AES,又一个加密算法例子.rar”文件很显然是一个包含Delphi编程环境下实现AES加密算法示例...

    aes 前端加密 后端c# 解密

    AES(Advanced Encryption Standard)是一种广泛使用的对称加密算法,它为数据提供了强大的安全性。在前端JavaScript和后端C#环境中,AES加密和解密是非常常见的需求,特别是在传输敏感信息时,如用户密码、个人信息...

    C#开发的对称加密算法

    常见的对称加密算法包括DES(Data Encryption Standard)、3DES(Triple DES)、AES(Advanced Encryption Standard)和Blowfish等。这些算法都有不同的安全性、速度和密钥长度,开发者可以根据具体需求进行选择。 ...

    AES通用加密算法(C#)

    AES(Advanced Encryption Standard)是一种广泛使用的对称加密算法,它在信息安全领域中扮演着至关重要的角色。AES由比利时密码学家Joan Daemen和Vincent Rijmen设计,并在2001年由NIST(美国国家标准与技术研究院...

    RSA、AES加密例子.zip

    本压缩包“RSA、AES加密例子.zip”可能包含了关于这两种加密技术的实际应用示例,帮助用户理解和实践这两种加密方法。 RSA是一种非对称加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman于1977年提出,因此得名...

    基于Crypto++加密类库的Aes加密例子

    这个库提供了一种方便的方式来实现密码学中的各种操作,包括对称加密、非对称加密、消息认证码(MAC)、哈希函数等。它的设计目标是易于使用、高效且安全。 **AES加密原理** AES算法基于一个固定大小的块(128位)...

    AES JS加密JAVA解密

    AES(Advanced Encryption Standard)是一种广泛应用的对称加密算法,常用于保护敏感信息。在这个场景中,"AES JS加密JAVA解密" 提到的是使用JavaScript进行AES加密,然后在Java环境中对加密后的数据进行解密的过程...

    用C#实现的数据加密(一) —— 对称加密算法

    在本文中,我们将探讨如何使用C#编程语言实现对称加密算法,特别是以Rijndael算法为例。对称加密是一种常见的数据加密方法,它基于一个共享的秘密密钥来加密和解密信息。这种类型的加密在速度和效率上通常优于非对称...

    .Net几种加密方法(固定key 随机key 对称加密 MD5等)

    在.NET中,`Aes`类是首选的对称加密工具,支持多种模式和填充方式。 4. MD5加密: MD5是一种哈希函数,而非加密算法。它将任意长度的数据转换为固定长度的摘要,常用于数据校验和密码存储。在.NET中,可以使用`MD5`...

    Python程序设计:AES数据加密.pptx

    由于AES是对称加密,意味着加密和解密使用相同的密钥,这使得它在速度和效率上优于非对称加密算法。 在AES的几种工作模式中,CBC(Cipher Block Chaining)模式常被用于增强安全性。在CBC模式下,每个明文块都会与...

    基于PHP和JS的AES相互加密解密方法详解(CryptoJS)_PHP_JS_AES源码

    AES是一种强大的对称加密算法,广泛应用于数据保护,确保信息在互联网上传输时不被窃取或篡改。 首先,我们来了解一下AES的基本原理。AES是一种块密码,它将明文数据分为128位(16字节)的数据块进行处理。加密和...

    .NET下用C#写的AES算法文件加密解密工具(附源码)

    .NET框架下的C#语言提供了强大的加密解密功能,其中AES(Advanced Encryption Standard,高级加密标准)是一种广泛应用的对称加密算法。本项目是基于C#实现的AES文件加密解密工具,采用WinForm作为用户界面,提供了...

    AES加密 VB源码 AES加密 VB源码

    AES加密,全称为Advanced Encryption Standard,是目前广泛应用于数据安全领域的对称加密算法。VB,即Visual Basic,是Microsoft开发的一种编程语言,常用于构建Windows应用程序。本篇将深入探讨如何在VB环境中实现...

    JAVA中AES对称加密和解密过程

    AES对称加密和解密过程是通过相同的密钥进行加密和解密操作,因此效率较高,但安全性相比非对称加密(如RSA)略低,因为如果密钥被泄露,数据就可能被破解。 以下是对AES对称加密和解密过程的详细解释: 1. **密钥...

    Aes.rar_AES_VB AES文件加密_matlab des_加密解密

    AES,即高级加密标准,是一种广泛应用的对称加密算法,因其安全性高、效率优良而被广泛采用。AES的工作模式有多种,如ECB(电子密码本)、CBC(密文块链接)、CFB(密文反馈)、OFB(输出反馈)和CTR(计数器)等。...

Global site tag (gtag.js) - Google Analytics