直接上代码了。

Java控制台代码:

package Test;

import java.security.Key;

import javax.crypto.Cipher;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;
import javax.crypto.spec.IvParameterSpec; import org.apache.commons.codec.binary.Base64; public class Test {
private static final String encoding = "UTF-8"; public static void main(String[] args) {
try {
String text = "20200121";// 明文
String key = "Tt3rLPrDIVIhXqAz";// 长度控制为16,作为3DES加密用的key
String encryptStr = EncryptData(text, key);// 3DES加密结果 System.out.println("明文:" + text);
System.out.println("密钥:" + key);
System.out.println("密文:" + encryptStr);
System.out.println("解密:" + DecryptData(encryptStr, key));
} catch (Exception e) {
e.printStackTrace();
}
} /**
* DESede加密,key长度为16
*
* @param plainText 明文
* @param key 密钥
* @return DESede加密结果
* @throws Exception
*/
static String EncryptData(String plainText, String key) throws Exception { byte[] keyBytes = key.getBytes(encoding);
if (keyBytes.length == 16) { // short key ? .. extend to 24 byte key
byte[] tmpKey = new byte[24];
System.arraycopy(keyBytes, 0, tmpKey, 0, 16);
System.arraycopy(keyBytes, 0, tmpKey, 16, 8);
keyBytes = tmpKey;
} Key deskey = null;
DESedeKeySpec spec = new DESedeKeySpec(keyBytes);
SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede");
deskey = keyfactory.generateSecret(spec);
Cipher cipher = Cipher.getInstance("desede/CBC/PKCS5Padding"); if (keyBytes.length > 8) {
byte[] tmpKey = new byte[8];
System.arraycopy(keyBytes, 0, tmpKey, 0, 8);
keyBytes = tmpKey;
} IvParameterSpec ips = new IvParameterSpec(keyBytes);
cipher.init(Cipher.ENCRYPT_MODE, deskey, ips);
byte[] bOut = cipher.doFinal(plainText.getBytes(encoding)); return Base64.encodeBase64String(bOut);
} /**
* DESede解密,key长度为16
*
* @param input DESede加密的结果
* @param key 密钥
* @return DESede解密结果
* @throws Exception
*/
static String DecryptData(String input, String key) throws Exception {
byte[] keyBytes = key.getBytes(encoding);
if (keyBytes.length == 16) { // short key ? .. extend to 24 byte key
byte[] tmpKey = new byte[24];
System.arraycopy(keyBytes, 0, tmpKey, 0, 16);
System.arraycopy(keyBytes, 0, tmpKey, 16, 8);
keyBytes = tmpKey;
} Key deskey = null;
DESedeKeySpec spec = new DESedeKeySpec(keyBytes);
SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede");
deskey = keyfactory.generateSecret(spec);
Cipher cipher = Cipher.getInstance("desede/CBC/PKCS5Padding"); if (keyBytes.length > 8) {
byte[] tmpKey = new byte[8];
System.arraycopy(keyBytes, 0, tmpKey, 0, 8);
keyBytes = tmpKey;
} IvParameterSpec ips = new IvParameterSpec(keyBytes);
cipher.init(Cipher.DECRYPT_MODE, deskey, ips);
byte[] bOut = cipher.doFinal(Base64.decodeBase64(input)); return new String(bOut, encoding);
} }

C#控制台代码:

