C#.NET与JAVA互通之DES加密V2024

简介: C#,JAVA,DES

C#.NET与JAVA互通之DES加密V2024

环境:
.NET Framework 4.6 控制台程序
JAVA这边:JDK8 (1.8) 控制台程序

注意点:

1.由于密钥、明文、密文的输入输出参数,都是byte数组(byte[]),所以:字符串转byte数组(byte[])环节,双方要约定好编码。

  1. KEY 和 IV 从字符串转byte数组(byte[])时,双方要约定好编码,一般是UTF8。

3.明文从字符串转byte数组(byte[])时,双方要约定好编码,一般是UTF8,.NET 这边要注意:不能用 Encoding.Default。

4.加密后的结果,从byte数组(byte[])转字符串时,双方要约定好编码,一般是Base64字符串。

5.NET 的PKCS7Padding 对应 JAVA 的:PKCS5Padding

一、 .NET DES

先看工具类:DesUtil

using System;
using System.Security.Cryptography;
using System.Text;

namespace CommonUtils
{
   
   
    /// <summary>
    /// 工具类,2024-06-16,runliuv。
    /// </summary>
    public class DesUtil
    {
   
   
        public static byte[] DesEncryptCBC(byte[] plainText, byte[] Key, byte[] IV)
        {
   
   
            byte[] encrypted;

            using (DESCryptoServiceProvider desAlg = new DESCryptoServiceProvider())
            {
   
   
                desAlg.Key = Key;
                desAlg.IV = IV;
                desAlg.Mode = CipherMode.CBC;
                desAlg.Padding = PaddingMode.PKCS7;

                using (ICryptoTransform encryptor = desAlg.CreateEncryptor())
                {
   
   
                    encrypted= encryptor.TransformFinalBlock(plainText, 0, plainText.Length);
                }
            }

            return encrypted;
        }

        public static byte[] DesDecryptCBC(byte[] cipherText, byte[] Key, byte[] IV) 
        {
   
   
            byte[] plaintext = null;

            using (DESCryptoServiceProvider desAlg = new DESCryptoServiceProvider())
            {
   
   
                desAlg.Key = Key;
                desAlg.IV = IV;
                desAlg.Mode = CipherMode.CBC;
                desAlg.Padding = PaddingMode.PKCS7;

                using (ICryptoTransform decryptor = desAlg.CreateDecryptor()) 
                {
   
    
                    plaintext = decryptor.TransformFinalBlock(cipherText, 0, cipherText.Length);
                }
            }

            return plaintext;
        }
        /// <summary>
        /// DES CBC 加密
        /// </summary>
        /// <param name="plainText">明文</param>
        /// <param name="Key">密钥</param>
        /// <param name="IV"></param>
        /// <returns></returns>
        public static string DesEncryptCBC(string plainText, string Key, string IV)
        {
   
   
            byte[] yy= DesEncryptCBC(Encoding.UTF8.GetBytes(plainText), Encoding.UTF8.GetBytes(Key), Encoding.UTF8.GetBytes(IV));
            string xx=Convert.ToBase64String(yy);
            return xx;
        }
        /// <summary>
        /// DES CBC 解密
        /// </summary>
        /// <param name="cipherText">密文</param>
        /// <param name="Key">密钥</param>
        /// <param name="IV"></param>
        /// <returns></returns>
        public static string DesDecryptCBC(string cipherText, string Key, string IV)
        {
   
   
            byte[] yy = DesDecryptCBC(Convert.FromBase64String(cipherText), Encoding.UTF8.GetBytes(Key), Encoding.UTF8.GetBytes(IV));
            string xx = Encoding.UTF8.GetString(yy);
            return xx;
        }
    }
}

.NET 使用这个工具类,做DES CBC 加密 :


