• 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

  • 相关阅读:
    C#调用Windows Api播放midi音频
    AutoCAD.net利用Xaml创建Ribbon界面
    WCF 不支持泛型协议 及 通过父类给子类赋值 通过反射加工
    windows右键菜单自动打包发布nuget,没有CI/CD一样方便!
    体验用yarp当网关
    .Net5 中使用Mediatr 中介者模式下的CQRS
    Vue-Router 路由属性解析
    Vue 3.0+Vite 2.0+Vue Router 4.0.6+Vuex 4.0.0+TypeScript +Yarn
    程序设计语言与语言处理程序基础.md
    Visual Studio 2019 舒适性设置
  • 原文地址:https://www.cnblogs.com/xuezhizhang/p/TripleDES.html
Copyright © 2020-2023  润新知