using System;
using System.Text;
using System.Security.Cryptography;
using System.IO; namespace Test
{
class Program
{
static void Main(string[] args)
{
try
{
String text = "";// 明文
String key = "Tt3rLPrDIVIhXqAz";// 长度控制为16,作为3DES加密用的key
String encryptStr = EncryptData(text, key);// 3DES加密结果 Console.WriteLine("明文:" + text);
Console.WriteLine("密钥:" + key);
Console.WriteLine("密文:" + encryptStr);
Console.WriteLine("解密:" + DecryptData(encryptStr, key));
Console.Read();
}
catch (Exception ex)
{
Console.WriteLine("运行异常,异常信息:" + ex.Message + ex.StackTrace);
Console.WriteLine("按任意键退出重试");
Console.Read();
} } /// <summary>
/// TripleDES加密,key长度为16
/// </summary>
/// <param name="plainText">明文</param>
/// <param name="key">密钥</param>
/// <returns>TripleDES加密结果</returns>
public static string EncryptData(string plainText, string key)
{
TripleDESCryptoServiceProvider Tripledes = new TripleDESCryptoServiceProvider();
//Tripledes.Mode = CipherMode.ECB;
//Tripledes.Padding = PaddingMode.PKCS7;
byte[] b_input = Encoding.UTF8.GetBytes(plainText);
byte[] b_key = Encoding.UTF8.GetBytes(key);
MemoryStream tempStream = new MemoryStream();
//rgbKey即用于对称算法的密钥、rgbIV即用于对称算法的初始化向量,这里均使用b_key
CryptoStream encStream = new CryptoStream(tempStream, Tripledes.CreateEncryptor(b_key, b_key), CryptoStreamMode.Write);
encStream.Write(b_input, , b_input.Length);
encStream.Close();
return Convert.ToBase64String(tempStream.ToArray());
} /// <summary>
/// TripleDES解密,key长度为16
/// </summary>
/// <param name="input">TripleDES加密的结果</param>
/// <param name="key">密钥</param>
/// <returns>TripleDES解密结果</returns>
public static string DecryptData(string input, string key)
{
TripleDESCryptoServiceProvider Tripledes = new TripleDESCryptoServiceProvider();
byte[] b_input = Convert.FromBase64String(input);
byte[] b_key = Encoding.UTF8.GetBytes(key);
MemoryStream tempStream = new MemoryStream();
//rgbKey即用于对称算法的密钥、rgbIV即用于对称算法的初始化向量,这里均使用b_key
CryptoStream encStream = new CryptoStream(tempStream, Tripledes.CreateDecryptor(b_key, b_key), CryptoStreamMode.Write);
encStream.Write(b_input, , b_input.Length);
encStream.FlushFinalBlock();
return Encoding.UTF8.GetString(tempStream.ToArray());
} }
}

Java和C#运行结果一致,如下:

明文:20200121
密钥:Tt3rLPrDIVIhXqAz
密文:jHaDswvQaPn4ZvashXOTNQ==
解密:20200121

本文首发于我的CSDN博客:https://blog.csdn.net/n_ithero/article/details/104061959

