C#与Java同步加密解密DES算法
在实际项目中,往往前端和后端使用不同的语言。比如使用C#开发客户端,使用Java开发服务器端。有时出于安全性考虑需要将字符加密传输后,由服务器解密获取。本文介绍一种采用DES算法的C#与Java同步加密解密的代码。
C#端代码:(注意:DES的秘钥采用8位字符)
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Globalization;
- using System.Threading.Tasks;
- using System.Security.Cryptography;
- using System.IO;
- namespace ChatDemo.util
- {
- public static class PasswordHelper
- {
- ///<summary><![CDATA[字符串DES加密函数]]></summary>
- ///<param name="str"><![CDATA[被加密字符串 ]]></param>
- ///<param name="key"><![CDATA[密钥 ]]></param>
- ///<returns><![CDATA[加密后字符串]]></returns>
- public static string EncodeDES(string str, string key)
- {
- try
- {
- DESCryptoServiceProvider provider = new DESCryptoServiceProvider();
- provider.Key = Encoding.ASCII.GetBytes(key.Substring(0, 8));
- provider.IV = Encoding.ASCII.GetBytes(key.Substring(0, 8));
- byte[] bytes = Encoding.GetEncoding("UTF-8").GetBytes(str);
- MemoryStream stream = new MemoryStream();
- CryptoStream stream2 = new CryptoStream(stream, provider.CreateEncryptor(), CryptoStreamMode.Write);
- stream2.Write(bytes, 0, bytes.Length);
- stream2.FlushFinalBlock();
- StringBuilder builder = new StringBuilder();
- foreach (byte num in stream.ToArray())
- {
- builder.AppendFormat("{0:X2}", num);
- }
- stream.Close();
- return builder.ToString();
- }
- catch (Exception) { return "xxxx"; }
- }
- ///<summary><![CDATA[字符串DES解密函数]]></summary>
- ///<param name="str"><![CDATA[被解密字符串 ]]></param>
- ///<param name="key"><![CDATA[密钥 ]]></param>
- ///<returns><![CDATA[解密后字符串]]></returns>
- public static string DecodeDES(string str, string key)
- {
- try
- {
- DESCryptoServiceProvider provider = new DESCryptoServiceProvider();
- provider.Key = Encoding.ASCII.GetBytes(key.Substring(0, 8));
- provider.IV = Encoding.ASCII.GetBytes(key.Substring(0, 8));
- byte[] buffer = new byte[str.Length / 2];
- for (int i = 0; i < (str.Length / 2); i++)
- {
- int num2 = Convert.ToInt32(str.Substring(i * 2, 2), 0x10);
- buffer[i] = (byte)num2;
- }
- MemoryStream stream = new MemoryStream();
- CryptoStream stream2 = new CryptoStream(stream, provider.CreateDecryptor(), CryptoStreamMode.Write);
- stream2.Write(buffer, 0, buffer.Length);
- stream2.FlushFinalBlock();
- stream.Close();
- return Encoding.GetEncoding("UTF-8").GetString(stream.ToArray());
- }
- catch (Exception) { return ""; }
- }
- }
- }
Java端代码:
- package com.hbcloudwide.didaoa.chatserver.util;
- import javax.crypto.Cipher;
- import javax.crypto.SecretKey;
- import javax.crypto.SecretKeyFactory;
- import javax.crypto.spec.DESKeySpec;
- import javax.crypto.spec.IvParameterSpec;
- import org.apache.commons.codec.digest.DigestUtils;
- /**
- * 密码加密解密处理工具类
- *
- * @author lee
- *
- */
- public class PasswordUtil {
- // 解密数据
- /**
- * DES解密
- * @param message
- * @param key
- * @return
- * @throws Exception
- *
- * lee on 2016-12-26 00:28:18
- */
- public static String DecodeDES(String message, String key) throws Exception {
- byte[] bytesrc = convertHexString(message);
- Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
- DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF-8"));
- SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
- SecretKey secretKey = keyFactory.generateSecret(desKeySpec);
- IvParameterSpec iv = new IvParameterSpec(key.getBytes("UTF-8"));
- cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);
- byte[] retByte = cipher.doFinal(bytesrc);
- return new String(retByte);
- }
- /**
- * DES加密
- * @param message
- * @param key
- * @return
- * @throws Exception
- *
- * lee on 2016-12-26 00:28:28
- */
- public static byte[] EncodeDES(String message, String key) throws Exception {
- Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
- DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF-8"));
- SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
- SecretKey secretKey = keyFactory.generateSecret(desKeySpec);
- IvParameterSpec iv = new IvParameterSpec(key.getBytes("UTF-8"));
- cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);
- return cipher.doFinal(message.getBytes("UTF-8"));
- }
- /**
- * MD5加密
- * 使用org.apache.commons.codec.digest.DigestUtils加密
- * http://commons.apache.org/proper/commons-codec/download_codec.cgi
- * @param message
- * @return
- *
- * lee on 2016-12-26 00:28:28
- */
- public static String EncodeMD5(String message) {
- return DigestUtils.md5Hex(message);
- }
- public static byte[] convertHexString(String ss) {
- byte digest[] = new byte[ss.length() / 2];
- for (int i = 0; i < digest.length; i++) {
- String byteString = ss.substring(2 * i, 2 * i + 2);
- int byteValue = Integer.parseInt(byteString, 16);
- digest[i] = (byte) byteValue;
- }
- return digest;
- }
- public static String toHexString(byte b[]) {
- StringBuffer hexString = new StringBuffer();
- for (int i = 0; i < b.length; i++) {
- String plainText = Integer.toHexString(0xff & b[i]);
- if (plainText.length() < 2)
- plainText = "0" + plainText;
- hexString.append(plainText);
- }
- return hexString.toString();
- }
- }
C# DES加密后的字符传递到Java端获取后,可以正确进行解密。反之亦然。
BTW:Java代码中有一个方法用来进行MD5加密,采用org.apache.commons.codec.digest.DigestUtils进行加密。
C#与Java同步加密解密DES算法的更多相关文章
- 你真的了解字典(Dictionary)吗? C# Memory Cache 踩坑记录 .net 泛型 结构化CSS设计思维 WinForm POST上传与后台接收 高效实用的.NET开源项目 .net 笔试面试总结(3) .net 笔试面试总结(2) 依赖注入 C# RSA 加密 C#与Java AES 加密解密
你真的了解字典(Dictionary)吗? 从一道亲身经历的面试题说起 半年前,我参加我现在所在公司的面试,面试官给了一道题,说有一个Y形的链表,知道起始节点,找出交叉节点.为了便于描述,我把上面 ...
- 使用python进行加密解密AES算法
使用python进行加密解密AES算法-代码分享-PYTHON开发者社区-pythoner.org 使用python进行加密解密AES算法 TY 发布于 2011-09-26 21:36:53,分类: ...
- 重新想象 Windows 8 Store Apps (32) - 加密解密: 非对称算法, 数据转换的辅助类
原文:重新想象 Windows 8 Store Apps (32) - 加密解密: 非对称算法, 数据转换的辅助类 [源码下载] 重新想象 Windows 8 Store Apps (32) - 加密 ...
- C# 实现 JAVA AES加密解密[原创]
以下是网上普遍能收到的JAVA AES加密解密方法. 因为里面用到了KeyGenerator 和 SecureRandom,但是.NET 里面没有这2个类.无法使用安全随机数生成KEY. 我们在接收J ...
- 【转】 java RSA加密解密实现
[转] java RSA加密解密实现 该工具类中用到了BASE64,需要借助第三方类库:javabase64-1.3.1.jar 下载地址:http://download.csdn.net/detai ...
- java字符串加密解密
java字符串加密解密 字符串加密解密的方式很多,每一种加密有着相对的解密方法.下面要说的是java中模拟php的pack和unpack的字符串加密解密方法. java模拟php中pack: /** ...
- JAVA常用加密解密算法Encryption and decryption
加密,是以某种特殊的算法改变原有的信息数据,使得未授权的用户即使获得了已加密的信息,但因不知解密的方法,仍然无法了解信息的内容.大体上分为双向加密和单向加密,而双向加密又分为对称加密和非对称加密(有些 ...
- JAVA加密解密DES对称加密算法
下面用DES对称加密算法(设定一个密钥,然后对所有的数据进行加密)来简单举个例子. 首先,生成一个密钥KEY. 我把它保存到key.txt中.这个文件就象是一把钥匙.谁拥有它,谁就能解开我们的类文件. ...
- JAVA实现RSA加密解密 非对称算法
首先RSA是一个非对称的加密算法.所以在使用该算法加密解密之前,必须先行生成密钥对.包含公钥和私钥 JDK中提供了生成密钥对的类KeyPairGenerator,实比例如以下: public stat ...
随机推荐
- c#录音和放音,超简单!不用DirectX
最近在做android与C#录音并互相通信的小东西.但是卡在C#录音这儿了.找了好久,说的都是DirectX,可是我总是安装不上,这才找到了这个简单的录音方法.当然,如果你想要录得好并且处理音频,那还 ...
- Asp.Net Mvc表单提交之List集合
一.说明 1.Asp.Net Mvc中Action的参数可以自动接收和反序列化form表单的值, 2.对于name=value类型,只要Action参数的变量名和input的name相同就行,不区分大 ...
- [转]缓慢但胜在稳健,HBase大势已成
CSDN Hbase : http://www.csdn.net/tag/hbase 在NoSQL数据库领域,统治产品无疑当属MongDB和DataStax Enterprise(一个领先的Apach ...
- Qt解决:Qobject::connect queue arguments of type ‘xxxx’,Make sure ‘xxxx’ is registered using qRegister
解决方法:在调用connect之前,通过 qRegisterMetaType() 注册你connect函数里对象的类型代码如下: typedef QString CustomString;//你自己定 ...
- Windows server 2008 SSD性能测试
过渡到windows 7.windows8是趋势,老迈的windows xp .windows server 2003已经快到淘汰的阶段,安装了windows server 2008 R2 ,测试了下 ...
- C#微信接口之推送模板消息功能示例
本文实例讲述了C#微信接口之推送模板消息功能.分享给大家供大家参考,具体如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 2 ...
- Base64原理与实现
Base64编码说明 Base64编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之后在6位的前面补两个0,形成8位一个字节的形式. 如果剩下的字符不足3个字节,则用0填充 ...
- MongoDB分页的Java实现和分页需求的思考
前言 传统关系数据库中都提供了基于row number的分页功能,切换MongoDB后,想要实现分页,则需要修改一下思路. 传统分页思路 假设一页大小为10条.则 //page 1 1-10 //pa ...
- 浅谈 Adaboost 算法
http://blog.csdn.net/haidao2009/article/details/7514787 菜鸟最近开始学习machine learning.发现adaboost 挺有趣,就把自己 ...
- TCP Socket Programming in Node.js
TCP Socket Programming in Node.js Posted on October 26th, 2011 under Node.jsTags: Client, node.js, S ...