2008-11-18 4 views
3

Кто-нибудь мог использовать SSCrypto Framework для Cocoa для шифрования текста и затем расшифровать его в C# /. NET? Или может кто-нибудь предложить некоторые рекомендации?SSCrypto/OpenSSL to C# Crypto

Я уверен, что моя проблема связана с правильной настройкой криптографических настроек, но я далек от свободного использования в Cocoa, поэтому я не могу сказать, какие настройки используются в библиотеке. Однако моя попытка дешифровки это кажется как md5 хеширования, режим CBC, заполнение нулями, и я понятия не имею, если IV установлен или нет ...

Мой C# код выглядит следующим образом:

 public static string Decrypt(string toDecrypt, string key, bool useHashing) 
    { 
     byte[] keyArray; 
     byte[] toEncryptArray = Convert.FromBase64String(toDecrypt); 

     if(useHashing) 
     { 
      MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider(); 
      keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key)); 
      hashmd5.Clear(); 
     } 
     else 
      keyArray = UTF8Encoding.UTF8.GetBytes(key); 

     TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider(); 
     tdes.Key = keyArray; 
     tdes.Mode = CipherMode.CBC; 
     tdes.Padding = PaddingMode.Zeros; 

     ICryptoTransform cTransform = tdes.CreateDecryptor(); 
     byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length); 

     tdes.Clear(); 

     return UTF8Encoding.UTF8.GetString(resultArray); 
    } 

Когда я бегу шифрование на стороне какао я получаю зашифрованный текст:

UMldOZh8sBnHAbfN6E/9KfS1VyWAa7RN

, но это не будет расшифровывать на C# стороне с тем же ключом.

Любая помощь приветствуется, спасибо.

+0

Я действительно не знаю .NET, что хорошо, можете ли вы опубликовать свой код какао? Это может облегчить людям, хорошо разбирающимся в том или ином, чтобы помочь вам ... – 2008-11-19 00:14:56

ответ

1

Пару вещей, чтобы следить за:

1- Убедитесь, что вы интерпретации ключа и данных строк правильно. Например, это ключ, закодированный в ASCII вместо UTF8? Возможно ли это в формате binhex?

2- Вы не инициализируете IV (вектор инициализации) перед расшифровкой. Он должен соответствовать IV, который вы используете, для шифрования на стороне Cocoa.

0

IIRC, OpenSSL использует то, что MS называет PKCS7 дополнением (хотя OpenSSL относится к нему как PKCS5, и мне не хватает стандартного wonk, чтобы заботиться о том, почему).

0

Один из классических вопросов при перемещении данных взад и вперед с Mac на ПК - это порядок байтов. Вы не сказали, что платформа исполнения для кода Cocoa, но это то, что нужно посмотреть, особенно если это PowerPC Mac.

0

Там может быть что-то делать с байтов,

Try позвонить Array.Reverse перед расшифровкой.

var reversedArr = Array.Reverse(toEncrytArray) 
byte[] resultArray = cTransform.TransformFinalBlock(reversedArr, 0, reversedArr.Length); 
+0

Зачем вам делать это только на принимающей стороне? Отправная сторона (Mac) также может быть машиной Intel. Правильное место для обмена байтами - это либо на Mac (используйте малоконтинентальный провод), либо и то, и другое (используйте по умолчанию байтовый порядок байтов). – 2009-01-25 09:24:15

0

Вы также должны опубликовать код Какао, чтобы дать нам шанс найти вашу проблему.

Но есть некоторые намеки, скрытые в то, что вы выложили:

дешифрование PyPqLI/d18Q = (base64) с ключом и IV дает "97737D09E48B0202" (HEX). Это выглядит как открытый текст «97737D09E48B» с дополнением PKCS7. Поэтому я бы начал с изменения кода .NET, чтобы использовать PaddingMode.PKCS7 и внимательно посмотреть, где вы передаете открытый текст в код Cocoa.

2

Вы можете использовать OpenSSL непосредственно в C# с помощью обертки OpenSSL.NET!