一、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加解密互解算法的更多相关文章

  1. Java中的AES加解密工具类:AESUtils

    本人手写已测试,大家可以参考使用 package com.mirana.frame.utils.encrypt; import com.mirana.frame.constants.SysConsta ...

  2. Java中的AES加解密

    直接上代码,Base64使用的是Java8的方法,如没有,替换即可 KEY:即密码 IV:即偏移量,可自订,十六位 加密方式:AES/CBC/PKCS5Padding,128位加密 如果想用256位和 ...

  3. .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 ...

  4. java学习-AES加解密之AES-128-CBC算法

    AES算法简介 AES是一种对称加密算法,或称分组对称加密算法.  是Advanced Encryption Standard高级加密标准,简称AES AES的基本要求是,采用对称分组密码体制.分组密 ...

  5. Java中的RSA加解密工具类:RSAUtils

    本人手写已测试,大家可以参考使用 package com.mirana.frame.utils.encrypt; import com.mirana.frame.utils.log.LogUtils; ...

  6. React中的AES加解密请求

    引言 在我们使用React开发Web前端的时候,如果是比较大的项目和正常的项目的话,我们必然会用到加解密,之前的文章中提到.NET的一些加解密,那么,这里我就模拟一个例子: 1.后台开发API接口,但 ...

  7. java中几种加/解密API

    如基本的单向加密算法: BASE64 严格地说,属于编码格式,而非加密算法 MD5(Message Digest algorithm 5,信息摘要算法) SHA(Secure Hash Algorit ...

  8. JAVA中使用AES加密解密

    技术交流群: 233513714 /** * AES加密测试 * * @param str 加密参数 */ public void aesTest(String str) { log.info(&qu ...

  9. CryptoJS与C#AES加解密互转

    CryptoJS下载地址: https://code.google.com/archive/p/crypto-js/downloads http://download.csdn.net/detail/ ...

随机推荐

  1. 整理的开源项目(全c#)

    NPOI:读写office办公软件(不需要安装office软件) http://npoi.codeplex.com/downloads/get/70099 消息中间件:DotNetMQ http:// ...

  2. cmd生成文件目录tree

    一.生成 目录tree 到 控制台 有时候需要快速生成一个文件夹中所有成员的 目录tree,可以通过 cmd命令直接生成 命令:tree /f 二.生成 目录tree 到 指定文件 如果想讲目录树生成 ...

  3. docker学习实践之路[第二站]nginx镜像实践

    上一篇文章中已经成功的拉取的nginx的镜像 在本篇文章中则详细介绍docker利用文件卷.断后映射然后进行nginx的配置. 输入一下命令: docker run -d --name mynginx ...

  4. echarts初探

    最近经常看到echarts,觉得很有意思,并且这个库是百度开发的,目前来说使用的也很广泛,包括百度.阿里.腾讯.网易.小米.新浪.华为.联想.美团等一大批一线互联网公司在使用,且github上的sta ...

  5. (转载)es进行聚合操作时提示Fielddata is disabled on text fields by default

    原文地址:http://blog.csdn.net/u011403655/article/details/71107415 根据es官网的文档执行 GET /megacorp/employee/_se ...

  6. iOS 8.0 bluetooth peripheral manager giving no callback for addService

    I am adding the service using: [self.peripheralManager addService:myService]; Is this method depreca ...

  7. Mac系统配置JDK1.8环境变量

    1.首先我们得知道JDK目录安装在哪里,按照下面的路径我们可以找到JDK的主目录,如下图所示.这里有两个目录是因为本机较早前安装过早期版本的JDK1.8. /Library/Java/JavaVirt ...

  8. RETE算法介绍

    RETE算法介绍一. rete概述Rete算法是一种前向规则快速匹配算法,其匹配速度与规则数目无关.Rete是拉丁文,对应英文是net,也就是网络.Rete算法通过形成一个rete网络进行模式匹配,利 ...

  9. postgresql 清空数据表数据

    在 mysql中,只需要执行: TRUNCATE table_name; 即可,数据会情况,而且自增id也会变回0: 但在 postgresql 则稍有不同,因为 postgresql 的自增id是通 ...

  10. JDBC中链接数据库前为什么要用Class.forName(驱动类)加载驱动类?

    使用JDBC链接数据库时,为什么要先使用Class.forName(String name)来加载类? 答: 实际上就是为了加载类时,调用静态初始化块中的注册函数. 可以看一下MySql的Driber ...