C#中TripleDES对应Java中的DESede即大家说的3DES,附C#及Java加解密结果一致的控制台程序例子的更多相关文章

  1. 5.Java 加解密技术系列之 DES

    Java 加解密技术系列之 DES 序 背景 概念 基本原理 主要流程 分组模式 代码实现 结束语 序 前 几篇文章讲的都是单向加密算法,其中涉及到了 BASE64.MD5.SHA.HMAC 等几个比 ...

  2. Java 加解密技术系列之 DES

    序 前几篇文章讲的都是单向加密算法.当中涉及到了 BASE64.MD5.SHA.HMAC 等几个比較常见的加解密算法. 这篇文章,以及后面几篇.打算介绍几个对称加密算法.比方:DES.3DES(Tri ...

  3. 一个密码经过多次MD5加密能否提高安全性?Java MD5盐值加解密

    什么是MD5? MD5(Message Digest Algorithm 5,信息摘要算法5),是计算机广泛使用的摘要算法(又称哈希算法)之一.MD5是将一段信息,通过其不可逆的字符串变换算法,产生了 ...

  4. Java中加密算法介绍及其实现

    1.Base64编码算法 Base64简介 Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法.可查看RFC2045-RF ...

  5. Java中常用的加密方式(附多个工具类)

    一.Java常用加密方式 Base64加密算法(编码方式) MD5加密(消息摘要算法,验证信息完整性) 对称加密算法 非对称加密算法 数字签名算法 数字证书 二.分类按加密算法是否需要key被分为两类 ...

  6. Java中常用加减密方式

    1.加密概述: 加密就是是以某种特殊的算法改变原有的信息数据,使得未授权的用户即使以获得了加密的信息,但因不知解密方式,仍无法了解信息的内容.大体上又分为双向加密和单向加密. 2.单项加密 2.1.概 ...

  7. 关于Java中常用加密/解密方法的实现

    安全问题已经成为一个越来越重要的问题,在Java中如何对重要数据进行加密解密是本文的主要内容. 一.常用的加密/解密算法 1.Base64 严格来说Base64并不是一种加密/解密算法,而是一种编码方 ...

  8. 【Java安全】关于Java中常用加密/解密方法的实现

    安全问题已经成为一个越来越重要的问题,在Java中如何对重要数据进行加密解密是本文的主要内容. 一.常用的加密/解密算法 1.Base64 严格来说Base64并不是一种加密/解密算法,而是一种编码方 ...

  9. [转] Java中对数据进行加密的几种方法

    加密算法有很多种:这里只大约列举几例: 1:消息摘要:(数字指纹):既对一个任意长度的一个数据块进行计算,产生一个唯一指纹.MD5/SHA1发送给其他人你的信息和摘要,其他人用相同的加密方法得到摘要, ...

随机推荐

  1. P1039 大规模间谍入侵

    题目描述 爱丽丝魔法王国成立10周年,于是决定矩形国庆大阅兵. 在国庆大阅兵期间,为了防止暗黑王国的间谍乔装成平民混入,需要对每一个进城的人做检测. 因为暗黑王国的人长得和爱丽丝魔法王国的人长得很像, ...

  2. 最短路算法(floyed+Dijkstra+bellman-ford+SPFA)

    最短路算法简单模板 一.floyed算法 首先对于floyed算法来说就是最短路径的动态规划解法,时间复杂度为O(n^3) 适用于图中所有点与点之间的最短路径的算法,一般适用于点n较小的情况. Flo ...

  3. H3C 端口绑定典型配置举例

  4. python 下载bilibili视频

    说明: 1.清晰度的选择要登录,暂时还没做,目前下载的视频清晰度都是默认的480P 2.进度条仿linux的,参考了一些博客修改了下,侵删 3.其他评论,弹幕之类的相关爬虫代码放在了https://g ...

  5. Linux普通用户执行特定的命令配置

    最近处理了一个二级CASE,驻场运维的初级工程师安装软件的时候执行了yum update,导致用户生产系统的glibc也升级了,使得用户的生产调度软件无法使用.研究了两三天,最靠谱的做法如下: Ste ...

  6. char* 、const char*和string之间的转换

    1. const char* 和string 转换 (1) const char*转换为 string,直接赋值即可.     EX: const char* tmp = "tsinghua ...

  7. LabWindows/CVI基础

    1.LabWindows/CVI了解 提到NI公司,大家可能最先联想到的是NI公司推出的LabVIEW软件.LabWindows/CVI与LabVIEW相比,主要应用在各种测试.控制.故障分析及信息处 ...

  8. docker(整理中

    docker镜像默认的下载地址就是docker的官网,而他们的官网在国内没有节点,时不时就被国家防火墙隔绝,会出现DNS解析不到,或者找不到镜像等狗血提示. 解决的方法有三个: 第一,就是不断尝试,因 ...

  9. 超简单本地mock假数据测试,模拟后台数据返回必杀技

    温馨提示:急性子可以直接拉到最后观看方法步骤. 什么是mock? mock就是在开发过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试开发的方法. 使用mock有什么好处? ...

  10. flask配置详解

    直接修改config对象 flask会有一个可用的配置对象保存着载入的配置值: Flask 对象的 config 属性,这是 Flask 自己放置特定配置值的地方,也是扩展可以存储配置值的地方.但是, ...