Аналог 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;
}