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

直接上代码了。

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 = "20200121";// 明文
                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, 0, 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, 0, 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

原文地址:https://www.cnblogs.com/xuezhizhang/p/TripleDES.html

时间: 2024-11-12 11:29:34

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

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

Java 加解密技术系列之 DES 序 背景 概念 基本原理 主要流程 分组模式 代码实现 结束语 序 前 几篇文章讲的都是单向加密算法,其中涉及到了 BASE64.MD5.SHA.HMAC 等几个比较常见的加解密算法.这篇文章,以及后面几篇,打算介绍几个对称加密算法,比如:DES.3DES(TripleDES).AES 等.那么,这篇文章主要是对 DES 大概讲一下. 背景 在 讨论 DES 之前,首先了解一下什么是对称加密算法吧.对于对称加密算法,他应用的时间比较早,技术相对来说比较成熟,在

Java 加解密技术系列之 DES

序 前几篇文章讲的都是单向加密算法.当中涉及到了 BASE64.MD5.SHA.HMAC 等几个比較常见的加解密算法. 这篇文章,以及后面几篇.打算介绍几个对称加密算法.比方:DES.3DES(TripleDES).AES 等.那么,这篇文章主要是对 DES 大概讲一下. 背景 在讨论 DES 之前.首先了解一下什么是对称加密算法吧.对于对称加密算法,他应用的时间比較早.技术相对来说比較成熟,在对称加密算法中.数据发信方将明文(原始数据)和加密密钥一起经过特殊加密算法处理后,使其变成复杂的加密密

PHP 3DES 算法,与Java中的DESede兼容

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 <?php class Crypt3Des {     public $key = &qu

java中常用的数据加密算法

以下为加密的工具类: import java.io.UnsupportedEncodingException; import java.security.InvalidKeyException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.security.PrivateKey; import java.security.PublicKey; impo

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

加密算法有很多种:这里只大约列举几例: 1:消息摘要:(数字指纹):既对一个任意长度的一个数据块进行计算,产生一个唯一指纹.MD5/SHA1发送给其他人你的信息和摘要,其他人用相同的加密方法得到摘要,最后进行比较摘要是否相同. 2:单匙密码体制:DES:比较简便高效,密钥简短,加解密速度快,破译极其困难,但其安全性依赖于密匙的安全性.DES(Data Encryption Standard)是发明最早的最广泛使用的分组对称加密算法.DES算法的入口参数有三个:Key.Data.Mode.其中Ke

Java中常用加减密方式

1.加密概述: 加密就是是以某种特殊的算法改变原有的信息数据,使得未授权的用户即使以获得了加密的信息,但因不知解密方式,仍无法了解信息的内容.大体上又分为双向加密和单向加密. 2.单项加密 2.1.概述: 单向加密又称为不可逆加密算法,在加密过程中不使用密钥,明文由系统加密成密文,密文无法破解,一般都是采用验证的方式,具体是:在验证过程中,重新输入明文,并经过同样的加密算法后,得到相同的密文.单向加密广泛用于口令加密. 2.2.特点: (1)对同一消息反复执行加密得到相同的密文: (2)加密算法

java中的三元运算符详解

最近在带领实习生中遇到很多新手问与三元运算符有关的java题目,多数为代码结果题,少数为应用题.鉴于很多资料上对于java三元运算的讲解过于简单,网上的资料与题目也不是很完善,对于结果答案分析不一,故在此总结,当然仅为个人观点,水平有限,不足之处,还请大家多多指出,互相交流学习. 什么是java三元运算符呢?无疑其操作元有三个,第一个是条件表达式,剩余两个为值,条件表达式为真时运算取第一个值,为假时取第二个值. 其示例代码如下:boolean a = 20 < 45 ? true : false

java中BigDecimal的学习

干着java的活,但是看的都是一些偏底层的东西(或者我根本就没有看),有点荒废了java的学习. 最近一直在用到一个类是BigDecimal,但都是模棱两可地在那儿用,并没有深入研究这个类的细节,感觉不能再拖了. BigDecimal,从名字来看就是进行大数运算的,不光这样,还广泛用于小数的精确运算. 当你接触到和钱有关的计算的时候,这个类还是很有用滴. 先来看一个例子 1 package com.tuhooo.bigdecimal; 2 3 /** 4 * Created by tuhooo

Java中的Serializable接口的作用

转载自:http://blog.csdn.net/shehun11/article/details/40300439 所谓的Serializable,就是java提供的通用数据保存和读取的接口.至于从什么地方读出来和保存到哪里去都被隐藏在函数参数的背后了.这样子,任何类型只要实现了Serializable接口,就可以被保存到文件中,或者作为数据流通过网络发送到别的地方.也可以用管道来传输到系统的其他程序中.这样子极大的简化了类的设计.只要设计一个保存一个读取功能就能解决上面说得所有问题. Obj