项目中用到的数据加密方式是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. SQL窗口函数RANK(),Dense_Rank(),row_number(),NTILE()

    数据源 CREATE TABLE student( no int, ca ), name ), subject ), scorce int ); /* 数据 */ , ); , ); , ); , ) ...

  2. RedHat 6配置yum源为网易镜像(转)

    概述 由于版权的问题,RedHat6不能直接使用yum一些指令,需要配置yum源为网易镜像,但是网上谈到很多:整理一下,将有用的信息整理如下,以便于能够为其他的配置服务配置使用:需要卸载掉原理系统自带 ...

  3. 如果往错误的NEO地址转账会发生什么

    昨天聊天有人用NEO往错误地址转账丢钱了 我的第一反应是这不可能   Neo使用的地址带有验证功能 最下面ARPP-.G6ce这一串是个base58编码 把他解开就是17-.151f7b5f这一串 红 ...

  4. Fragment概述

    1 Fragment Fragment是什么? Fragment允许将Activity拆分成多个完全独立封装的可重用的组件,每个组件有它自己的生命周期和UI布局. 每个Fragment都是独立的模块, ...

  5. 20181115 python-第一章学习小结part1

    知识点回顾: 什么是编程: 写代码,让计算机执行任务 编程语言的分类与特性: 1.机器语言,即二进制语言,最帖近于机器底层,可以由计算机直接执行,故速度最快,但不适合开发. 2.汇编语言,直接将二进制 ...

  6. vue-cli模拟后台数据交互

    作为一个前端入坑的妹子,在学习vue的道路上挣扎徘徊,由一开始的对vue一直蒙圈只知道双向数据绑定和一些'V-x'的指令,慢慢通过一个视频的学习渐渐入坑,对于我这个js基础不怎么好而且编程思维又不是很 ...

  7. shell grep

    grep "str" file > /dev/null if [ $? -eq 1]; then echo "no str" else echo &quo ...

  8. php正则表达式 剔除字符串中 ,除了汉字的字符(只保留汉字) php 正则 只保留汉字,剔除所有符号

    <?php //提取字符串中的汉字其余信息剔除 $str='f龙,真 .,.,.?!::·…~&@#,.?!:;.……-&@#“”‘’〝 "〞'´'>< ...

  9. js上课笔记

    Html 结构化CSS 样式JavaScript 行为交互01.JavaScript基础02.JavaScript操作BOM对象03.JavaScript操作DOM对象 *****04.JavaScr ...

  10. linux mysql 定时备份

    1.查看磁盘空间情况: 既然是定时备份,就要选择一个空间充足的磁盘空间,避免出现因空间不足导致备份失败,数据丢失的恶果! 存储到当前磁盘这是最简单,却是最不推荐的:服务器有多块硬盘,最好是把备份存放到 ...