Аналог OpenSSL DES криптографии - C#
Формулировка задачи:
Добрый день, уже 4-й день не могу расшифровать в C# данные полученные в ходе шифрования на С++ с использованием OpenSSL
собственно код реализации на С++
и код C#, дело в том что за эти 4 дня я перепробовал варианты и с md5 и с sha1 и обычным массивом байтов, и предоставляю код на котором остановился,так ничего и не помогло, читал и о паддингах, что стандартный класс криптографии C# не поддерживает PKCS5, а в OpenSSL только он и юзаеться,о том что надо юзать UTF8, перепробовал все
Подключить OpenSSL напрямую - выход, но возится еще с 2/3 библиотеками сильно не хотелось бы, буду благодарен за любую помощь кроме "пиши все на 1 языке" или подобных советов
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; }
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 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; }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д