C#与java中的AES加解密互解算法
一、C#版AES加解密算法
public class AESCode
{
public string Key { get; set; } public string Encrypt(string val)
{
if (string.IsNullOrEmpty(val))
return null;
#if CSP
using (AesCryptoServiceProvider des = new AesCryptoServiceProvider())
#else
using (AesManaged des = new AesManaged())
#endif
{
byte[] inputByteArray = Encoding.UTF8.GetBytes(val);
byte[] _key;
byte[] _iv;
GeneralKeyIV(this.Key, out _key, out _iv);
des.Key = _key;
des.IV = _iv;
using (MemoryStream ms = new MemoryStream())
{
using (CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write))
{
cs.Write(inputByteArray, , inputByteArray.Length);
cs.FlushFinalBlock();
byte[] bytes = (byte[])ms.ToArray();
return Convert.ToBase64String(bytes);
}
}
}
} public string Decrypt(string val)
{
if (string.IsNullOrEmpty(val))
return null;
#if CSP
using (AesCryptoServiceProvider des = new AesCryptoServiceProvider())
#else
using (AesManaged des = new AesManaged())
#endif
{
byte[] inputByteArray = Convert.FromBase64String(val);
byte[] _key;
byte[] _iv;
GeneralKeyIV(this.Key, out _key, out _iv);
des.Key = _key;
des.IV = _iv;
using (MemoryStream ms = new MemoryStream())
{
using (CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write))
{
cs.Write(inputByteArray, , inputByteArray.Length);
cs.FlushFinalBlock();
return Encoding.UTF8.GetString(ms.ToArray());
}
}
}
} public void GeneralKeyIV(string keyStr, out byte[] key, out byte[] iv)
{
byte[] bytes = Encoding.UTF8.GetBytes(keyStr);
key = SHA256Managed.Create().ComputeHash(bytes);
iv = MD5.Create().ComputeHash(bytes);
}
}
二、Java版算法
import java.security.MessageDigest;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec; import org.apache.commons.codec.binary.Base64; public class AESCode {
/**
* 提供密钥和向量进行加密
*
* @param sSrc
* @param key
* @param iv
* @return
* @throws Exception
*/
public static String Encrypt(String sSrc, byte[] key, byte[] iv) throws Exception {
SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");// "算法/模式/补码方式"
IvParameterSpec _iv = new IvParameterSpec(iv);// 使用CBC模式,需要一个向量iv,可增加加密算法的强度
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, _iv);
byte[] encrypted = cipher.doFinal(sSrc.getBytes("utf-8"));
return Base64.encodeBase64String(encrypted);
} /**
* 提供密钥和向量进行解密
*
* @param sSrc
* @param key
* @param iv
* @return
* @throws Exception
*/
public static String Decrypt(String sSrc, byte[] key, byte[] iv) throws Exception {
SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
IvParameterSpec _iv = new IvParameterSpec(iv);
cipher.init(Cipher.DECRYPT_MODE, skeySpec, _iv);
byte[] encrypted = Base64.decodeBase64(sSrc);
byte[] original = cipher.doFinal(encrypted);
return new String(original, "utf-8");
} /**
* 使用密钥进行加密
*
* @param sSrc
* @param keyStr
* @return
* @throws Exception
*/
public static String Encrypt(String sSrc, String keyStr) throws Exception {
byte[] key = GeneralKey(keyStr);
byte[] iv = GeneralIv(keyStr);
SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");// "算法/模式/补码方式"
IvParameterSpec _iv = new IvParameterSpec(iv);
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, _iv);
byte[] encrypted = cipher.doFinal(sSrc.getBytes("utf-8"));
return Base64.encodeBase64String(encrypted);
} /**
* 使用密钥进行解密
*
* @param sSrc
* @param keyStr
* @return
* @throws Exception
*/
public static String Decrypt(String sSrc, String keyStr) throws Exception {
byte[] key = GeneralKey(keyStr);
byte[] iv = GeneralIv(keyStr);
SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
IvParameterSpec _iv = new IvParameterSpec(iv);
cipher.init(Cipher.DECRYPT_MODE, skeySpec, _iv);
byte[] encrypted = Base64.decodeBase64(sSrc);// 先用base64解码
byte[] original = cipher.doFinal(encrypted);
return new String(original, "utf-8");
} /**
* 构建密钥字节码
*
* @param keyStr
* @return
* @throws Exception
*/
private static byte[] GeneralKey(String keyStr) throws Exception {
byte[] bytes = keyStr.getBytes("utf-8");
MessageDigest md = MessageDigest.getInstance("SHA-256");
md.update(bytes);
return md.digest();
} /**
* 构建加解密向量字节码
*
* @param keyStr
* @return
* @throws Exception
*/
private static byte[] GeneralIv(String keyStr) throws Exception {
byte[] bytes = keyStr.getBytes("utf-8");
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(bytes);
return md.digest();
}
}
java版需要commons-codec-1.10.jar,local_policy.jar,US_export_policy.jar
C#与java中的AES加解密互解算法的更多相关文章
- Java中的AES加解密工具类:AESUtils
本人手写已测试,大家可以参考使用 package com.mirana.frame.utils.encrypt; import com.mirana.frame.constants.SysConsta ...
- Java中的AES加解密
直接上代码,Base64使用的是Java8的方法,如没有,替换即可 KEY:即密码 IV:即偏移量,可自订,十六位 加密方式:AES/CBC/PKCS5Padding,128位加密 如果想用256位和 ...
- .net mvc 站点自带简易SSL加密传输 Word报告自动生成(例如 导出数据库结构) 微信小程序:动画(Animation) SignalR 设计理念(一) ASP.NET -- WebForm -- ViewState ASP.NET -- 一般处理程序ashx 常用到的一些js方法,记录一下 CryptoJS与C#AES加解密互转
.net mvc 站点自带简易SSL加密传输 因项目需要,传输数据需要加密,因此有了一些经验,现简易抽出来分享! 请求:前端cryptojs用rsa/aes 或 rsa/des加密,后端.net ...
- java学习-AES加解密之AES-128-CBC算法
AES算法简介 AES是一种对称加密算法,或称分组对称加密算法. 是Advanced Encryption Standard高级加密标准,简称AES AES的基本要求是,采用对称分组密码体制.分组密 ...
- Java中的RSA加解密工具类:RSAUtils
本人手写已测试,大家可以参考使用 package com.mirana.frame.utils.encrypt; import com.mirana.frame.utils.log.LogUtils; ...
- React中的AES加解密请求
引言 在我们使用React开发Web前端的时候,如果是比较大的项目和正常的项目的话,我们必然会用到加解密,之前的文章中提到.NET的一些加解密,那么,这里我就模拟一个例子: 1.后台开发API接口,但 ...
- java中几种加/解密API
如基本的单向加密算法: BASE64 严格地说,属于编码格式,而非加密算法 MD5(Message Digest algorithm 5,信息摘要算法) SHA(Secure Hash Algorit ...
- JAVA中使用AES加密解密
技术交流群: 233513714 /** * AES加密测试 * * @param str 加密参数 */ public void aesTest(String str) { log.info(&qu ...
- CryptoJS与C#AES加解密互转
CryptoJS下载地址: https://code.google.com/archive/p/crypto-js/downloads http://download.csdn.net/detail/ ...
随机推荐
- POJ 2876
#include<iostream> #include<string> using namespace std; ]; int main() { //freopen(" ...
- windows 系统安装git的方法
windows 系统安装git的方法 msysgit是Windows版的Git,从https://git-for-windows.github.io下载 安装默认步骤,一步步安装即可 安装完成后,在开 ...
- .net core跨平台发布至centos7
在要发布的项目目录下输入发布命令 dotnet publish -r centos.-x64 发布成功后,文件位于xxx\bin\Debug\netcoreapp2.0\centos.7-x64\pu ...
- goconfig - INI 解析器
goconfig简介 goconfig是一个由Go语言开发的针对windows下常见的ini格式的配置文件解析器.该解析器在涵盖了所有ini文件操作的基础之上,又针对Go语言实际开发过程中遇到的一些需 ...
- 技术笔记5 MINA 和事务
Java NIO框架MINA用netty性能和链接数.并发等压力测试参数好于mina. 特点:1.NIO弥补了原来的I/O的不足,它再标准java代码中提供了高速和面向块的I/O原力的I/O库与NIO ...
- 简单聊聊SOA和微服务
转自:https://juejin.im/post/592f87feb123db0064e5ef7c (2017-06) 简单聊聊SOA和微服务 架构设计中的朴素主义 前两天和一个朋友聊天,他向我咨 ...
- Linux Tomcat日志查看实用命令
实用命令: 查看tomcat运行日志 tail -f catalina.out 通过关键字搜索查看日志 cat jeewx-2015-09-20.log | grep 验证码 查看固定时间日志 cat ...
- 读jQuery源码释疑笔记2
本释疑笔记是针对自己在看源码的过程中遇到的一些问题的解答,对大众可能不具有参考性,不过可以看看有没有你也不懂得地方,相互学习,相互进步. 1.函数init <div id="one&q ...
- PBN飞越转弯Flyover衔接TF、CF航段保护区组图
PBN飞越转弯Flyover衔接TF.CF航段虽不常用,但也很重要,与旁切转弯有一定的相似性. 飞越转弯 flyover-TF/CF 叠加图: 飞越转弯 flyover-TF/CF 分解图:
- 分布式理论(四)—— 一致性协议之 3PC
前言 我们说为了实现 BASE 理论,需要在可用性和一致性之间找到一个合适的一致性理论,于是,我们在上篇文章中了解了 2PC 理论,也就是两阶段提交,二阶段提交原理简单,实现方便,但是缺点则是同步阻塞 ...