Строковое шифрование в C # и Objective c - PullRequest
6 голосов
/ 14 мая 2009

Я создаю приложение для iPhone, которое использует веб-сервисы c #. Мой веб-сервис c # берет данные о пользователе и проверяет мою базу данных и возвращает XML-файлы.

Итак, теперь проблема заключается в том, как зашифровать данные пользователя (имя пользователя и пароль по 10 символов в каждой) в задаче c и расшифровать в C #.

Я очень новичок в криптографии, какой метод самый лучший. можно будет зашифровать в Objective c и расшифровать в C #.

спасибо ..

Ответы [ 5 ]

7 голосов
/ 14 мая 2009

Спасибо за быстрые ответы. Я ценю вашу помощь. Я нашел блог, который объясняет мою проблему. Вот ссылка для этого.

http://dotmac.rationalmind.net/2009/02/aes-interoperability-between-net-and-iphone/

Я реализую это сейчас. Я скоро сообщу вам статус.

Большое спасибо ..
Удачного кодирования ..

5 голосов
/ 14 мая 2009

При условии, что вы шифруете эту информацию, чтобы защитить ее по сети, лучшим решением будет подключение по SSL. Это решит проблему без создания новых сложностей в коде. Обработка SSL обычно доступна как в .NET, так и в Cocoa.

Есть ли другая причина, по которой вы пытаетесь зашифровать эти данные?

1 голос
/ 14 мая 2009

Это из The CSharp Cookbook . Пример такой же прямой и существующий. Конечно, вам придется перенести зашифрованную часть на Objective C, но если вы используете один и тот же ключ, он должен генерировать тот же результат.

Вам необходимо использовать шифр Rijndael, который доступен здесь в коде, совместимом с ObjC

 public static void EncDecString()
        {
            string encryptedString = CryptoString.Encrypt("MyPassword");
            Console.WriteLine("encryptedString: " + encryptedString);
            // get the key and IV used so you can decrypt it later
            byte [] key = CryptoString.Key;
            byte [] IV = CryptoString.IV;

            CryptoString.Key = key;
            CryptoString.IV = IV;
            string decryptedString = CryptoString.Decrypt(encryptedString);
            Console.WriteLine("decryptedString: " + decryptedString);

        }

        public sealed class CryptoString
        {
            private CryptoString() {}

            private static byte[] savedKey = null;
            private static byte[] savedIV = null;

            public static byte[] Key
            {
                get { return savedKey; }
                set { savedKey = value; }
            }

            public static byte[] IV
            {
                get { return savedIV; }
                set { savedIV = value; }
            }

            private static void RdGenerateSecretKey(RijndaelManaged rdProvider)
            {
                if (savedKey == null)
                {
                    rdProvider.KeySize = 256;
                    rdProvider.GenerateKey();
                    savedKey = rdProvider.Key;
                }
            }

            private static void RdGenerateSecretInitVector(RijndaelManaged rdProvider)
            {
                if (savedIV == null)
                {
                    rdProvider.GenerateIV();
                    savedIV = rdProvider.IV;
                }
            }

            public static string Encrypt(string originalStr)
            {
                // Encode data string to be stored in memory
                byte[] originalStrAsBytes = Encoding.ASCII.GetBytes(originalStr);
                byte[] originalBytes = {};

                // Create MemoryStream to contain output
                MemoryStream memStream = new MemoryStream(originalStrAsBytes.Length);

                RijndaelManaged rijndael = new RijndaelManaged();

                // Generate and save secret key and init vector
                RdGenerateSecretKey(rijndael);
                RdGenerateSecretInitVector(rijndael);

                if (savedKey == null || savedIV == null)
                {
                    throw (new NullReferenceException(
                        "savedKey and savedIV must be non-null."));
                }

                // Create encryptor, and stream objects
                ICryptoTransform rdTransform = 
                    rijndael.CreateEncryptor((byte[])savedKey.Clone(),
                                            (byte[])savedIV.Clone());
                CryptoStream cryptoStream = new CryptoStream(memStream, rdTransform, 
                    CryptoStreamMode.Write);

                // Write encrypted data to the MemoryStream
                cryptoStream.Write(originalStrAsBytes, 0, originalStrAsBytes.Length);
                cryptoStream.FlushFinalBlock();
                originalBytes = memStream.ToArray();

                // Release all resources
                memStream.Close();
                cryptoStream.Close();
                rdTransform.Dispose();
                rijndael.Clear();

                // Convert encrypted string
                string encryptedStr = Convert.ToBase64String(originalBytes);
                return (encryptedStr);
            }

            public static string Decrypt(string encryptedStr)
            {
                // Unconvert encrypted string
                byte[] encryptedStrAsBytes = Convert.FromBase64String(encryptedStr);
                byte[] initialText = new Byte[encryptedStrAsBytes.Length];

                RijndaelManaged rijndael = new RijndaelManaged();
                MemoryStream memStream = new MemoryStream(encryptedStrAsBytes);

                if (savedKey == null || savedIV == null)
                {
                    throw (new NullReferenceException(
                        "savedKey and savedIV must be non-null."));
                }

                // Create decryptor, and stream objects
                ICryptoTransform rdTransform = 
                    rijndael.CreateDecryptor((byte[])savedKey.Clone(), 
                                            (byte[])savedIV.Clone());
                CryptoStream cryptoStream = new CryptoStream(memStream, rdTransform, 
                    CryptoStreamMode.Read);

                // Read in decrypted string as a byte[]
                cryptoStream.Read(initialText, 0, initialText.Length);

                // Release all resources
                memStream.Close();
                cryptoStream.Close();
                rdTransform.Dispose();
                rijndael.Clear();

                // Convert byte[] to string
                string decryptedStr = Encoding.ASCII.GetString(initialText);
                return (decryptedStr);
            }
        }

