Java 和C# DES加解密解决Key长度不相容问题

JavaDes传入Key长度不定 因此C#Des key长度(8)就有可能与java传入key长度不等 在java加密 C#解密的项目中就会有问题

因此查看Java文档 对加密类参数Key的解释

地址:https://docs.oracle.com/javase/7/docs/api/javax/crypto/spec/DESKeySpec.html

DESKeySpec(byte[] key)

Creates a DESKeySpec object using the first 8 bytes in key as the key material for the DES key.

DESKeySpec(byte[] key, int offset)

Creates a DESKeySpec object using the first 8 bytes in key, beginning at offset inclusive, as the key material for the DES key.

得知实际参与加密的字节也是只有8bytes

因此在C#解密中对长字符串Key设置前需要转化为byte数组后截取前8位

并且由于java使用模式默认位ECB模式 因此在C#中需要设置

ECB模式默认可不使用VI偏移量 因此可以不加

具体如下:

/// <summary>
                /// 加密
                /// </summary>
                /// <param name="inEncrypt"></param>
                /// <returns></returns>
                static string Encrypt(byte[] inEncrypt)
                {
                        try
                        {
                                DESCryptoServiceProvider des = new DESCryptoServiceProvider();
                                des.Key = ASCIIEncoding.ASCII.GetBytes(token).Skip(0).Take(8).ToArray();
                                des.Mode = CipherMode.ECB;
                                MemoryStream ms = new MemoryStream();
                                CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
                                cs.Write(inEncrypt, 0, inEncrypt.Length);
                                cs.FlushFinalBlock();
                                return Convert.ToBase64String(ms.ToArray());
                        }
                        catch (Exception ex)
                        {
                                throw new Exception(ex.Message);
                        }
                }

                /// <summary>
                /// 解密
                /// </summary>
                /// <param name="outEncrypt"></param>
                /// <returns></returns>
                static string Decrypt(byte[] outEncrypt)
                {
                        try
                        {
                                DESCryptoServiceProvider des = new DESCryptoServiceProvider();
                                des.Key = ASCIIEncoding.ASCII.GetBytes(token).Skip(0).Take(8).ToArray();
                                des.Mode = CipherMode.ECB;
                                MemoryStream ms = new MemoryStream();
                                CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
                                cs.Write(outEncrypt, 0, outEncrypt.Length);
                                cs.FlushFinalBlock();
                                return Encoding.UTF8.GetString(ms.ToArray());
                        }
                        catch (Exception ex)
                        {
                                throw new Exception(ex.Message);
                        }
                }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是使用C#进行DES加密和解密的代码示例: ```csharp using System; using System.Security.Cryptography; using System.Text; public class DESExample { public static string Encrypt(string plainText, byte[] key, byte[] iv) { byte[] encrypted; using (DESCryptoServiceProvider des = new DESCryptoServiceProvider()) { des.Key = key; des.IV = iv; ICryptoTransform encryptor = des.CreateEncryptor(des.Key, des.IV); using (var memoryStream = new System.IO.MemoryStream()) { using (var cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write)) { using (var streamWriter = new System.IO.StreamWriter(cryptoStream)) { streamWriter.Write(plainText); } encrypted = memoryStream.ToArray(); } } } return Convert.ToBase64String(encrypted); } public static string Decrypt(string cipherText, byte[] key, byte[] iv) { byte[] decrypted; using (DESCryptoServiceProvider des = new DESCryptoServiceProvider()) { des.Key = key; des.IV = iv; ICryptoTransform decryptor = des.CreateDecryptor(des.Key, des.IV); using (var memoryStream = new System.IO.MemoryStream(Convert.FromBase64String(cipherText))) { using (var cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read)) { using (var streamReader = new System.IO.StreamReader(cryptoStream)) { decrypted = Encoding.UTF8.GetBytes(streamReader.ReadToEnd()); } } } } return Encoding.UTF8.GetString(decrypted); } } ``` 使用示例: ```csharp byte[] key = Encoding.UTF8.GetBytes("01234567"); byte[] iv = Encoding.UTF8.GetBytes("abcdefgh"); string plainText = "Hello, World!"; string encryptedText = DESExample.Encrypt(plainText, key, iv); Console.WriteLine($"Encrypted: {encryptedText}"); string decryptedText = DESExample.Decrypt(encryptedText, key, iv); Console.WriteLine($"Decrypted: {decryptedText}"); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值