-5

次のコードは、暗号化に基づいています。コンストラクター内で、これを初期化します。

try{
        //To generate the secret key
        KeyGenerator keyGen = KeyGenerator.getInstance("DES");
        sKey = keyGen.generateKey();
        //Initialize the cipher instance to use DES algorithm, ECB mode,
        //and PKCS#5 padding scheme.
        cipherObj = Cipher.getInstance("DES/ECB/PKCS5Padding");
    }
    catch(NoSuchAlgorithmException nsae){nsae.printStackTrace();

    }
    catch(NoSuchPaddingException nspe){nspe.printStackTrace();}

Encryptというボタンの下にこのコードがあり、実際に機能しています

try{
    //Initialize the cipher with secret key to encrypt the data.
    cipherObj.init(Cipher.ENCRYPT_MODE, sKey);
    //Read the data into byte array
    byte[] textToEncrypt = txtTobeEncrypted.getText().getBytes();
    //To encrypt the data
    byte[] encryptedData = cipherObj.doFinal(textToEncrypt);
    //Display the encrypted data
    String encryptedText = new String(encryptedData);
    txtEncryptOutput.setText(encryptedText);
}
catch(InvalidKeyException ivkey){ivkey.printStackTrace();}
catch(BadPaddingException bpe){bpe.printStackTrace();}
catch(IllegalBlockSizeException ilbs){ilbs.printStackTrace();}

しかし、復号化ボタンの下にある次のコードは機能していません

try{
    //Initialize the cipher with secret key to encrypt the data.
    cipherObj.init(Cipher.DECRYPT_MODE, sKey);
    //Read the data into byte array
    byte[] textToDecrypt = txtEncryptOutput.getText().getBytes();
    //To decrypt the data
    byte[] plainData = cipherObj.doFinal(textToDecrypt);
    //Display the encrypted data
    String thePlainText = new String(plainData);
    txtDecrypt.setText(thePlainText);
}
catch(InvalidKeyException ivkey){ivkey.printStackTrace();}
catch(BadPaddingException bpe){bpe.printStackTrace();}
catch(IllegalBlockSizeException ilbs){ilbs.printStackTrace();}

取得している例外は次のとおりです。

javax.crypto.IllegalBlockSizeException: Input length must be multiple of 8 when decrypting with padded cipher
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:750)
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:676)
at com.sun.crypto.provider.DESCipher.engineDoFinal(DESCipher.java:314)
at javax.crypto.Cipher.doFinal(Cipher.java:2086)
at cryptography.FileEncryption.cmdDecryptActionPerformed(FileEncryption.java:209)

では、なぜこの例外が発生するのか、誰か説明してもらえますか?

4

2 に答える 2

2

ランダムなバイトのシーケンスをにデコードすることはできませんString。ほとんどの文字エンコーディングは、すべてのバイトまたはバイトシーケンスを文字にマップするわけではありません。これらは情報を�(置換文字)に置き換えます。

代わりに、暗号文を印刷可能な文字列に変換し、Base-64などの適切なエンコーディングを使用して再度元に戻します。

于 2013-03-15T16:27:49.657 に答える
0

txtEncryptOutput.getText().getBytes()の長さが 8 の倍数ではないため、この例外が発生する可能性があります。

これは、デバッガーで検査するか、ロギング システムの端末に長さを出力することで確認できます。

于 2013-03-15T16:20:31.213 に答える