static void TestDesCbc()
{
   
   
    Console.WriteLine("-- Test Cbc --");
    string aesKey = "12345678";// DES 密钥长度是8位
    string aesIV = "abcdefgh";// DES IV长度是8位

    string orgStr = "hello .net 2024-06-10";
    string encryptedStr = DesUtil.DesEncryptCBC(orgStr, aesKey, aesIV);
    Console.WriteLine("加密字符串:" + encryptedStr);

    //自加,自解
    string decryptedStr = DesUtil.DesDecryptCBC(encryptedStr, aesKey, aesIV);
    Console.WriteLine("自加,自解:" + decryptedStr);
}

.NET 输出结果 :
-- Test Cbc --
加密字符串:yxEOkYM81hdv0bC1EwgCdE1JSsFyW70A
自加,自解:hello .net 2024-06-10
结束 。
.NET 结果.png
.NET 简要说明:

加密:
public static string DesEncryptCBC(string plainText, string Key, string IV)
{
byte[] yy= DesEncryptCBC(Encoding.UTF8.GetBytes(plainText), Encoding.UTF8.GetBytes(Key), Encoding.UTF8.GetBytes(IV));
string xx=Convert.ToBase64String(yy);
return xx;
}
Encoding.UTF8.GetBytes(plainText),明文字符串转byte数组 使用UTF8。

Encoding.UTF8.GetBytes(Key), Encoding.UTF8.GetBytes(IV),KEY 和 IV 转byte数组 使用UTF8。

public static byte[] DesEncryptCBC(byte[] plainText, byte[] Key, byte[] IV)
{
   
   
    byte[] encrypted;

    using (DESCryptoServiceProvider desAlg = new DESCryptoServiceProvider())
    {
   
   
        desAlg.Key = Key;
        desAlg.IV = IV;
        desAlg.Mode = CipherMode.CBC;
        desAlg.Padding = PaddingMode.PKCS7;

        using (ICryptoTransform encryptor = desAlg.CreateEncryptor())
        {
   
   
            encrypted= encryptor.TransformFinalBlock(plainText, 0, plainText.Length);
        }
    }

    return encrypted;
}

创建一个DESCryptoServiceProvider对象,指定KEY 和 IV,指定 加密模式和 PADDING。

创建加密器对象:desAlg.CreateEncryptor()。

使用 TransformFinalBlock 算出加密结果。

string xx=Convert.ToBase64String(yy); 加密后的结果转字符串时,使用Base64字符串。

解密:

public static string DesDecryptCBC(string cipherText, string Key, string IV)
{
   
   
    byte[] yy = DesDecryptCBC(Convert.FromBase64String(cipherText), Encoding.UTF8.GetBytes(Key), Encoding.UTF8.GetBytes(IV));
    string xx = Encoding.UTF8.GetString(yy);
    return xx;
}

Convert.FromBase64String(cipherText),由于加密结果集转字符串时用的base64,所以密文转byte数组时,就要用Convert.FromBase64String。
加密解密-密文-编码转换对应.png
KEY 和 IV 就不用多说了。

public static byte[] DesDecryptCBC(byte[] cipherText, byte[] Key, byte[] IV) 
{
   
   
    byte[] plaintext = null;

    using (DESCryptoServiceProvider desAlg = new DESCryptoServiceProvider())
    {
   
   
        desAlg.Key = Key;
        desAlg.IV = IV;
        desAlg.Mode = CipherMode.CBC;
        desAlg.Padding = PaddingMode.PKCS7;

        using (ICryptoTransform decryptor = desAlg.CreateDecryptor()) 
        {
   
    
            plaintext = decryptor.TransformFinalBlock(cipherText, 0, cipherText.Length);
        }
    }

    return plaintext;
}

创建一个DESCryptoServiceProvider对象,指定KEY 和 IV,指定 模式和 PADDING。

创建解密器对象:desAlg.CreateDecryptor()。

使用 TransformFinalBlock 解密出结果。

string xx = Encoding.UTF8.GetString(yy); 加密时,明文转byte[] 时用的UTF8,那解密出的明文结果,转byte数组时,也得用UTF8。
加密解密明文编码转换对应.png
可以说,解密与加密是相反的。
加密解密 编码转换 示意图.png
二、JAVA DES