Я не могу говорить о реализации Objective C шифра Rijndael, но я использовал этот (C #) код в качестве основы для некоторой производственной работы, и он прекрасно работал.

0 голосов
/ 14 мая 2009

Я не знаю Цель C, но для расшифровки C #, посмотрите на различные CryptoServiceProviders в System.Security.Cryptography.

Вот один пример, который я написал с использованием TripleDES:

public class TripleDES
{
    private byte[] mbKey;
    private byte[] mbIV;
    private TripleDESCryptoServiceProvider tdProvider = new TripleDESCryptoServiceProvider();
    private UTF8Encoding UTEncode = new UTF8Encoding();

    // Key:  **YOUR KEY**
    // Project IV:  **YOUR IV**
    public TripleDES(string strKey, string strIV)
    {
        mbKey = UTEncode.GetBytes(strKey);
        mbIV = UTEncode.GetBytes(strIV);        
    }

    public TripleDES()
    {
        //
        // TODO: Add constructor logic here
        //
    }


    public string EncryptToString(string strInput)
    {           
        return Convert.ToBase64String(this.EncryptToBytes(strInput));           
    }

    public byte[] EncryptToBytes(string strInput)
    {
        byte[] bInput = UTEncode.GetBytes(strInput);
        byte[] bOutput = ProcessInput(bInput, tdProvider.CreateEncryptor(mbKey, mbIV));
        return bOutput;
    }

    public string DecryptToString(string strInput)
    {
        return UTEncode.GetString(DecryptToBytes(strInput));
    }

    public byte[] DecryptToBytes(string strInput)
    {
        byte[] bInput = Convert.FromBase64String(strInput);
        byte[] bOutput = ProcessInput(bInput, tdProvider.CreateDecryptor(mbKey, mbIV));
        return bOutput;
    }

    private byte[] ProcessInput(byte[] input, ICryptoTransform ctProcessor)
    {
        MemoryStream memStream = new MemoryStream();
        CryptoStream crpStream = new CryptoStream(memStream, ctProcessor, CryptoStreamMode.Write);

        crpStream.Write(input, 0, input.Length);
        crpStream.FlushFinalBlock();

        memStream.Position = 0;

        byte[] output;
        output = new byte[memStream.Length];

        memStream.Read(output, 0, output.Length);

        memStream.Close();
        crpStream.Close();

        return output;
    }
}

}

0 голосов
/ 14 мая 2009

Ваш вопрос очень расплывчатый, но вкратце; Да, это возможно. Вам нужно выяснить, каковы ожидания вашей криптографии (высокая безопасность или высокая скорость?), А затем взвесить преимущества различных алгоритмов и трудности их реализации в Objective-C и C #.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...