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/ ...
随机推荐
- 【learning】 扩展lucas定理
首先说下啥是lucas定理: $\binom n m \equiv \binom {n\%P} {m\%P} \times \binom{n/P}{m/P} \pmod P$ 借助这个定理,求$\bi ...
- (转)python通过paramiko实现,ssh功能
python通过paramiko实现,ssh功能 1 import paramiko 2 3 ssh =paramiko.SSHClient()#创建一个SSH连接对象 4 ssh.set_missi ...
- ubuntu安转QTcreator出现The default mkspec symlink is broken
QT Creator安装:https://blog.csdn.net/arackethis/article/details/42326967 QT SDK安装:https://blog.csdn.ne ...
- Javascript图片预加载详解 分类: JavaScript HTML+CSS 2015-05-29 11:01 768人阅读 评论(0) 收藏
预加载图片是提高用户体验的一个很好方法.图片预先加载到浏览器中,访问者便可顺利地在你的网站上冲浪,并享受到极快的加载速度.这对图片画廊及图片占据很大比例的网站来说十分有利,它保证了图片快速.无缝地发布 ...
- 如何查看第三方apk的信息
很多时候,我们需要获取别人的apk的信息.但是我们看不到apk的代码,对于apk的信息并没有直接的方法获取.那么,我们要怎么获取apk信息呢? 这里,我整理了两个方法,亲测可用. 第一种,直接使用An ...
- 如何在Notepad++里正确设置java环境(图文环境)
不多说,直接上干货! 这款软件非常好用!!! Notepad++软件的下载与安装步骤(图文详解) 欢迎大家,加入我的微信公众号:大数据躺过的坑 人工智能躺过的坑 同时,大家可 ...
- 【转】linux sar命令详解
原文地址:http://lovesoo.org/linux-sar-command-detailed.html sar(System Activity Reporter系统活动情况报告)是目前 Lin ...
- TensorFlow的梯度裁剪
在较深的网络,如多层CNN或者非常长的RNN,由于求导的链式法则,有可能会出现梯度消失(Gradient Vanishing)或梯度爆炸(Gradient Exploding )的问题. 原理 问题: ...
- PHP MYSQL登陆和模糊查询
PHP MYSQL登陆和模糊查询 PHP版本 5.5.12 MYSQL版本 5.6.17 Apache 2.4.9 用的wampserver 一.PHPMYSQL实现登陆: 一共含有两个 ...
- SSM整合(1): spring 与 springmvc 整合
久没有写博客了, 今年事情太多了, 也没了心思. 去深圳出差, 更重要的结婚的事情, 一茬接一茬. 好在最近闲暇一些, 就想记录一些曾经困扰过我的问题(现在用spring boot真是太方便了, 很 ...