Androidと.Net暗号化.

9722 ワード

出典:Github:https://github.com/Pavel-Durov/CodeProject-Android-and-NET-Encryption直接:
  • Source Code (Android and .Net - 1.67 MB)

  • テーブルの内容は暗号化とは何ですか?非対称暗号化(公開鍵暗号化)Androidにおける対称暗号化暗号化処理プログラムクラスメソッドAndroidが実現される.Netの要約でAndroidメッセージを解読する前言外国人が見ることができる機密データは暗号化すべきだ.君の決定は敏感だ.それは任意の個人データで、あなたがネットワークを通じて送信した画像、あなたのGPS位置などです.機密データがプログラムの外部に露出し、インターネット上でローカルファイルシステムに送信または保存されると、攻撃を受けやすい.本明細書では、セキュリティに関するものではなく、単純な暗号化/復号化の実装について説明する.暗号化は何ですか?暗号化は、明文を暗号文に変換します.復号は逆です.これは、パスワードテキストから純粋なテキスト、読み取り可能なフォーマットへの変換です.暗号化アルゴリズムは対称と非対称の2種類に分けることができる.両者にはそれぞれの長所と短所がある.対称暗号化暗号化および復号化は、同じ共有鍵によって実行される.この鍵は、送信者と受信者の間で共有されます.メッセージを暗号化するために、送信者は共有鍵を使用する.受信者は、同じ鍵を使用してメールを復号する必要があります.対称アルゴリズムは非常に高速ですが、両方に一意の同じ鍵が必要です.これは、大量の鍵を管理する必要があるため、大規模なシステムで問題になる可能性があります.非対称暗号化(公開鍵暗号化)送信者と受信者は、異なる鍵を使用してメッセージを暗号化および復号化し、各鍵には一対の公開鍵と秘密鍵がある.送信者がメッセージを暗号化したい場合、彼は受信者の公開鍵を使用する.その後、受信者は、その秘密鍵を使用してメッセージを復号することができる.この方法は速度が遅いが,大規模なシステムでは鍵管理がより容易である.Androidでの対称暗号化この例では,AndroidのSDKクラスCipherを用いて暗号化/復号化を行う.Cipherクラスは、暗号化および復号化のための暗号化パスワードの実装へのアクセスを提供する.詳細:http://developer.android.com/reference/javax/crypto/Cipher.html,CryptoHandlerクラス我々の暗号は2つの鍵に依存し,1つ目は構造関数に文字列として渡される鍵であり,2つ目は16バイト長の元の鍵である.CryptoHandlerクラスをチェックしてみましょう.隠す、縮む、コピーする
    "CryptoHandlerClass">
    //CryptoHandler constructor
    public CryptoHandler(String passphrase)
    {
    //decodes passd phrase to encrypted byte[]
    byte[] passwordKey = encodeDigest(passphrase);
    try
    {
    //_aesCipher instantiation passing transformation parameter
    _aesCipher = Cipher.getInstance(CIPHER_TRANSFORMATION);
    }
    catch (NoSuchAlgorithmException e)
    { //Invalid algorithm in passed transformation parameter
    Log.e(TAG, "No such algorithm " + CIPHER_ALGORITHM, e);
    }
    catch (NoSuchPaddingException e)
    { //Invalid padding in passed transformation parameter
    Log.e(TAG, "No such padding PKCS5", e);
    }
    //Encodes the passed password phrase to a byte[]
    //that will be stored in class private member of SecretKey type
    _secretKey = new SecretKeySpec(passwordKey, CIPHER_ALGORITHM);
    //Creates a new IvParameterSpec instance with the bytes
    //from the specified buffer iv used as initialization vector.
    _ivParameterSpec = new IvParameterSpec(rawSecretKey);
    }

    私たちの暗号化プロセッサクラスでは、AES(高度な暗号化基準)を使用して暗号化されます.ここでもっと読むことができます.http://en.wikipedia.org/wiki/Advanced_Encryption_StandardAESインスタンス化は、次の行で行われます.非表示、Codeのコピー
    private static String CIPHER_TRANSFORMATION = "AES/CBC/PKCS5Padding";
    
    _aesCipher = Cipher.getInstance(CIPHER_TRANSFORMATION);

    例外が放出されない場合、インスタンス化されたCipherタイプのオブジェクトを返す暗号静的メソッドを呼び出します.「AES/CBC/PKCS 5 Padding」(伝達文字列変換パラメータ)、AES-暗号化アルゴリズム(高度な暗号化基準).フィードバックモードの名前(私たちの例ではパスワードブロックリンク).PKCS 5 Padding-シナリオの名前を入力します.CryptoHandlerクラスメソッド構造関数に加えて,CryptoHandlerクラスには3つの他のメソッドがある:非表示,Codeのコピー
    "CryptoHandlerClassMethods">
    public byte[] Encrypt(byte[] clearData)

    Encryptメソッドはパスワードを渡すことで_aesCipherは暗号化モードに設定されています.ENCRYPT_MODE定数からinit()メソッドへ.非表示、コードのコピー
    "CryptoHandlerClassMethods">
    public byte[] Decrypt(byte[] data)

    Decryptメソッドは同じことをしますが、パスワードを渡すわけではありません.ENCRYPT_MODEはpasswordを伝える.decrypt_mode. 復号化メソッドと暗号化メソッドは、それぞれに設定された暗号モード定数という唯一の違いでDoWork()メソッドを呼び出します.非表示、コードのコピー
    "CryptoHandlerClassMethods">
    public byte[] DoWork(byte[] data)

    呼び出し_aes . dofinal(data)メソッドで異常をキャプチャします.非表示、コードのコピー
    "CryptoHandlerClassMethods">
    private byte[] encodeDigest(String text)

    コンストラクション関数では、パスワードフレーズを1回符号化するために使用されます.プライベート元の鍵はバイト配列としてクラスに格納されます:非表示、Codeのコピー
    "CryptoHandlerClassMethods">
    private static byte[] _rawSecretKey =
    {
    0x12, 0x00, 0x22, 0x55, 0x33, 0x78, 0x25, 0x11,
    0x33, 0x45, 0x00, 0x00, 0x34, 0x00, 0x23, 0x28
    };

    このスプーンは送信者と受信者の間で共有する必要があります.私たちの例では、それらとして同時に参加するので、同じスプーンインスタンスを使用して暗号化と復号化を行います.Androidシステムの実装MainActivityレイアウトでは、2つのカラー領域が表示され、青は暗号化されたテキストを入力する領域、緑はテキストを表示する領域が表示されます.暗号化ボタンを押すと、暗号化されたデータは内部ファイルシステムに保存され(filesフォルダの下に表示されます)、緑のビューにgibberish(これは元の明文のパスワードテキストです).保存されたデータは、以前のデータを上書きし、ファイル内の既存のデータには添付されません.非表示、コードのコピー
    "AndroidImplementation">
    /**
    * Encrypts the String value that entered in the _tvMessage EditText View
    * and saves is to file on local file system
    * */
    private void EncryptMessage()
    {
    String message  = _tvMessage.getText().toString();
    if(message != null && message.length() > 0)
    {
    //performs text encryption
    byte[] bytes = _crypto.Encrypt(message.getBytes());
    //sets view value
    SetTextViewEncryptresult(bytes);
    //saves encrypted text to internal file
    _streamHandler.SaveTextFile
    (
    FileStreamHandler.ENCRYPTED_TXT_FILENAME,
    bytes
    );
    }     
    }

    *Androidデバイスの内部データの表示方法が分からない場合は、私の記事を参照してください.http://www.codeproject.com/Articles/825304/Accessing-internal-data-on-Android-device、すべてのファイル操作はhandlersパッケージのFileStreamHandlerによって実行されます.内部ファイルの読み取りと書き込みを担当する方法はいくつかあります.MainActivityレイアウトの「Decrypt」ボタンをクリックすると、保存したファイルからメッセージが読み込まれ、Toastメッセージとして表示されます.隠す、縮む、コピーする
    /**
     * Decrypt the message from saved local file content.
     * calls ShowToast() method
     * */
    
    private void DecryptMessage()
    
    {
           byte[] fileContent = _streamHandler
    
                  .ReadFromLocalFile(FileStreamHandler.ENCRYPTED_TXT_FILENAME);            
    
           if(fileContent != null && fileContent.length > 0)
           {
                  //preforms decryption of the fuile content
                  byte[] decrypted = _crypto.Decrypt(fileContent);
                 
                  //Creates new String instance of passed byte[] as UTF-8
                  String readableData = StringHandler.GetString(decrypted);
                  String encrypted = StringHandler.GetString(fileContent);
    
                  if(readableData != null && encrypted != null)
                  {
                         //showing toast
                         ShowToast
                         (     
                               getString(R.string.msg_decrypted) + readableData,
                               getString(R.string.msg_encrypted) + encrypted
    
                         );
                  }
           }
           else
           {      //if file not exist or file content is empty
                  ShowToast(":(", "!");
           }
    }

    解読ボタンをクリックすると、パスワードプログラム全体を完了したことを意味します.パスワードテキストとして符号化され、ローカルファイルに保存された純粋なテキストを入力し、通常の読み取り可能なテキストとして復号します.この例では、鍵とパスワードのフレーズをハードコーディング値としてjavaクラスに保存しますが、これは最適な解決策ではありません.逆方向エンジニアリングを使用すると簡単にチェックできるので、鍵を安全な場所に保存してください.はい.NetでAndroidメッセージを解読するには、私たちがどのように解読しているかを見てみましょう.Net上でc#言語を使用してAndroidデバイス上で暗号化されたパスワードテキスト.これは、標準暗号化を使用しているため、他のプラットフォームで行うこともできます.Androidデバイスに保存したファイルをマシンに引き寄せ、Visual Studioの基本コンソールアプリケーションにインポートします.はい、ファイルを作成しadbを使用して引き出しましょう.手順:青い領域に情報を入力し、暗号化ボタンを押します.私たちの情報は暗号化されてハードディスクに保存されました.,,2.次に、grandファイル権限とpullコマンドを取得するために、いくつかのコマンドを実行します.ファイル、デバイスを取得します.*再度、不明な場合は、私の記事adbツールとAndroid内部ファイル権限を参照してください.http://www.codeproject.com/Articles/825304/Accessing-internal-data-on-Android-device私のすべてのadbコマンドが正常に実行されたため、私は今私のファイルを私のダウンロードディレクトリで閲覧することができます:今私たちはそれをインポートします.Netコンソールアプリケーションです.*テキストをコピーしないでください.ここではバイナリデータと文字列としてコピーして値を変えることができます.ファイルをそのままコピーします.私たちのc#コンソールアプリケーションでは、Androidとほぼ同じCryptoHandlerクラスを得ました.注意、あります.Netでは,復号化と暗号化機構として2つのICryptoTransformインスタンスを用いた.これはほぼ同じです.Androidでは定数を使っていますが、ここではrijndaelmanageを使っています.Net類の工場方法.、すべてが正常であれば、c#プログラムを実行すると、Androidデバイスに入力された同じ情報が表示されます.Androidとをまとめます.Netアプリケーションでは、簡単なメッセージを暗号化および復号化しています.これはクライアント-サーバ通信の一部(Androidはクライアントとして、.netはサーバとして)、テキストまたは暗号化したい他のバイナリファイルを使用することができ、ネットワーク上のデータ変換を処理する必要がある以外は、ここでは説明していません.特に大きなバイナリファイルを処理するときは、手元のすべてのものを実行したり暗号化したりしないでください.これにより、特に興味のないデータを保護する場合、アプリケーションの効率が低下する可能性があります.転載先:http://www.diyabc.com/frontweb/news30752.html