还是简要封装个工具类DesUtil。

package org.runliuv;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;

public class DesUtil {
   
   

    private static final String charset = "UTF-8";

    public static String DesEncryptCBC(String content, String key, String iv)
            throws Exception {
   
   

        //明文
        byte[] contentBytes = content.getBytes(charset);

        //DES KEY
        byte[] keyBytes = key.getBytes(charset);
        SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "DES");

        //DES IV
        byte[] initParam = iv.getBytes(charset);
        IvParameterSpec ivParameterSpec = new IvParameterSpec(initParam);

        Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivParameterSpec);
        byte[] byEnd = cipher.doFinal(contentBytes);

        //加密后的byte数组转BASE64字符串
        String strEnd = Base64.getEncoder().encodeToString(byEnd);
        return strEnd;
    }

    /**
     * 解密
     * @param content
     * @param key
     * @param iv
     * @return
     * @throws Exception
     */
    public static String DesDecryptCBC(String content, String key, String iv)
            throws Exception {
   
   
        //反向解析BASE64字符串为byte数组
        byte[] encryptedBytes = Base64.getDecoder().decode(content);

        //DES KEY
        byte[] keyBytes = key.getBytes(charset);
        SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "DES");

        //DES IV
        byte[] initParam = iv.getBytes(charset);
        IvParameterSpec ivParameterSpec = new IvParameterSpec(initParam);

        Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
        cipher.init(Cipher.DECRYPT_MODE, keySpec, ivParameterSpec);
        byte[] byEnd = cipher.doFinal(encryptedBytes);

        //加密后的byte数组直接转字符串
        String strEnd = new String(byEnd, charset);
        return strEnd;
    }


}

JAVA 使用工具类进行 DES CBC 加密,解密:

System.out.println("-- Test Cbc --");
            String aesKey = "12345678";// DES 密钥长度是8位
            String aesIV = "abcdefgh";// DES IV长度是8位

            String orgStr = "hello JAVA 2024-06-10";
            System.out.println("待加密字符串:" + orgStr);
            String encryptedStr = DesUtil.DesEncryptCBC(orgStr, aesKey, aesIV);
            System.out.println("加密后:" + encryptedStr);

            //自加,自解
            String decryptedStr = DesUtil.DesDecryptCBC(encryptedStr, aesKey, aesIV);
            System.out.println("自加,自解:" + decryptedStr);

效果:

-- Test Cbc --
待加密字符串:hello JAVA 2024-06-10
加密后:VkxvjXu1YKvQJF8MPnFvXhFzJgZI4j9I
自加,自解:hello JAVA 2024-06-10
JAVA 自加 自解.png
三、.NET 加 JAVA 解

先用.NET 对"hello .net 2024-06-10",这个字符串加密,KEY是"12345678",IV为“abcdefgh”,加密结果为:

yxEOkYM81hdv0bC1EwgCdE1JSsFyW70A

将这个串复制到JAVA代码,进行解密:

String NETStr ="yxEOkYM81hdv0bC1EwgCdE1JSsFyW70A";
System.out.println(".NET 加密后的串:" + NETStr);
String decryptedStr = DesUtil.DesDecryptCBC(NETStr, aesKey, aesIV);
System.out.println("JAVA解密:" + decryptedStr);
输出结果 :

-- Test Cbc --
.NET 加密后的串:yxEOkYM81hdv0bC1EwgCdE1JSsFyW70A
JAVA解密:hello .net 2024-06-10

.NET加JAVA解密.png

DES ECB 的加密模式,请自行探索。

