2017-02-14 3 views
1

のPKS5パディングと3DESedeを使用した場合3DESede)、24バイトのサイズのキー配列として提供されています。したがって、私はJava Crypto APIを使用します。これはかなりうまくいきますが、私が8文字の文字列を暗号化すると、16バイトの暗号テキストが得られます。これは、3DESが64ビット(8バイト)のチャンクで動作するため起こりません。 PKCS5 paddingも同様です。これは64ビットのチャンクでも動作するためです。だから私の質問は、この問題の原因は何ですか? DESで使用される場合間違った暗号文の長さは別名(Iは、3つの独立したキーで<em>暗号化されたコードブック</em>(ECB)モードを使用して<a href="https://en.wikipedia.org/wiki/Triple_DES" rel="nofollow noreferrer">Triple DES</a>内の文字列を暗号化するために、私のアンドロイドアプリケーションに次のコードを使用していますjavax.cryptoで

private static byte[] encryptText(String plaintext, byte[] keyBytes) throws Exception { 
    // Get plaintext as ASCII byte array 
    final byte[] plainBytes; 
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) { 
     plainBytes = plaintext.getBytes(StandardCharsets.US_ASCII); 
    } else { 
     plainBytes = plaintext.getBytes("US-ASCII"); 
    } 

    // Generate triple DES key from byte array 
    final DESedeKeySpec keySpec = new DESedeKeySpec(keyBytes); 
    SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede"); 
    SecretKey key = keyFactory.generateSecret(keySpec); 

    // Setup the cipher 
    final Cipher c3des = Cipher.getInstance("DESede/ECB/PKCS5Padding"); 
    c3des.init(Cipher.ENCRYPT_MODE, key); 

    // Return ciphertext 
    return c3des.doFinal(plainBytes); 
} 
+1

1.新しいコードで3DESを使用しないことをお勧めします.AESは現在の対称暗号化標準です。 2. ECBモードを使用しないでください。安全ではありません。[ECBモード](https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Electronic_Codebook_.28ECB.29)を参照して、ペンギンまでスクロールしてください。 乱数IVを使用してCBCモードを使用し、暗号化されたデータにIVを使用して復号化に使用するだけで、秘密にする必要はありません。 3.暗号化は簡単で、安全な使用を困難にします。 – zaph

答えて

1

PKCS5Paddingはパディングの1~8バイトを追加します。 8バイトを暗号化すると、偶数ブロックに到達するために8バイトのパディングが追加されます。

Cipher.getInstance("DES/ECB/NoPadding")を使用し、8バイトを暗号化した場合、8バイトの暗号テキストが得られます。

1

PKCS#5パディングを使用する場合は、常にパディングを追加する必要があります。そうでない場合は、復号化時にパディングが追加されたかどうかを判断できません。したがって、入力データがブロックサイズの正確な倍数であっても、パディングが追加されなければならず、それは8バイトになります。

PKCS paddingを見る

原データがNバイトの整数倍である場合、値Nを有するバイトの余分なブロックが追加されます。これは、解読アルゴリズムが、最後のブロックの最後のバイトが、追加されたパディングバイトの数または平文メッセージの一部を示すパッドバイトであるかどうかを確実に判定できるようにするために必要である。平文の最後のバイトが01であるNバイトの整数倍である平文メッセージを考える。追加の情報がない場合、解読アルゴリズムは最後のバイトが平文バイトかパッドバイトかを判断することができない。しかし、01平文バイトの後に値NのNバイトをそれぞれ加えることによって、解読アルゴリズムは常に最後のバイトをパッドバイトとして扱い、暗号文の終わりから適切な数のパッドバイトを取り除くことができる。前記最後のバイトの値に基づいて取り除かれる前記バイトの前記数。

PKCS#5パディングは、64ビット(8バイト)ブロックサイズを使用するブロック暗号に対してのみ定義されていることを除いて、PKCS#7パディングと同じです。実際には、2つは同じ意味で使用できます。

関連する問題