2009-05-14 13 views
6

मैं एक आईफोन ऐप बना रहा हूं जो सी # वेब सेवाओं का उपयोग करता है। मेरी सी # वेब सेवाएं उपयोगकर्ता विवरण लेती हैं और मेरे डीबी के खिलाफ मान्य होती हैं और एक्सएमएल फाइलें लौटाती हैं।सी # में स्ट्रिंग एन्क्रिप्शन और उद्देश्य सी

तो अब समस्या यह है कि उद्देश्य विवरण में उपयोगकर्ता विवरण (उपयोगकर्ता नाम और पासवर्ड प्रत्येक 10chars हैं) को एन्क्रिप्ट करना है और सी # में डिक्रिप्ट करना है।

मैं क्रिप्टोग्राफी के लिए बहुत नया हूं, कौन सी विधि सबसे अच्छी है। उद्देश्य सी में एन्क्रिप्ट करना और सी # में डिक्रिप्ट करना संभव होगा।

धन्यवाद ..

उत्तर

7

तेजी से उत्तर के लिए धन्यवाद:

यहाँ एक उदाहरण मैं TripleDES का उपयोग कर लिखा है। तुम्हारी सहायता सराहनीय है। मुझे एक ब्लॉग मिला जो मेरी समस्या बताता है। इसके लिए लिंक यहाँ है।

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

मैं अब लागू कर रहा हूँ। मैं आपको जल्द ही स्थिति बता दूंगा।

धन्यवाद एक बहुत ..
मुबारक कोडिंग ..

+0

इसकी कामकाजी ठीक है ... – nbojja

0

आपका प्रश्न बहुत अस्पष्ट है, लेकिन संक्षेप में; हाँ यह संभव है। आपको यह पता लगाने की आवश्यकता होगी कि आपकी क्रिप्टोग्राफी की अपेक्षाएं क्या हैं (उच्च सुरक्षा या उच्च गति?) और फिर उद्देश्य-सी और सी # में विभिन्न अलगाव और उनकी कार्यान्वयन कठिनाइयों के लाभों का वजन करते हैं।

5

इस धारणा पर कि आप नेटवर्क पर इसे सुरक्षित रखने के लिए इस जानकारी को एन्क्रिप्ट कर रहे हैं, तो सबसे अच्छा समाधान SSL से कनेक्ट करना है। यह कोड में नई जटिलताओं को बनाए किए बिना समस्या का समाधान करेगा। एसएसएल हैंडलिंग आम तौर पर .NET और कोको दोनों में उपलब्ध है।

क्या कोई अन्य कारण है कि आप इस डेटा को एन्क्रिप्ट करने की कोशिश कर रहे हैं?

+2

एसएसएल (वास्तव में, TLS) निश्चित रूप से जाने के लिए रास्ता है। जो लोग क्रिप्टोग्राफी के लिए बिल्कुल नए हैं, उन्हें उत्पादन कोड में एन्क्रिप्शन सिस्टम को लागू करने की कोशिश नहीं करनी चाहिए। इसे गलत करना और सुरक्षा की झूठी भावना के साथ समाप्त करना बहुत आसान है। टीएलएस वेब ट्रैफिक को एन्क्रिप्ट करने के लिए एक मानक, क्रॉस-प्लेटफ़ॉर्म तरीका है, और ओएस एक्स और .NET कार्यान्वयन अत्यधिक सक्षम लोगों द्वारा सत्यापित किए जाने की संभावना है। – user57368

1

निम्नलिखित The CSharp Cookbook से है। यह एक उदाहरण के रूप में सीधे उदाहरण के रूप में है। आपको निश्चित रूप से उद्देश्य सी पर एन्क्रिप्ट भाग को पोर्ट करना होगा, लेकिन जब तक आप एक ही कुंजी का उपयोग करते हैं, तो उसे एक ही परिणाम उत्पन्न करना चाहिए।

आप कुछ उत्पादन के आधार के लिए क्रिप्ट सिफर जो उपलब्ध here in ObjC compatible code

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); 
      } 
     } 

मैं क्रिप्ट सिफर का उद्देश्य सी कार्यान्वयन के बारे में नहीं बोल सकता है उपयोग करने की आवश्यकता है, लेकिन मैं इस (सी #) का इस्तेमाल किया है कोड काम और यह अद्भुत काम किया है।

0

मुझे उद्देश्य सी नहीं पता है, लेकिन सी # डिक्रिप्शन के लिए, System.Security.Cryptography में विभिन्न CryptoServiceProviders में देखें।

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; 
    } 
} 

}

संबंधित मुद्दे