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/ ...
随机推荐
- sql 导入导出表数据 命令
那么在我们使用BCP命令之前,我们首先要在Sql Server数据库中执行下列语句,以修改Sql Server的配置,启用对BCP命令的支持. --允许配置高级选项 exec sp_configure ...
- odoo开发笔记 -- 数据库备份策略
odoo默认的数据库为postgresql数据库, PG是个非常强大的数据库,也是未来的一个趋势. 对于odoo的数据备份,odoo提供了自己的备份方式, 1. 从前台页面.输入odoo应用访问地址, ...
- vs2017 对dockerfile的支持
项目添加 dockerfile Docker file 内容 FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base WORKDIR /app EXP ...
- spring 后处理器
Bean后处理器 新建maven项目并添加spring依赖,目录结构如下 Axe public interface Axe { public String chop(); } Person publi ...
- mac mysql5.5升级5.7记录
先删除当前的mysql文件 打开终端窗口 使用mysqldump备份你的数据库将文本文件! 停止数据库服务器 sudo rm /usr/local/mysql sudo rm -rf /usr/loc ...
- js获取客户端ip地址
<script type="text/javascript" src="http://www.coding123.net/getip.ashx?js=1" ...
- 数据库设计 Step by Step (1)——扬帆启航
引言:一直在从事数据库开发和设计工作,也看了一些书籍,算是略有心得.很久之前就想针 对关系数据库设计进行整理.总结,但因为种种原因迟迟没有动手,主要还是惰性使然.今天也算是痛下决心开始这项卓绝又令我兴 ...
- Chapter 2 Open Book——25
"My name is Edward Cullen," he continued. "I didn't have a chance to introduce myself ...
- 27-hadoop-hbase安装
hbase的安装分为单机模式和完全分布式 单机模式 单机模式的安装很简单, 需要注意hbase自己内置一个zookeeper, 如果使用单机模式, 那么该机器的zookeepr不可以启动 1, 添加j ...
- Ubuntu下opencv的安装及IDEA开发配置
Ubuntu下opencv的安装及IDEA开发配置 环境配置 这篇博客主要介绍Ubuntu下opencv的安装编译,以及IDEA对opencv进行Java开发的环境配置 安装opencv 首先安装o ...