项目中用到的数据加密方式是ECB模式的DES加密得到的十六进制字符串。技术支持让写一个.net版的加密算法。这里做一下记录。

java版:

16进制使用的是bouncycastle。

import com.emaxcard.codec.CodecException;
import com.emaxcard.codec.Hex;
import sun.misc.BASE64Encoder; import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec; public class DESEncrypt { public static String encodeECB(String src, String key) throws CodecException {
try {
SecretKey deskey = new SecretKeySpec(key.getBytes("UTF-8"), "DESede");
Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, deskey);
byte[] cipherInfo = cipher.doFinal(src.getBytes("UTF-8"));
System.out.println("cipherInfo:"+new BASE64Encoder().encode(cipherInfo));
return Hex.encode(cipherInfo);
} catch (Exception var5) {
throw new CodecException(var5);
}
} public static String decodeECB(String src, String key) throws CodecException {
try {
SecretKey deskey = new SecretKeySpec(key.getBytes("UTF-8"), "DESede");
Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, deskey);
byte[] decodeRes = cipher.doFinal(Hex.decode(src));
return new String(decodeRes, "UTF-8");
} catch (Exception var5) {
throw new CodecException(var5);
}
}
}
public class Hex {
public Hex() {
} public static byte[] decode(String data) throws CodecException {
try {
return org.bouncycastle.util.encoders.Hex.decode(data);
} catch (Exception var2) {
throw new CodecException(var2.getMessage(), var2);
}
} public static String encode(byte[] data) {
return new String(org.bouncycastle.util.encoders.Hex.encode(data));
} public static void main(String[] args) throws CodecException {
System.out.println(encode("a张y".getBytes()));
System.out.println(new String(decode("")));
}
}

