1. /// <summary>AES加密</summary>
  2. /// <param name="text">明文</param>
  3. /// <param name="key">密钥,长度为16的字符串</param>
  4. /// <param name="iv">偏移量,长度为16的字符串</param>
  5. /// <returns>密文</returns>
  6. public static string EncodeAES(string text, string key,string iv)
  7. {
  8. RijndaelManaged rijndaelCipher = new RijndaelManaged();
  9. rijndaelCipher.Mode = CipherMode.CBC;
  10. rijndaelCipher.Padding = PaddingMode.Zeros;
  11. rijndaelCipher.KeySize = 128;
  12. rijndaelCipher.BlockSize = 128;
  13. byte[] pwdBytes = System.Text.Encoding.UTF8.GetBytes(key);
  14. byte[] keyBytes = new byte[16];
  15. int len = pwdBytes.Length;
  16. if (len > keyBytes.Length)
  17. len = keyBytes.Length;
  18. System.Array.Copy(pwdBytes, keyBytes, len);
  19. rijndaelCipher.Key = keyBytes;
  20. rijndaelCipher.IV = Encoding.UTF8.GetBytes(iv);
  21. ICryptoTransform transform = rijndaelCipher.CreateEncryptor();
  22. byte[] plainText = Encoding.UTF8.GetBytes(text);
  23. byte[] cipherBytes = transform.TransformFinalBlock(plainText, 0, plainText.Length);
  24. return Convert.ToBase64String(cipherBytes);
  25. }
  26.  
  27. /// <summary>AES解密</summary>
  28. /// <param name="text">密文</param>
  29. /// <param name="key">密钥,长度为16的字符串</param>
  30. /// <param name="iv">偏移量,长度为16的字符串</param>
  31. /// <returns>明文</returns>
  32. public static string DecodeAES(string text, string key,string iv)
  33. {
  34. RijndaelManaged rijndaelCipher = new RijndaelManaged();
  35. rijndaelCipher.Mode = CipherMode.CBC;
  36. rijndaelCipher.Padding = PaddingMode.Zeros;
  37. rijndaelCipher.KeySize = 128;
  38. rijndaelCipher.BlockSize = 128;
  39. byte[] encryptedData = Convert.FromBase64String(text);
  40. byte[] pwdBytes = System.Text.Encoding.UTF8.GetBytes(key);
  41. byte[] keyBytes = new byte[16];
  42. int len = pwdBytes.Length;
  43. if (len > keyBytes.Length)
  44. len = keyBytes.Length;
  45. System.Array.Copy(pwdBytes, keyBytes, len);
  46. rijndaelCipher.Key = keyBytes;
  47. rijndaelCipher.IV = Encoding.UTF8.GetBytes(iv);
  48. ICryptoTransform transform = rijndaelCipher.CreateDecryptor();
  49. byte[] plainText = transform.TransformFinalBlock(encryptedData, 0, encryptedData.Length);
  50. return Encoding.UTF8.GetString(plainText);
  51. }

上面代码为C# 需要引用System.Security.Cryptography命名空间

Java,需要以下引用:

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

另外需要对String和byte[]相互转换的类,我自己写的Base64Helper

  1. /**
  2. * @author miracle.qu
  3. * @see AES算法加密明文
  4. * @param data 明文
  5. * @param key 密钥,长度16
  6. * @param iv 偏移量,长度16
  7. * @return 密文
  8. */
  9. public static String encryptAES(String data,String key,String iv) throws Exception {
  10. try {
  11. Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
  12. int blockSize = cipher.getBlockSize();
  13. byte[] dataBytes = data.getBytes();
  14. int plaintextLength = dataBytes.length;
  15.  
  16. if (plaintextLength % blockSize != 0) {
  17. plaintextLength = plaintextLength + (blockSize - (plaintextLength % blockSize));
  18. }
  19.  
  20. byte[] plaintext = new byte[plaintextLength];
  21. System.arraycopy(dataBytes, 0, plaintext, 0, dataBytes.length);
  22.  
  23. SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES");
  24. IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes());
  25.  
  26. cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec);
  27. byte[] encrypted = cipher.doFinal(plaintext);
  28.  
  29. return Base64Helper.encode(encrypted).trim();
  30.  
  31. } catch (Exception e) {
  32. e.printStackTrace();
  33. return null;
  34. }
  35. }
  36.  
  37. /**
  38. * @author miracle.qu
  39. * @see AES算法解密密文
  40. * @param data 密文
  41. * @param key 密钥,长度16
  42. * @param iv 偏移量,长度16
  43. * @return 明文
  44. */
  45. public static String decryptAES(String data,String key,String iv) throws Exception {
  46. try
  47. {
  48. byte[] encrypted1 = Base64Helper.decode(data);
  49.  
  50. Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
  51. SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES");
  52. IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes());
  53.  
  54. cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec);
  55.  
  56. byte[] original = cipher.doFinal(encrypted1);
  57. String originalString = new String(original);
  58. return originalString.trim();
  59. }
  60. catch (Exception e) {
  61. e.printStackTrace();
  62. return null;
  63. }
  64. }

