web-dev-qa-db-ja.com

暗号化アルゴリズムの種類Androidはサポートしますが、どちらがより良いでしょうか?

this のドキュメントを読み、文字列を暗号化および復号化するためのアルゴを書きました。しかし、アルゴリズムの種類がいくつあるかわかりませんAndroidがサポートしています。

[〜#〜] des [〜#〜] および [〜#〜] aes [〜#〜] (wikiのドキュメントとして)に関しては、両方に多くのタイプがあります。どっちがいいの?

6
Pankaj Kumar

DESおよびAESの場合:AESを使用します。

DESおよびAESはブロック暗号です。これらは「ブロック」によってデータを暗号化します。ブロックは64ビット(DESの場合)または128ビット(AESの場合)の量です。単一のブロックではない「メッセージ」を暗号化するには、「チェーンモード」と「パディング」を使用する必要があります。チェーンモードは、データをブロックに分割して再度組み立てる方法を定義し、パディングは追加バイトで構成されますメッセージの最後に追加され、チェーンモードが使用する分割に合計の長さが適切になるようにします。パディングは、復号化時に明確に削除できるようなものでなければなりません。

「標準」の連鎖モードとパディングは、それぞれ [〜#〜] cbc [〜#〜] および PKCS#5 と呼ばれます。 PKCS#5パディングは、1からnバイトを追加します。ここで、nはブロック長です(したがって、DESの場合は8、DESの場合は16 AES)、パディングされた長さの合計はnの倍数になります。 CBCはブロックをリンクし、Initialization Vector(IV)を必要とします。これは、nランダムバイトのシーケンスである必要があります。 IVバイトが暗号学的に強力な乱数ジェネレータ(つまりJava.security.SecureRandom)で生成され、メッセージごとに新しいIVを生成することが非常に重要です。 IVは、暗号化されたメッセージとともに(暗号化されずに)送信する必要もあります。これは、受信者がデータを復号化するために必要になるためです。

ブロック暗号自体:DESには、「元の」DESと「Triple-DES」の2つのフレーバーがあり、「3DES」または単に「DES」とも呼ばれます。元のDESは64ビットのキーを使用し、そのうち8ビットは無視されるため、有効なキーの長さは56ビットであり、セキュリティ上短すぎます。 3DESは192ビットのキーを使用し(24ビットは無視されるため、168ビットの有効なキーの長さ)、堅牢であると考えられています。また、DESの3倍の速度ですが、DESはすでにそれほど高速ではありません。

AESはDESを置き換えるように設計されており、一般的にあらゆる点で優れていると考えられています。 AESには、AES-128、AES-192、AES-256と呼ばれる3つのフレーバーがあり、キーの長さ(それぞれ128、192、256ビット)が異なります。 128ビットはセキュリティに十分であり、長いキーはわずかな計算オーバーヘッドを意味するため、128ビットのキーが推奨されます。

Java仮想マシンでサポートされているアルゴリズムのリストを取得するには、次のことを試してください。

import Java.security.Provider; 
import Java.security.Security;
import Java.util.Map;
import Java.util.TreeSet;

public class ListAlgo {

    public static void main(String[] args)
    {   
        TreeSet<String> algos = new TreeSet<String>();
        for (Provider p : Security.getProviders()) {
            for (Map.Entry<Object, Object> e : p.entrySet()) {
                String s = e.getKey().toString()
                    + " -> " + e.getValue().toString();
                if (s.startsWith("Alg.Alias.")) {
                    s = s.substring(10);
                }               
                algos.add(s);   
            }           
        }       
        for (String a : algos) {
            System.out.println(a);
        }       
    }   
}

(これは「通常の」Javaの場合です。Androidの場合、最終出力に関して少し変更する必要があるでしょう。)

暗号化アルゴリズムは、文字列が「Cipher.」で始まるアルゴリズムになります。とにかく、最も広くサポートされているアルゴリズムの組み合わせが必要な場合は、128ビットキーを使用した "AES/CBC/PKCS5Padding"になります。Androidベースの特定の暗号がサポートされている場合は、その暗号もサポートされます。

暗号化が保証されている状況にいる場合は、整合性チェックも必要になる可能性があります。 javax.crypto.Macを参照してください。 MACの場合、疑わしい場合は、SHA-256でHMACを使用します(SHA-256がサポートされていない場合は、SHA-1でHMACにフォールバックします)。

8
Thomas Pornin

これらの設定はAndroid 1.5:

SYMMETRIC_ALGORITHM = "AES/CBC/PKCS5Padding";
SECRET_KEY_ALGORITHM = "AES";
SECRET_KEY_SIZE_BYTES = 16; // 128 bit
MAC_ALGORITHM = "HmacSHA1";
MAC_OUTPUT_SIZE_BYTES = 20; // 160 bit SHA-1
PRIVATE_PUBLIC_ALGORITHM = "RSA/NONE/PKCS1Padding";

私はBouncyCastleがAndroidであることを当てにして、BouncyCastleをサーバー側のプロジェクトに入れました-単なるjar(bcprov-jdk16-145.jar)。 Eclipseプラグインがないため、Eclipseプロジェクトが使用していたJREのlib/extディレクトリにそれをドロップする必要がありました。

ただし、 this one などの投稿は、必要なアルゴリズムを備えていないデバイスにまだ遭遇する可能性があることを疑わせます。

3
cdhabecker