Алгоритм TripleDES в C#

В настоящее время я работаю над шифрованием TripleDES на С#, для которого я получил образец кода от JAVA.

Я создал функцию шифрования на С# с приведенным ниже примером кода:

Входы: ключ/ekay = "15ce89cd1a2a838f4f6d49d60438251915ce89cd1a2a838f"

текст/данные = "00000000000000000"

public static string encryptionMethod(string Text, string key)
{
          string encryptedText = string.Empty;
          try
            {                
                MD5CryptoServiceProvider md5Hash = new MD5CryptoServiceProvider();                          
                byte[] md5Bytes = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(key));
                md5Hash.Clear();
                byte[] clearBytes = Encoding.UTF8.GetBytes(Text);  
                TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();  
                des.KeySize = 128;                          
                des.Mode = CipherMode.CBC;    
                des.Padding = PaddingMode.None;  
                des.Key = md5Bytes;   //Passing key in byte array
                //des.BlockSize = 64;
                byte[] ivBytes = new byte[8] {0, 0, 0, 0, 0, 0, 0, 0 };
                des.IV = ivBytes;                      
                ICryptoTransform ct = des.CreateEncryptor();   //Interface with some result
                byte[] resultArray = ct.TransformFinalBlock(clearBytes, 0, clearBytes.Length);               
                encryptedText = ByteArrayToHexString(resultArray);                               
            }
            catch (Exception exception)
            {
                return "";
            }
        return encryptedText;

}

public static string ByteArrayToHexString(byte[] ba)
        {
            StringBuilder hex = new StringBuilder(ba.Length * 2);
            foreach (byte b in ba)
                hex.AppendFormat("{0:x2}", b);
            return hex.ToString();
        }

но после сравнения вывода С# с выводом JAVA я получил разные результаты.

JAVA-код


public  static String encrypt(String data, String ekey) {
        String encrypteddata = null;
   try{            
        String key = ekey;
        byte[] encryptKey = ISOUtil.hex2byte(key);        
        DESedeKeySpec spec = new DESedeKeySpec(encryptKey);
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede");
        SecretKey theKey = keyFactory.generateSecret(spec);        
        Cipher cipher = Cipher.getInstance("DESede/CBC/NoPadding");       
        IvParameterSpec IvParameters = new IvParameterSpec( new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 });        
        cipher.init(Cipher.ENCRYPT_MODE, theKey, IvParameters);  
        String plain = data;       
        byte[] plaintext = ISOUtil.hex2byte(plain);
        byte[] encrypted = cipher.doFinal(plaintext);        
         encrypteddata= ISOUtil.byte2hex(encrypted);             
    }
    catch(Exception e){        
    }
        return encrypteddata;      
    }   

выход :

С#: eca27a1e639900f3298a5090cc34dd29

ЯВА: c0a946402dd20f5e


Любая помощь будет оценена?

Спасибо.

Поколения ключей разные. Примечание: c# добавляет IV.

kelalaka 18.04.2019 11:05

DESede == TripleDES?

Cleptus 18.04.2019 12:10

@bradbury9 Да, DES EDE означает шифрование-дешифрование-шифрование DES, описывающее операцию шифрования тройного DES (официально, я думаю, 3-DEA, но тройной DES — это псевдоним, признанный в стандарте, и все его используют).

Maarten Bodewes 19.04.2019 04:17

У одного есть MD5, у другого нет. У одного есть шестигранник, у другого нет. Ты даже не пытающийся. Простое копирование кода, использующего тройной DES, не означает, что мы напишем код за вас.

Maarten Bodewes 19.04.2019 04:26

Понял, спасибо !!

Andy V 21.04.2019 04:19
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
1 741
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот модифицированный код, который решил мою проблему.

 public static string encryptionMethod(string Text, string key)
        {
            string encryptedText = string.Empty;
            try
            {
                byte[] clearBytes = StringToByteArray(Text); ;//Encoding.UTF8.GetBytes(Text);
                TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();
                des.KeySize = 128;
                des.Mode = CipherMode.CBC;
                des.Padding = PaddingMode.None;
                des.Key = StringToByteArray(key);   //Passing key in byte array
                //des.BlockSize = 64;
                byte[] ivBytes = new byte[8] { 0, 0, 0, 0, 0, 0, 0, 0 };
                des.IV = ivBytes;
                ICryptoTransform ct = des.CreateEncryptor();   //Interface with some result
                byte[] resultArray = ct.TransformFinalBlock(clearBytes, 0, clearBytes.Length);
                encryptedText = ByteArrayToHexString(resultArray);
            }
            catch (Exception exception)
            {
                return "";
            }
            return encryptedText;

        }


  public static byte[] StringToByteArray(string hex)
        {
            return Enumerable.Range(0, hex.Length)
                             .Where(x => x % 2 == 0)
                             .Select(x => Convert.ToByte(hex.Substring(x, 2), 16))
                             .ToArray();
        }

Другие вопросы по теме