目录
相关文章
|
8月前
|
存储 Java 数据安全/隐私保护
Java技术栈揭秘:Base64加密和解密文件的实战案例
以上就是我们今天关于Java实现Base64编码和解码的实战案例介绍。希望能对你有所帮助。还有更多知识等待你去探索和学习,让我们一同努力,继续前行!
555 5
|
12月前
|
存储 缓存 Java
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
1707 3
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
|
Java Maven 数据安全/隐私保护
如何实现Java打包程序的加密代码混淆,避免被反编译?
【10月更文挑战第15天】如何实现Java打包程序的加密代码混淆,避免被反编译?
3210 2
|
存储 安全 算法
C#一分钟浅谈:数据加密与解密技术
【10月更文挑战第3天】在数字化时代,信息安全至关重要。数据加密作为保障信息不被未授权访问的有效手段,通过特定算法将明文转换为密文,确保即使数据被截获也难以解读。本文从基础概念入手,介绍C#中实现数据加密的方法,涵盖对称加密(如AES、DES)与非对称加密(如RSA),并通过具体示例代码演示如何使用`System.Security.Cryptography.Aes`类完成AES加密和解密过程。此外,还强调了密钥管理及安全策略的重要性。
306 4
|
安全 算法 Java
数据库信息/密码加盐加密 —— Java代码手写+集成两种方式,手把手教学!保证能用!
本文提供了在数据库中对密码等敏感信息进行加盐加密的详细教程,包括手写MD5加密算法和使用Spring Security的BCryptPasswordEncoder进行加密,并强调了使用BCryptPasswordEncoder时需要注意的Spring Security配置问题。
1259 0
数据库信息/密码加盐加密 —— Java代码手写+集成两种方式,手把手教学!保证能用!
|
安全 Java 数据安全/隐私保护
- 代码加密混淆工具-Java 编程安全性
在Java编程领域,保护代码安全与知识产权至关重要。本文探讨了代码加密混淆工具的重要性,并介绍了五款流行工具:ProGuard、DexGuard、Jscrambler、DashO 和 Ipa Guard。这些工具通过压缩、优化、混淆和加密等手段,提升代码安全性,保护知识产权。ProGuard 是开源工具,用于压缩和混淆Java代码;DexGuard 专为Android应用程序设计,提供强大加密功能;Jscrambler 基于云,保护Web和移动应用的JavaScript及HTML5代码;DashO 支持多种Java平台和
708 1
|
安全 Java 应用服务中间件
网络安全的护城河:漏洞防御与加密技术深入浅出Java并发编程
【8月更文挑战第31天】在数字世界的棋盘上,每一次点击都可能是一步棋。网络安全的战场无声却激烈,漏洞如同裂缝中的风,悄无声息地侵袭着数据的堡垒。本文将揭示网络漏洞的隐蔽角落,探讨如何通过加密技术筑起防线,同时提升个人和组织的安全意识,共同守护我们的数字家园。
|
12月前
|
云安全 安全 数据建模
《数字证书:互联网世界的"身份证"与"防盗门"》 ——揭秘网络安全背后的加密江湖
在2023年某深夜,上海陆家嘴金融公司机房遭遇黑客攻击,神秘青铜大门与九大掌门封印的玉牌突现,阻止了入侵。此门象征数字证书,保障网络安全。数字证书如验钞机识别假币,保护用户数据。它通过SSL/TLS加密、CA认证和非对称加密,构建安全通信。证书分为DV、OV、EV三类,分别适合不同场景。忽视证书安全可能导致巨额损失。阿里云提供一站式证书服务,助力企业部署SSL证书,迎接未来量子计算和物联网挑战。
|
安全 算法 网络协议
【网络原理】——图解HTTPS如何加密(通俗简单易懂)
HTTPS加密过程,明文,密文,密钥,对称加密,非对称加密,公钥和私钥,证书加密
|
SQL 安全 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将从网络安全漏洞、加密技术和安全意识三个方面进行探讨,旨在提高读者对网络安全的认识和防范能力。通过分析常见的网络安全漏洞,介绍加密技术的基本原理和应用,以及强调安全意识的重要性,帮助读者更好地保护自己的网络信息安全。
254 10