Неверное шифрование C # DES для конечного числа

#c# #encryption #cryptography #des

#c# #шифрование #криптография #des

Вопрос:

Неправильное совпадение происходит при шифровании des, только когда необработанный текст имеет завершающий номер 1,2,3,4.

Я написал здесь скрипача, чтобы продемонстрировать проблему: https://dotnetfiddle.net/7u0Hzr

Прикрепил встроенный код fiddler здесь, если вы не хотите перенаправляться:

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

public class Program
{
    public static void Main()
    {
        var key = "abcd1234";
        var salt = "4321";
        var encrypted = "";
        var decrypted = "";
        var alphabets = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray();

        for (var i = 0; i < 100; i  )
        {
            var text = $"{Math.Floor((double)i / 10)}{i % 10}";
            encrypted = DesEncrypt(text, key, salt);
            decrypted = DesDecrypt(encrypted, key, salt);
            Console.WriteLine($"Text: {text} | Encrypted: {encrypted} | Decrypted: {decrypted}");
        }
    }


    private static string DesEncrypt(string plaintText, string strKey, string salt)
    {
        byte[] key = { }; //Encryption Key   
        byte[] IV = { 10, 20, 30, 40, 50, 60, 70, 80 };
        byte[] inputByteArray;

        try
        {
            key = Encoding.UTF8.GetBytes(strKey);
            // DESCryptoServiceProvider is a cryptography class defind in c#.  
            DESCryptoServiceProvider ObjDES = new DESCryptoServiceProvider();
            inputByteArray = Encoding.UTF8.GetBytes(plaintText   salt);
            MemoryStream Objmst = new MemoryStream();
            CryptoStream Objcs = new CryptoStream(Objmst, ObjDES.CreateEncryptor(key, IV), CryptoStreamMode.Write);
            Objcs.Write(inputByteArray, 0, inputByteArray.Length);
            Objcs.FlushFinalBlock();

            return Convert.ToBase64String(Objmst.ToArray());//encrypted string  
        }
        catch (System.Exception ex)
        {
            throw ex;
        }
    }
    private static string DesDecrypt(string cipherText, string strKey, string salt)
    {
        byte[] key = { };// Key   
        byte[] IV = { 10, 20, 30, 40, 50, 60, 70, 80 };
        byte[] inputByteArray = new byte[cipherText.Length];

        try
        {
            key = Encoding.UTF8.GetBytes(strKey);
            DESCryptoServiceProvider ObjDES = new DESCryptoServiceProvider();
            inputByteArray = Convert.FromBase64String(cipherText);

            MemoryStream Objmst = new MemoryStream();
            CryptoStream Objcs = new CryptoStream(Objmst, ObjDES.CreateDecryptor(key, IV), CryptoStreamMode.Write);
            Objcs.Write(inputByteArray, 0, inputByteArray.Length);
            Objcs.FlushFinalBlock();

            Encoding encoding = Encoding.UTF8;
            return encoding.GetString(Objmst.ToArray()).TrimEnd(salt.ToCharArray());
        }
        catch (System.Exception ex)
        {
            if (ex is FormatException) Console.WriteLine("The token is in the wrong format");
            if (ex is System.Security.Cryptography.CryptographicException) Console.WriteLine("Invalid token");
            throw ex;
        }
    }
}
  

Комментарии:

1. Примечание к закрытию очереди голосования: добавлен код.

Ответ №1:

Неправильное совпадение происходит при шифровании des, только когда необработанный текст имеет завершающий номер 1,2,3,4.

ммм … я сомневаюсь, что это происходит при шифровании…

более пристальный взгляд на вашу расшифровку показывает:

 return encoding.GetString(Objmst.ToArray()).TrimEnd(salt.ToCharArray());
  

другими словами:

-вы получаете свой массив из MemoryStream
— создаете из него строку
— и, наконец, удаляете все экземпляры ваших символов salt с конца

(которые, оказывается, являются вашими отсутствующими символами)