#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 с конца
(которые, оказывается, являются вашими отсутствующими символами)