2010-12-17 2 views
1

文字列を暗号化し、Androidアプリケーションで使用されるBase64に変換するJavaクラスがあります(このコードはこの例(ハイパーリンク内のスペースに注意してください)。http://stackoverflow.com/質問/ 2090765 /暗号化-compatable-間-アンドロイド-と-C)既に持っているObjective-CバージョンのJava EncryptionとBase 64エンコーディングが必要です

public class encryption { 
public static final String TAG = "smsfwd" 
private static Cipher aesCipher; 
private static SecretKey secretKey; 
private static IvParameterSpec ivParameterSpec; 

private static String CIPHER_TRANSFORMATION = "AES/CBC/PKCS5Padding"; 
private static String CIPHER_ALGORITHM = "AES"; 
//the secret key in HEX is 'secretkey' 
private static byte[] rawSecretKey = {Ox73, Ox65, Ox63, Ox72, Ox65, Ox74, Ox6B, Ox65, Ox79}; 

private static String MESSAGEDIGEST_ALGORITHM = "MD5"; 

public encryption(String passphrase) { 
    byte[] passwordKey = encodeDigest(passphrase); 

    try { 
     aesCipher = Cipher.getInstance(CIPHER_TRANSFORMATION); 
    } catch (NoSuchAlgorithmException e) { 
     Log.e(TAG, "No such algorithm " + CIPHER_ALGORITHM, e); 
    } catch (NoSuchPaddingException e) { 
     Log.e(TAG, "No such padding PKCS5", e); 
    } 

    secretKey = new SecretKeySpec(passwordKey, CIPHER_ALGORITHM); 
    ivParameterSpec = new IvParameterSpec(rawSecretKey); 
} 




//base 64 encryption 
public String encryptAsBase64(byte[] clearData) { 
    byte[] encryptedData = encrypt(clearData); 
    return base64.encodeBytes(encryptedData); 
} 




public byte[] encrypt(byte[] clearData) { 
    try { 
     aesCipher.init(Cipher.ENCRYPT_MODE, secretKey, ivParameterSpec); 
    } catch (InvalidKeyException e) { 
     Log.e(TAG, "Invalid key", e); 
     return null; 
    } catch (InvalidAlgorithmParameterException e) { 
     Log.e(TAG, "Invalid algorithm " + CIPHER_ALGORITHM, e); 
     return null; 
    } 

    byte[] encryptedData; 
    try { 
     encryptedData = aesCipher.doFinal(clearData); 
    } catch (IllegalBlockSizeException e) { 
     Log.e(TAG, "Illegal block size", e); 
     return null; 
    } catch (BadPaddingException e) { 
     Log.e(TAG, "Bad padding", e); 
     return null; 
    } 
    return encryptedData; 
} 

private byte[] encodeDigest(String text) { 
    MessageDigest digest; 
    try { 
     digest = MessageDigest.getInstance(MESSAGEDIGEST_ALGORITHM); 
     return digest.digest(text.getBytes()); 
    } catch (NoSuchAlgorithmException e) { 
     Log.e(TAG, "No such algorithm " + MESSAGEDIGEST_ALGORITHM, e); 
    } 

    return null; 
} 

}

とベース64の暗号化は(ハイパーリンクのスペースに注意してください)http://iharder.sourceforge.net/current/java/base64/

これは暗号化のためにC#/ .netサーバーに渡され、すべてがAndroid上でうまく動作するということです。問題は、これをObjective-Cに変換してiPhoneで使用するようになりました。

私は多くの研究を行っていると私は(ダウンロードしたzipからまっすぐに取らコード)その例を使用するときに最も近いhttp://dotmac.rationalmind.net/2009/02/aes-interoperability-between-net-and-iphone/

で来た答えはしかし、私は「パディングを得ていることは無効です。削除することはできません。エラーサーバー側。

私のサーバー側のコードは次のとおりです。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 

using System.Text; 
using System.Security.Cryptography; 

namespace test.Business 
{ 
    public class Crypto 
    { 
     private ICryptoTransform rijndaelDecryptor; 
     // Replace me with a 16-byte key, share between Java and C# 
     private static byte[] rawSecretKey = {Ox73, Ox65, Ox63, Ox72, Ox65, Ox74, Ox6B, Ox65, Ox79}; 

     public Crypto(string passphrase, bool encrypt) 
     { 
      byte[] passwordKey = encodeDigest(passphrase); 
      RijndaelManaged rijndael = new RijndaelManaged(); 
      if(encrypt) 
       rijndaelDecryptor = rijndael.CreateEncryptor(passwordKey, rawSecretKey); 
      else 
       rijndaelDecryptor = rijndael.CreateDecryptor(passwordKey, rawSecretKey); 
     } 

     public Crypto(string passphrase) 
     { 
      byte[] passwordKey = encodeDigest(passphrase); 
      RijndaelManaged rijndael = new RijndaelManaged(); 
      rijndaelDecryptor = rijndael.CreateDecryptor(passwordKey, rawSecretKey); 
     } 

     private string Decrypt(byte[] encryptedData) 
     { 
      byte[] newClearData; 

      try 
      { 
       newClearData = rijndaelDecryptor.TransformFinalBlock(encryptedData, 0, encryptedData.Length); 
      } 
      catch 
      { 
       throw; 
      } 
      return Encoding.ASCII.GetString(newClearData); 
     } 

     internal string DecyptString(string token) 
     { 
      //UTF8Encoding utf8 = new UTF8Encoding(); 
      return Decrypt(ASCIIEncoding.ASCII.GetBytes(token)); 
     } 

     internal string DecryptFromBase64(string encryptedBase64) 
     { 
      return Decrypt(Convert.FromBase64String(encryptedBase64)); 
     } 

     private byte[] encodeDigest(string text) 
     { 
      MD5CryptoServiceProvider x = new System.Security.Cryptography.MD5CryptoServiceProvider(); 
      byte[] data = Encoding.ASCII.GetBytes(text); 
      return x.ComputeHash(data); 
     } 


     //Encryption Code 
     public string EncryptAsBase64(string strData) 
     { 
      byte[] clearData = Encoding.ASCII.GetBytes(strData); 
      byte[] encryptedData = Encrypt(clearData); 
      return Convert.ToBase64String(encryptedData); 
     } 

     public byte[] Encrypt(byte[] clearData) 
     { 
      byte[] test1 = new byte[clearData.Length]; 
      try 
      {    
       test1 = rijndaelDecryptor.TransformFinalBlock(clearData, 0, clearData.Length);    
      } 
      catch 
      { 
       throw; 
      } 

      return test1; 
     } 
    } 
} 

任意のアイデア?事前にありがとうございます!

+0

私はインパルスではありませんなぜstackoverflowリンクにスペースを挿入するのでしょうか?あなたはその質問を参照しようとしているのですか、それをサンプルのURLとして使用しようとしていますか?私は何が欠けていますか? –

+0

私は新しい1つ以上のハイパーリンクを投稿することはできませんので、まだそれを含めるには、私はそれをハックしなければならなかった –

+0

スタックのオーバーフローは過去に私にとって大きな助けになりました。これは私の最初の投稿ですが、大量のコードを投稿することなく必要なものすべてもし私が何らかの規則を踏み越えているように思えば、私は完全に謝罪します。最初に投稿したときにハイパーリンクが原因で停止しましたが、理由はスパムを軽減するためでした。 –

答えて

0

あなたがここにBase64エンコーディング/デコーディングを処理するために、NSDataのカテゴリを取得することができます。

http://cocoawithlove.com/2009/06/base64-encoding-options-on-mac-and.html

あなたがここにAES暗号化を行うためのライブラリとのNSDataのカテゴリを見つけることができます。

http://iphonedevelopment.blogspot.com/2009/02/strong-encryption-for-cocoa-cocoa-touch.html

2つの間で、あなたは何をしているのか、おそらく少ないコードで複製することができます...

+0

ありがとう..私はテストして返信します! –

+0

遅れて申し訳ありません..基本64は完全に機能しましたが、まだ暗号化に問題があります。つまり、CCCryptorStatusの結果= CCCrypt(kCCEncrypt、//暗号化kCCAlgorithmAES128、// AES algo kCCOptionPKCS7Padding 、//パディング(const void *)[aSymmetricKey bytes]、// md5暗号化バイトキーkCCKeySizeAES256、// md5キーの長さiv、//イニシエーションベクトル[self bytes]、// [self length]内のデータ、 // [self mutableBytes]内のデータの長さ、//データ出力[self length]、//データの長さとnumBytesEncrypted); –

+0

と.netコードサーバー側はまだ復号化できません –

関連する問題