.NET与Java互通AES算法加密解密
- /// <summary>AES加密</summary>
- /// <param name="text">明文</param>
- /// <param name="key">密钥,长度为16的字符串</param>
- /// <param name="iv">偏移量,长度为16的字符串</param>
- /// <returns>密文</returns>
- public static string EncodeAES(string text, string key,string iv)
- {
- RijndaelManaged rijndaelCipher = new RijndaelManaged();
- rijndaelCipher.Mode = CipherMode.CBC;
- rijndaelCipher.Padding = PaddingMode.Zeros;
- rijndaelCipher.KeySize = 128;
- rijndaelCipher.BlockSize = 128;
- byte[] pwdBytes = System.Text.Encoding.UTF8.GetBytes(key);
- byte[] keyBytes = new byte[16];
- int len = pwdBytes.Length;
- if (len > keyBytes.Length)
- len = keyBytes.Length;
- System.Array.Copy(pwdBytes, keyBytes, len);
- rijndaelCipher.Key = keyBytes;
- rijndaelCipher.IV = Encoding.UTF8.GetBytes(iv);
- ICryptoTransform transform = rijndaelCipher.CreateEncryptor();
- byte[] plainText = Encoding.UTF8.GetBytes(text);
- byte[] cipherBytes = transform.TransformFinalBlock(plainText, 0, plainText.Length);
- return Convert.ToBase64String(cipherBytes);
- }
- /// <summary>AES解密</summary>
- /// <param name="text">密文</param>
- /// <param name="key">密钥,长度为16的字符串</param>
- /// <param name="iv">偏移量,长度为16的字符串</param>
- /// <returns>明文</returns>
- public static string DecodeAES(string text, string key,string iv)
- {
- RijndaelManaged rijndaelCipher = new RijndaelManaged();
- rijndaelCipher.Mode = CipherMode.CBC;
- rijndaelCipher.Padding = PaddingMode.Zeros;
- rijndaelCipher.KeySize = 128;
- rijndaelCipher.BlockSize = 128;
- byte[] encryptedData = Convert.FromBase64String(text);
- byte[] pwdBytes = System.Text.Encoding.UTF8.GetBytes(key);
- byte[] keyBytes = new byte[16];
- int len = pwdBytes.Length;
- if (len > keyBytes.Length)
- len = keyBytes.Length;
- System.Array.Copy(pwdBytes, keyBytes, len);
- rijndaelCipher.Key = keyBytes;
- rijndaelCipher.IV = Encoding.UTF8.GetBytes(iv);
- ICryptoTransform transform = rijndaelCipher.CreateDecryptor();
- byte[] plainText = transform.TransformFinalBlock(encryptedData, 0, encryptedData.Length);
- return Encoding.UTF8.GetString(plainText);
- }
上面代码为C# 需要引用System.Security.Cryptography命名空间
Java,需要以下引用:
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
另外需要对String和byte[]相互转换的类,我自己写的Base64Helper
- /**
- * @author miracle.qu
- * @see AES算法加密明文
- * @param data 明文
- * @param key 密钥,长度16
- * @param iv 偏移量,长度16
- * @return 密文
- */
- public static String encryptAES(String data,String key,String iv) throws Exception {
- try {
- Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
- int blockSize = cipher.getBlockSize();
- byte[] dataBytes = data.getBytes();
- int plaintextLength = dataBytes.length;
- if (plaintextLength % blockSize != 0) {
- plaintextLength = plaintextLength + (blockSize - (plaintextLength % blockSize));
- }
- byte[] plaintext = new byte[plaintextLength];
- System.arraycopy(dataBytes, 0, plaintext, 0, dataBytes.length);
- SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES");
- IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes());
- cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec);
- byte[] encrypted = cipher.doFinal(plaintext);
- return Base64Helper.encode(encrypted).trim();
- } catch (Exception e) {
- e.printStackTrace();
- return null;
- }
- }
- /**
- * @author miracle.qu
- * @see AES算法解密密文
- * @param data 密文
- * @param key 密钥,长度16
- * @param iv 偏移量,长度16
- * @return 明文
- */
- public static String decryptAES(String data,String key,String iv) throws Exception {
- try
- {
- byte[] encrypted1 = Base64Helper.decode(data);
- Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
- SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES");
- IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes());
- cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec);
- byte[] original = cipher.doFinal(encrypted1);
- String originalString = new String(original);
- return originalString.trim();
- }
- catch (Exception e) {
- e.printStackTrace();
- return null;
- }
- }
其中Base64Helper类是个简单的类,引用:
import org.apache.commons.codec.binary.Base64;
- /**
- * 编码
- * @param byteArray
- * @return
- */
- public static String encode(byte[] byteArray) {
- return new String(new Base64().encode(byteArray));
- }
- /**
- * 解码
- * @param base64EncodedString
- * @return
- */
- public static byte[] decode(String base64EncodedString) {
- return new Base64().decode(base64EncodedString);
- }
摘抄 :http://blog.csdn.net/mr_qu/article/details/8433370
https://en.wikipedia.org/wiki/Initialization_vector
.NET与Java互通AES算法加密解密的更多相关文章
- C#与Java互通AES算法加密解密
/// <summary>AES加密</summary> /// <param name="text">明文</param> /// ...
- .NET/android/java/iOS AES通用加密解密(修正安卓)
移动端越来越火了,我们在开发过程中,总会碰到要和移动端打交道的场景,比如.NET和android或者iOS的打交道.为了让数据交互更安全,我们需要对数据进行加密传输.今天研究了一下,把几种语言的加密都 ...
- .NET/android/java/iOS AES通用加密解密
移动端越来越火了,我们在开发过程中,总会碰到要和移动端打交道的场景,比如.NET和android或者iOS的打交道.为了让数据交互更安全,我们需要对数据进行加密传输.今天研究了一下,把几种语言的加密都 ...
- PHP实现sha1加密AES算法加密解密数据
一.加密代码如下: /** * * @param string $string 需要加密的字符串 * @param string $key 密钥 * @return string */ public ...
- JAVA实现AES的加密和解密算法
原文 JAVA实现AES的加密和解密算法 import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import ja ...
- Java对称与非对称加密解密,AES与RSA
加密技术可以分为对称与非对称两种. 对称加密,解密,即加密与解密用的是同一把秘钥,常用的对称加密技术有DES,AES等 而非对称技术,加密与解密用的是不同的秘钥,常用的非对称加密技术有RSA等 为什么 ...
- JAVA中AES对称加密和解密
AES对称加密和解密 package demo.security; import java.io.IOException; import java.io.UnsupportedEncodingExce ...
- ORACLE 字段AES算法加密、解密
ORACLE 字段AES算法加密.解密(解决中文乱码问题)2014年02月12日 17:13:37 华智互联 阅读数:97971.加解密函数入口 CREATE OR REPLACE FUNCTION ...
- PHP AES的加密解密
AES加密算法 密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这个标准用来替代原先的DE ...
随机推荐
- Android Studio Gradle:Resolvedependencies':app:_debugCompile' 问题解决纪录
问题描述: 第一次使用AndroidStudio打开已经存在的AndroidStudio项目,卡在Gradle:Resolvedependencies':app_debugCompile'步骤,即使进 ...
- js进阶 11-2 jquery属性如何操作
js进阶 11-2 jquery属性如何操作 一.总结 一句话总结:jquery中的属性用attr方法表示.jquery中都是方法. 1.jquery中的属性的增删改查操作? 只需要两个方法, at ...
- [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. ...
- matplotlib 可视化 —— cmap(colormap)
color example code: colormaps_reference.py - Matplotlib 2.0.0 documentation 由其文档可知,在 colormap 类别上,有如 ...
- 浅谈 Redis 与 MySQL 的耦合性以及利用管道完成 MySQL 到 Redis 的高效迁移
http://blog.csdn.net/dba_waterbin/article/details/8996872 ㈠ Redis 与 MySQL 的耦合性 在业务架构早期.我们 ...
- 【a901】滑雪
Time Limit: 10 second Memory Limit: 2 MB 问题描述 滑雪是一项非常刺激的运动,为了获得速度,滑雪的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待 ...
- TextView中实现跑马灯的最简单方法
几行代码实现跑马灯效果,效果如下: 因为很简单,所以就直接贴代码喽 <TextView android:id="@+id/item1_title_message" andro ...
- 编程算法 - 背包问题(三种动态规划) 代码(C)
背包问题(三种动态规划) 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目參考: http://blog.csdn.net/caroline_wen ...
- Java8初体验(二)Stream语法详解---符合人的思维模式,数据源--》stream-->干什么事(具体怎么做,就交给Stream)--》聚合
Function.identity()是什么? // 将Stream转换成容器或Map Stream<String> stream = Stream.of("I", & ...
- android 创建一个新的每次project什么时候 请问自己主动 参加 V7依赖?
android 创建一个新的每次project什么时候 请问自己主动 参加 V7依赖? 分析原因: 主要是由于.我之前的 SDK 的版本号 更新的有点高了.低版本号是不会有这样的问题g的,新版本号中g ...