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. Android Studio Gradle:Resolvedependencies':app:_debugCompile' 问题解决纪录

    问题描述: 第一次使用AndroidStudio打开已经存在的AndroidStudio项目,卡在Gradle:Resolvedependencies':app_debugCompile'步骤,即使进 ...

  2. js进阶 11-2 jquery属性如何操作

    js进阶 11-2  jquery属性如何操作 一.总结 一句话总结:jquery中的属性用attr方法表示.jquery中都是方法. 1.jquery中的属性的增删改查操作? 只需要两个方法, at ...

  3. [React Router v4] Use Regular Expressions with Routes

    We can use regular expressions to more precisely define the paths to our routes in React Router v4. ...

  4. matplotlib 可视化 —— cmap(colormap)

    color example code: colormaps_reference.py - Matplotlib 2.0.0 documentation 由其文档可知,在 colormap 类别上,有如 ...

  5. 浅谈 Redis 与 MySQL 的耦合性以及利用管道完成 MySQL 到 Redis 的高效迁移

    http://blog.csdn.net/dba_waterbin/article/details/8996872 ㈠ Redis 与 MySQL 的耦合性            在业务架构早期.我们 ...

  6. 【a901】滑雪

    Time Limit: 10 second Memory Limit: 2 MB 问题描述 滑雪是一项非常刺激的运动,为了获得速度,滑雪的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待 ...

  7. TextView中实现跑马灯的最简单方法

    几行代码实现跑马灯效果,效果如下: 因为很简单,所以就直接贴代码喽 <TextView android:id="@+id/item1_title_message" andro ...

  8. 编程算法 - 背包问题(三种动态规划) 代码(C)

    背包问题(三种动态规划) 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目參考: http://blog.csdn.net/caroline_wen ...

  9. Java8初体验(二)Stream语法详解---符合人的思维模式,数据源--》stream-->干什么事(具体怎么做,就交给Stream)--》聚合

    Function.identity()是什么? // 将Stream转换成容器或Map Stream<String> stream = Stream.of("I", & ...

  10. android 创建一个新的每次project什么时候 请问自己主动 参加 V7依赖?

    android 创建一个新的每次project什么时候 请问自己主动 参加 V7依赖? 分析原因: 主要是由于.我之前的 SDK 的版本号 更新的有点高了.低版本号是不会有这样的问题g的,新版本号中g ...