2009-05-14 22 views
6

私はc#Webサービスを使用するiPhoneアプリケーションを構築しています。私のc#Webサービスは、ユーザーの詳細を取得し、私のDBに対して検証し、xmlファイルを返します。C#とObjectiveの文字列暗号化

だから、問題は、ユーザーの詳細(ユーザー名とパスワードはそれぞれ10カールです)を目的のcで暗号化し、C#で復号化する方法です。

私は暗号方式が非常に新しいので、どの方法が最適です。 Objective cで暗号化し、C#で復号化することが可能になります。

ありがとう..

答えて

7

ありがとう:

は、ここで私はトリプルDESを使って書いた一例です。私はあなたの助けに感謝します。私は自分の問題を説明するブログを見つけました。ここにそのリンクがあります。

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

私は今、それを実装しています。私はあなたにすぐにステータスを知らせます。

おかげでコーディングハッピーたくさん..
..

+0

そのうまくいっている... – nbojja

0

あなたの質問は非常に曖昧ですが、短いです。はい、可能です。あなたの暗号の期待が何であるか(高セキュリティか高速か)を把握し、Objective-CとC#でさまざまな威力と実装の難しさのメリットを検討する必要があります。

5

この情報をネットワーク経由で暗号化することを前提に、SSLを介して接続するのが最善の方法です。これにより、コードに新しい複雑さが生じることなく、問題が解決されます。 SSL処理は、一般に.NETとCocoaの両方で利用可能です。

このデータを暗号化しようとする別の理由はありますか?

+2

SSLは(実際には、TLSは)間違いなく行く方法です。暗号を完全に新しくした人は、実動コードで暗号化システムを実装しようとすべきではありません。間違ったことをして、間違った安心感で終わらせるのは簡単ではありません。 TLSは、Webトラフィックを暗号化するための標準的なクロスプラットフォームの方法であり、OS Xおよび.NETの実装は、有能な人によって検証されている可能性があります。 – user57368

1

以下はThe CSharp Cookbookのものです。これはまっすぐなものであり、存在する例である。もちろん、暗号化部分をObjective Cに移植する必要がありますが、同じKeyを使用する限り、同じ結果が生成されるはずです。

あなたは私がラインダール暗号のObjective Cの実装について話すことはできませんが、私はいくつかの生産の基礎のために、この(C#)コードを使用している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); 
      } 
     } 

利用できるのRijndael暗号を使用する必要がありますすごくうまくいっています。

0

Objective Cは分かりませんが、C#の解読では、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; 
    } 
} 

}

関連する問題