2016-12-27 7 views
0

私はこの件についてほぼすべてのトピックを検索しましたが、何が間違っているのかまだ分かりません。私はあなたのアンドロイドアプリに3 EditTextを作成しました: EditText暗号化と復号化のために鍵/パスワードを挿入する場所です。 EditText2暗号化されたテキストが表示されます。 EditText3解読されたテキストが表示されます。暗号化/復号化のためのアンドロイドスタジオのブローフィッシュ

まだ初期のテストであるため、私はメッセージや文字列をアプリで変数としてCryptに入れました。

問題は、暗号化されたフクロウのアルゴリズムのようなものを与えるので、問題はありません(2 ==で終わるので、正しく動作していると思います)。私はまた、解読の前に文字列を解読しようとしました。あるいは、良い結果を出さずに暗号化から生のbyte[]を使用しました。復号化は、元の文字列テキストを戻すのではなく、暗号化されたテキストよりも大きなものを与えます。私はブローフィッシュのモードを好みませんので、Blowfish/CFB/NoPaddingとして簡単に始めました。

str_key,str2およびstr3は現在公表されている。 str2EditText2フィールドのテキストを設定し、str3EditText3フィールドのテキストを設定します。出力の 例:ここでは

public void encrypt(){ 
    //encrypt 
    EditText mEdit = (EditText)findViewById(R.id.editText); 
    str_key = (String) mEdit.getText().toString(); 

    int iterationCount = 1000; 
    int keyLength = 256; 
    int saltLength = keyLength/8; 

    SecureRandom random = new SecureRandom(); 
    byte[] salt = new byte[saltLength]; 
    random.nextBytes(salt); 
    KeySpec keySpec = new PBEKeySpec(str_key.toCharArray(), salt, 
      iterationCount, keyLength); 
    SecretKeyFactory keyFactory = null; 
    try { 
     keyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1"); 
    } catch (NoSuchAlgorithmException e) { 
     e.printStackTrace(); 
    } 
    byte[] keyBytes = new byte[0]; 
    try { 
     keyBytes = keyFactory.generateSecret(keySpec).getEncoded(); 
    } catch (InvalidKeySpecException e) { 
     e.printStackTrace(); 
    } 
    SecretKey key = new SecretKeySpec(keyBytes, "Blowfish"); 

    Cipher cipher = null; 
    try { 
     cipher = Cipher.getInstance("Blowfish/CBC/PKCS5Padding"); 
    } catch (NoSuchAlgorithmException | NoSuchPaddingException e) { 
     e.printStackTrace(); 
    } 
    if (cipher == null || key == null) { 
     //throw new Exception("Invalid key or cypher"); 
     str2="error"; 
    } 
    else { 
     byte[] iv = new byte[cipher.getBlockSize()]; 
     random.nextBytes(iv); 
     IvParameterSpec ivParams = new IvParameterSpec(iv); 
     try { 
      cipher.init(Cipher.ENCRYPT_MODE, key,ivParams); 
     } catch (InvalidKeyException | InvalidAlgorithmParameterException e) { 
      e.printStackTrace(); 
     } 


     try { 
      raw = cipher.doFinal(message.getBytes("UTF-8")); 
     } catch (IllegalBlockSizeException | BadPaddingException | UnsupportedEncodingException e) { 
      e.printStackTrace(); 
     } 
     str2 = Base64.encodeToString(raw,Base64.DEFAULT); 

    } 


} 

は、復号化機能である:ここで Example of output generated from the app

はコードだ

public void decrypt(){ 
      int iterationCount = 1000; 
      int keyLength = 256; 
      int saltLength = keyLength/8; 
      SecureRandom random = new SecureRandom(); 
      byte[] salt = new byte[saltLength]; 
      random.nextBytes(salt); 
      KeySpec keySpec = new PBEKeySpec(str_key.toCharArray(), salt, iterationCount, keyLength); 
      SecretKeyFactory keyFactory = null; 
      try { 
       keyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1"); 
       } catch (NoSuchAlgorithmException e) { 
       e.printStackTrace(); 
       } 
       byte[] keyBytes = new byte[0]; 
       try { 
       keyBytes = keyFactory.generateSecret(keySpec).getEncoded(); 
       } catch (InvalidKeySpecException e) { 
        e.printStackTrace(); 
       } 
       SecretKey key = new SecretKeySpec(keyBytes, "Blowfish"); 



    Cipher cipher2 = null; 
    try { 
     cipher2 = Cipher.getInstance("Blowfish/CBC/PKCS5Padding"); 
    } catch (NoSuchAlgorithmException | NoSuchPaddingException e) { 
     e.printStackTrace(); 
    } 
    iv = new byte[cipher2.getBlockSize()]; 
    random.nextBytes(iv); 
    IvParameterSpec ivSpec = new IvParameterSpec(iv); 
    try { 
     cipher2.init(Cipher.DECRYPT_MODE, key, ivSpec); 
    } catch (InvalidKeyException | InvalidAlgorithmParameterException e) { 
     e.printStackTrace(); 
    } 
    byte[] decryptedBytes = null; 
    byte[] app= Base64.decode(str2,Base64.DEFAULT); 

    try { 
     decryptedBytes = cipher2.doFinal(app); 
    } catch (IllegalBlockSizeException | BadPaddingException e) { 
     e.printStackTrace(); 
    } 


    str3 = Base64.encodeToString(decryptedBytes,Base64.DEFAULT); 
} 

答えて

2

あなたがBASE64に暗号化された結果を符号化するが、その後、あなたは、あなたの暗号化を解除するときそのbase64のプレーンバイトを取得します。最初に暗号文の実際のバイト配列を取得し、それを解読するためにbase64を最初にデコードする必要があります。

また、UTF8バイト配列から直接キーを派生させています。これは非常に難しい方法です。代わりにKDFを使用する必要があります。 PBKDF2はここで最も一般的に使用されます。

IVを生成する方法(全く生成しない)は非常に貧弱です。ランダムに生成され、暗号文の前に付加されるべきです。それは秘密である必要はなく、ただ予測できません。

最後に、HMACをまったく使用しないため、誰でも暗号文を変更でき、あなたはわからないでしょう。

+0

ありがとうございました。また、base64デコードを使用しようとしました。また、元の "pre"エンコードされたバイト配列を使用して、結果を得ることなく解読しました。私は何をすべきかの例を挙げることができますか? KDF.PBKDF2でUTF-8を変更するだけでいいですか? 私はまたIVを次のように生成しようとしました:IvParameterSpec ivSpec =新しいIvParameterSpec(keySpec.getEncoded()); //解読関数の中で; 実行時エラーが発生します。これについても私に例を教えていただけますか? – Micene

+0

HMACを使用して暗号テキストを変更しないようにするにはどうすればよいですか? – Micene

+1

これはあなたがgoogleの検索できるすべてのものです、私はちょうどあなたのためのコードを書く場合は何も学ぶことはありません!あなたがbase64をデコードしてみてもそれを試してみたら、ちょうど間違ったことをしただけです。元の投稿のコードを試したものに編集してみてください。私はそこからお手伝いします。 –