其中Base64Helper类是个简单的类,引用:

import org.apache.commons.codec.binary.Base64;

  1. /**
  2. * 编码
  3. * @param byteArray
  4. * @return
  5. */
  6. public static String encode(byte[] byteArray) {
  7. return new String(new Base64().encode(byteArray));
  8. }
  9.  
  10. /**
  11. * 解码
  12. * @param base64EncodedString
  13. * @return
  14. */
  15. public static byte[] decode(String base64EncodedString) {
  16. return new Base64().decode(base64EncodedString);
  17. }

摘抄 :http://blog.csdn.net/mr_qu/article/details/8433370

https://en.wikipedia.org/wiki/Initialization_vector

.NET与Java互通AES算法加密解密的更多相关文章

  1. C#与Java互通AES算法加密解密

    /// <summary>AES加密</summary> /// <param name="text">明文</param> /// ...

  2. .NET/android/java/iOS AES通用加密解密(修正安卓)

    移动端越来越火了,我们在开发过程中,总会碰到要和移动端打交道的场景,比如.NET和android或者iOS的打交道.为了让数据交互更安全,我们需要对数据进行加密传输.今天研究了一下,把几种语言的加密都 ...

  3. .NET/android/java/iOS AES通用加密解密

    移动端越来越火了,我们在开发过程中,总会碰到要和移动端打交道的场景,比如.NET和android或者iOS的打交道.为了让数据交互更安全,我们需要对数据进行加密传输.今天研究了一下,把几种语言的加密都 ...

  4. PHP实现sha1加密AES算法加密解密数据

    一.加密代码如下: /** * * @param string $string 需要加密的字符串 * @param string $key 密钥 * @return string */ public ...

  5. JAVA实现AES的加密和解密算法

    原文 JAVA实现AES的加密和解密算法 import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import ja ...

  6. Java对称与非对称加密解密,AES与RSA

    加密技术可以分为对称与非对称两种. 对称加密,解密,即加密与解密用的是同一把秘钥,常用的对称加密技术有DES,AES等 而非对称技术,加密与解密用的是不同的秘钥,常用的非对称加密技术有RSA等 为什么 ...

  7. JAVA中AES对称加密和解密

    AES对称加密和解密 package demo.security; import java.io.IOException; import java.io.UnsupportedEncodingExce ...

  8. ORACLE 字段AES算法加密、解密

    ORACLE 字段AES算法加密.解密(解决中文乱码问题)2014年02月12日 17:13:37 华智互联 阅读数:97971.加解密函数入口 CREATE OR REPLACE FUNCTION ...

  9. PHP AES的加密解密

    AES加密算法 密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这个标准用来替代原先的DE ...

随机推荐

  1. iOS:通过URL构件UIImage

    非常多时候我们仅仅能得到一个URL,然后须要构建一个UIImage. 通常情况下,我们一般都是通过SDWebImage来直接构建UIImageVIew的image,怎样用URL直接构建UIImage呢 ...

  2. JavaScript调用ATL COM(二)

    作者:朱金灿 来源:http://blog.csdn.net/clever101 在上篇文章中介绍了如何在JS中调用ATL COM: JS调用ATL COM中的C++接口的做法 现在我们可以把它嵌入到 ...

  3. C++生成GIF小结

    声明:所有权利保留. 转载必须说明出处:http://blog.csdn.net/cartzhang/article/details/44020175 近来需要把BMP或Kinect的内存图片多张合成 ...

  4. 【u239】整数分解

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 某些数能表示成为一些互不相同的整数的阶乘之和.如9=l!+2! +3!. 现在给定一个非负整数n,要求 ...

  5. nuklear(A single-header ANSI C gui library,界面还不错)

    Nuklear This is a minimal state immediate mode graphical user interface toolkit written in ANSI C an ...

  6. Watchdog机制概述

    1. Watchdog初始 Watchdog的中文的“看门狗”,有保护的意思.最早引入Watchdog是在单片机系统中,由于单片机的工作环境容易受到外界磁场的干扰,导致程序“跑飞”,造成整个系统无法正 ...

  7. NYOJ 1076 计划数(公式 要么 递归)

    方案数量 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描写叙述 给出一个N*M的棋盘.左下角坐标是(0.0).右上角坐标是(N,M),规定每次仅仅能向上或者向右走.问从左下 ...

  8. An HTTP & HTTP/2 client for Android and Java applications OkHttp

    HTTP is the way modern applications network. It’s how we exchange data & media. Doing HTTP effic ...

  9. hadoop 集群及hbase集群的pid文件存放位置

    一.当hbase集群和hadoop集群停了做一些配置调整,结果执行stop-all.sh的时候无法停止集群, 提示no datanode,no namenode等等之类的信息, 查看stop-all. ...

  10. Python 标准库 —— uuid(生成唯一 ID)

    有时我们在百度贴吧,在一个网站,保存网页上的一些图片时,图片名有时会是一串很长的数字和字母组成的,但无一例外,图像之间不会出现重名.这个唯一的 id,一般通过 uuid 的方式获得,uuid 根据的是 ...