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

posted @ 2020-01-22 14:21  志在必得Shaun  阅读(1014)  评论(0编辑  收藏  举报