C # DES шифрование неверно на трейлинг-номер - PullRequest
0 голосов
/ 15 марта 2019

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

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

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

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 Ответ

2 голосов
/ 15 марта 2019

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

Ммм ... сомневаюсь, что это происходит в ENcryption ...

При более детальном рассмотрении ваших дешифровальных шоу:

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

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

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

(это ваши пропавшие символы)

...