项目中用到的数据加密方式是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. Vue 增删改查 demo

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  2. vue在jsx中使用for循环

    return <div domPropsInnerHTML="titles" style={{ color: 'red', fontSize: '14px' }}> { ...

  3. 前端开发-1React-1概述

    React 起源于 Facebook 的内部项目,因为该公司对市场上所有 JavaScript MVC 框架,都不满意,就决定自己写一套,用来架设Instagram 的网站.做出来以后,发现这套东西很 ...

  4. 02-Python入门学习-变量

    一.编程语言介绍1.机器语言:直接用二进制编程,直接控制硬件,需要掌握硬件的操作细节优点:执行效率高缺点:开发效率低 2.汇编语言:用英文标签取代二进制指令去编写程序,直接控制硬件,需要掌握硬件的操作 ...

  5. JS编码方式

    1. escape(): 采用unicode字符集对指定的字符串除0-255以外进行编码.所有的空格符.标点符号.特殊字符以及更多有联系非ASCII字符都将被转化成%xx格式的字符编码(xx等于该字符 ...

  6. HTML5冲刺

    html5特性及知识点 1.新标签1)div语义不强,针对结构部署,提供了以下新标签nav/main/header/footer/article/asideie9将把以上元素全部解析为行内元素,引入第 ...

  7. 2018-2019-1 20189210 《LInux内核原理与分析》第八周作业

    一 .可执行程序工作原理 程序编译 预处理:gcc -E hello.c -o hello.i 编译:gcc -S hello.i -o hello.s -m32 汇编:gcc -c hello.s ...

  8. laravel之ORM增删改查数据

    1.首先在控制器中添加方法,然后添加路由,接着在模型中操作: 以下是模型 2.以下是控制器中的操作 一下是通过ORM进行更新 删除数据

  9. Asch PK Lisk系列之一:安全性

    在币圈,听到对数字货币的质疑之声从来没少过.为什么有人会质疑呢?他们列出了很多理由(以下四点内容摘自网络): 数字货币是依附于网络的,而中国并没有独立自主的网络技术,容易被敌对势力利用数字货币损害中国 ...

  10. 这样,可以在firefox播放flash了

    <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="62" heigh ...