Аналог OpenSSL DES криптографии - C#

Узнай цену своей работы

Формулировка задачи:

Добрый день, уже 4-й день не могу расшифровать в C# данные полученные в ходе шифрования на С++ с использованием OpenSSL собственно код реализации на С++
void* const keySchedule;
void DesPasswordCipher::init(const char *password) {
    unsigned char key64bit[8];
    unsigned char *key ;
    int i;
 
    memset(key64bit, 0, sizeof(key64bit));
 
    key = key64bit ;
    for(i = 0; *password && i < 40; i++) {
        key[i % 8] ^= *password ;
        password++ ;
    }
 
    DES_set_odd_parity(&key64bit);
    DES_set_key_checked(&key64bit, (DES_key_schedule*)keySchedule);
 
}
 
bool DesPasswordCipher::encrypt(void *buf, int len) {
    len = len & 0xfffffff8;
    unsigned char desBlock[8];
    unsigned char *ptr = (unsigned char *)buf;
    for (; len > 0; len -= 8, ptr += 8) {                // encrypt/decrypt 1 buffer-full 8-byte blocks
        memcpy(desBlock, ptr, 8);
        DES_ecb_encrypt(&desBlock, &desBlock, (DES_key_schedule*)keySchedule, DES_ENCRYPT);
        memcpy(ptr, desBlock, 8);
    }
    return true;
}
 
bool DesPasswordCipher::decrypt(void *buf, int len) {
    len = len & 0xfffffff8;
    unsigned char desBlock[8];
    unsigned char *ptr = (unsigned char *)buf;
    for (; len > 0; len -= 8, ptr += 8) {                // encrypt/decrypt 1 buffer-full 8-byte blocks
        memcpy(desBlock, ptr, 8);
        DES_ecb_encrypt(&desBlock, &desBlock, (DES_key_schedule*)keySchedule, DES_DECRYPT);
        memcpy(ptr, desBlock, 8);
    }
    return true;
}
и код C#, дело в том что за эти 4 дня я перепробовал варианты и с md5 и с sha1 и обычным массивом байтов, и предоставляю код на котором остановился,так ничего и не помогло, читал и о паддингах, что стандартный класс криптографии C# не поддерживает PKCS5, а в OpenSSL только он и юзаеться,о том что надо юзать UTF8, перепробовал все
public static byte[] Decrypt(byte[] toDecryptArray,string password)
        {
            byte[] _Key = null;
            if (password == string.Empty)
               return;
            if (password.Length > 8)
                _Key = Encoding.ASCII.GetBytes(password.Substring(0, 8));
            else
                _Key = Encoding.ASCII.GetBytes(password.PadRight(8, '\0'));
            TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();
            des.Mode = CipherMode.ECB;
            des.Padding = PaddingMode.Zeros;
            MD5 md = MD5CryptoServiceProvider.Create();
 
            byte[] key = md.ComputeHash(_Key);
            byte[] IV = md.ComputeHash(_Key);
            ICryptoTransform transformer = des.CreateDecryptor(key, IV);
            byte[] s = toDecryptArray;
            byte[] t = transformer.TransformFinalBlock(s, 0, s.Length);
 
            return t;
        }
Подключить OpenSSL напрямую - выход, но возится еще с 2/3 библиотеками сильно не хотелось бы, буду благодарен за любую помощь кроме "пиши все на 1 языке" или подобных советов

Решение задачи: «Аналог OpenSSL DES криптографии»

textual
Листинг программы
public static byte[] Decrypt(byte[] data)
        {
            int len = (int)(data.Length & 0xfffffff8);
            Array.Resize<byte>(ref data, len);
 
 
            DES des = DES.Create();
            des.Mode = CipherMode.ECB;
            des.Padding = PaddingMode.Zeros;
            ICryptoTransform transformer = des.CreateDecryptor(_Key, null);
            byte[] t = transformer.TransformFinalBlock(data, 0, data.Length);
 
            return t;
        }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.143 из 5