.net(c#)版:

using System;
using System.IO;
using System.Security.Cryptography;
using System.Text; namespace ConsoleApplication1
{
class DESEncrypt
{
public static string encodeECB(string encryptString, String key)
{
byte[] keyBytes = Encoding.UTF8.GetBytes(key.Substring(, ));
byte[] keyIV = keyBytes;
byte[] inputByteArray = Encoding.UTF8.GetBytes(encryptString);
DESCryptoServiceProvider provider = new DESCryptoServiceProvider();
provider.Mode = CipherMode.ECB;
provider.Padding = PaddingMode.PKCS7;
MemoryStream mStream = new MemoryStream();
CryptoStream cStream = new CryptoStream(mStream, provider.CreateEncryptor(keyBytes, keyIV), CryptoStreamMode.Write);
cStream.Write(inputByteArray, , inputByteArray.Length);
cStream.FlushFinalBlock();
//return Convert.ToBase64String(mStream.ToArray());
return Hex.encode(mStream.ToArray());
}
public static string DesDecrypt(string decryptString, String key)
{
byte[] keyBytes = Encoding.UTF8.GetBytes(key.Substring(, ));
byte[] keyIV = keyBytes;
//byte[] inputByteArray = Convert.FromBase64String(decryptString);
byte[] inputByteArray = Hex.decode(decryptString);
DESCryptoServiceProvider provider = new DESCryptoServiceProvider();
provider.Mode = CipherMode.ECB;
provider.Padding = PaddingMode.PKCS7;
MemoryStream mStream = new MemoryStream();
CryptoStream cStream = new CryptoStream(mStream, provider.CreateDecryptor(keyBytes, keyIV), CryptoStreamMode.Write);
cStream.Write(inputByteArray, , inputByteArray.Length);
cStream.FlushFinalBlock();
return Encoding.UTF8.GetString(mStream.ToArray());
} }
}
using System;
using System.Globalization;
using System.Text; namespace ConsoleApplication1
{
sealed class Hex
{
public static byte[] decode(String mHex)
{
mHex = mHex.Replace(" ", "");
if (mHex.Length <= ) return null;
byte[] vBytes = new byte[mHex.Length / ];
for (int i = ; i < mHex.Length; i += )
if (!byte.TryParse(mHex.Substring(i, ), NumberStyles.HexNumber, null, out vBytes[i / ]))
vBytes[i / ] = ;
return vBytes;
} public static String encode(byte[] data)
{
//** 以下两种方式都可以
//方式1
StringBuilder hexString = new StringBuilder();
for (int i = ; i < data.Length; i++)
{
hexString.AppendFormat("{0:x2}", data[i]); //System.Convert.ToString(data[i], 16);
}
return hexString.ToString();
//方式2
//return BitConverter.ToString(data).Replace("-", "").ToLower();
} }
}

BitConverter.ToString方法签名:

    //
// 摘要:
// 将指定的字节数组的每个元素的数值转换为它的等效十六进制字符串表示形式。
//
// 参数:
// value:
// 字节数组。
//
// 返回结果:
// 由以连字符分隔的十六进制对构成的字符串,其中每一对表示 value 中对应的元素;例如“7F-2C-4A”。
//
// 异常:
// System.ArgumentNullException:
// value 为 null。
public static string ToString(byte[] value);

关于DES

DES是一种对称加密算法,所谓对称加密算法即:加密和解密使用相同密钥的算法。与之对应的是非对称加密算法,例如RSA,它是公钥加密并且私钥解密。

des加密算法有如下几个要素:

  1. DES加密模式:这里选ECB
  2. 填充:java是pkcs5padding,.net是pkcs7padding。网上说PKCS5Padding与PKCS7Padding基本上是可以通用的。
  3. 字符集:utf-8
  4. 输出:base64、hex
  5. 密码/Key:8个字符(共64位)------java要求传24个字符,不过加密也是截取的前8位
  6. 待加密/解密的文本

在线des加密工具:http://tool.chacuo.net/cryptdes

注意:当DES加密使用的key与解密使用的key不一样时,会报这个异常。

javax.crypto.BadPaddingException: Given final block not properly padded
at com.emaxcard.codec.Desede.decodeECB(Desede.java:151)

ref:https://www.cnblogs.com/langtianya/p/3715975.html

des加密算法java&c#的更多相关文章

  1. JAVA使用DES加密算法加密解密

    程序中使用了.properties文件作为参数配置文档,好处是灵活配置各项参数 一旦对数据库的一些参数进行了配置,势必涉及数据库的IP,端口,用户名和密码 properties文件全是unicode编 ...

  2. AES/DES 可逆性加密算法 -- java工具类

    package com.lock.demo.service; import org.apache.tomcat.util.codec.binary.Base64; import javax.crypt ...

  3. paip.提升安全性----Des加密 java php python的实现总结

    paip.提升安全性----Des加密 java php python的实现总结 ///////////    uapi         private static String decryptBy ...

  4. 浅谈DES加密算法

    一.DES加密算法介绍 1.要求密钥必须是8个字节,即64bit长度 2.因为密钥是byte[8] , 代表字符串也可以是非可见的字节,可以与Base64编码算法一起使用 3.加密.解密都需要通过字节 ...

  5. 对称密码——DES加密算法

    前言 本篇博文将介绍对称密码算法中的DES密码的算法原理与代码实现(Java) DES算法原理 DES加密算法是对称加密算法(加密和解密使用同一个密钥)中的一种,DES也是分组密码,以64位为分组对明 ...

  6. 在.NET Core 里使用 BouncyCastle 的DES加密算法

    .NET Core上面的DES等加密算法要等到1.2 才支持,我们可是急需这个算法的支持,文章<使用 JavaScriptService 在.NET Core 里实现DES加密算法>需要用 ...

  7. android和.net webservice中的DES加密算法

    也是看了一堆的例子,本身并不会写加密算法,好在只要会用就行了,我们把在app中使用的参数加密,然后在.net端的webservice中进行解密,本身并没有什么问题,但是android下和.net下的d ...

  8. DES加密算法的C++实现

    <信息安全技术>这门课又在讲 DES 加密算法了,以前用纯C写过一次,这次我用 C++ 重新写了一个,写篇文章以备后用.本文介绍了 DES 算法加密的大致步骤和整体流程. 一.DES算法原 ...

  9. 最简单的DES加密算法实现

    Base64.java package com.mstf.des; import java.io.UnsupportedEncodingException; /** * base64编码/解码 * @ ...

随机推荐

  1. matplotlib柱状图-【老鱼学matplotlib】

    柱状图在平常的图表中是非常常用的图,本节我们来看下如何来显示柱状图. 代码为: import numpy as np import pandas as pd import matplotlib.pyp ...

  2. 分享关于搭建高性能WEB服务器的一篇文章

    这篇文章主要介绍了Centos5.4+Nginx-0.8.50+UWSGI-0.9.6.2+Django-1.2.3搭建高性能WEB服务器的相关资料,需要的朋友可以参考下(http://m.0813s ...

  3. Java开发人员必须掌握的Linux命令-学以致用(5)

    ================================================= 人工智能教程.零基础!通俗易懂!风趣幽默!大家可以看看是否对自己有帮助! 点击查看高清无码教程 == ...

  4. Loadrunner乱码问题解决方案(录制&&运行)

    在使用Loadrunner录制和回放时有时会出现乱码,从而导致脚本运行失败,这让我们很难定位脚本问题所在. 1.乱码产生的原因 1)loadrunner工具使用的是UTF-8编码,但被测系统使用的是G ...

  5. MyBatis入门(二)接口式编程

    在  MyBatis入门(一) 的基础之上编写接口 将接口和Mapper文件进行绑定,会为接口创建一个代理对象,代理对象去执行增删改查 (1)编写接口 public interface EmpDao ...

  6. RHEL5.8安装

    创建完成后新的虚拟机.使用光盘启动后,启动界面如下图. 大概介绍下显示界面内容的意思:     1.To install or upgrade in graphical mde, press the ...

  7. ko.js学习一

    一.KO是一个MVVM框架 声明式绑定 (Declarative Bindings):使用简明易读的语法很容易地将模型(model)数据关联到DOM元素上. UI界面自动刷新 (Automatic U ...

  8. MySql数据and高级查询

    1.CREATE TABLE grade(stuID INT AUTO_INCREMENT PRIMARY KEY NOT NULL,stuName VARCHAR(32),stuAge INT ) ...

  9. [LeetCode] Champagne Tower 香槟塔

    We stack glasses in a pyramid, where the first row has 1 glass, the second row has 2 glasses, and so ...

  10. Oracle SQL 内置函数大全(转)

    SQL中的单记录函数 1.ASCII 返回与指定的字符对应的十进制数;SQL> select ascii('A') A,ascii('a') a,ascii('0') zero,ascii(' ...