0

私は、Java 組み込みライブラリを使用した DES 実装の簡単な例に取り組んでいます。これは私のコードです:

import it.sauronsoftware.base64.Base64;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;


public class DES {

    public static void main(String [] args) throws NoSuchAlgorithmException, InvalidKeyException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException
    {
        String msg="This is a secret message";
        byte [] msgBytes=msg.getBytes();        
        byte [] keyBytes  = {(byte)0xFE, (byte)0xDC, (byte)0xBA, (byte)0x98, (byte)0x76, (byte)0x54, (byte)0x32, (byte)0x10};
        SecretKeySpec myDesKey = new SecretKeySpec(keyBytes, "DES");

        //to encrypt a message
        String cipher=encryptMsg(msgBytes, myDesKey);

        //to decrypt a message
        String plain = decryptMsg(cipher.getBytes(), myDesKey);

        System.out.println("Original Message: "+ msg);
        System.out.println("Encrypted Message: "+ cipher);
        System.out.println("Decrypted Message: "+ plain);

    } //end main

    //encryption function
    public static String encryptMsg(byte [] msgBytes, SecretKey myDesKey) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException
    {
        Cipher desCipher;
        // Create the cipher 
        desCipher = Cipher.getInstance("DES/ECB/NoPadding");
        desCipher.init(Cipher.ENCRYPT_MODE, myDesKey);
        byte[] textEncrypted = desCipher.doFinal(msgBytes);

        // converts to base64 for easier display.
        byte[] base64Cipher = Base64.encode(textEncrypted);
        return new String(base64Cipher);
    } //end encryptMsg

    public static String decryptMsg(byte [] cipherBytes, SecretKey myDesKey) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException
    {
        Cipher desCipher; 
        desCipher = Cipher.getInstance("DES/ECB/NoPadding");
        desCipher.init(Cipher.DECRYPT_MODE, myDesKey);
        byte[] textDecrypted=desCipher.doFinal(cipherBytes);

        // converts to base64 for easier display.
        byte[] base64Plain = Base64.encode(textDecrypted);
        return new String(base64Plain);
    } //end decryptMsg
} //end class

私が得ている出力は次のとおりです。

Original Message: This is a secret message
Encrypted Message: hNFgTAoz2TN9f6FcLdbjnEBe5DrsU4sm
Decrypted Message: RFdk1JK0gG0vv2zndHueS9rRe0Oux44ACGObsRHQ+4E=

キーを固定 (ランダムではない) 値にする必要があります。そのため、最初にバイト配列として定義しました。

私の問題は、復号化関数が元のメッセージを返さないことです。これは、コードに問題があり、おそらく暗号化が適切でないことを意味します。暗号化/復号化は非常に単純であるため、コーディングの問題については疑いがあります。私のコードの問題を指摘できますか?

編集: 復号化では、コメントの1つで提案されているようにに変更encodeしました。decodeそれはうまくいきません。私は得る:

Exception in thread "main" java.lang.RuntimeException: Unexpected I/O error
    at it.sauronsoftware.base64.Base64.decode(Unknown Source)
    at DES.decryptMsg(DES.java:55)
    at DES.main(DES.java:25)
Caused by: java.io.IOException: Bad base64 stream
    at it.sauronsoftware.base64.Base64InputStream.acquire(Unknown Source)
    at it.sauronsoftware.base64.Base64InputStream.read(Unknown Source)
    at java.io.InputStream.read(Unknown Source)
    at java.io.InputStream.read(Unknown Source)
    at it.sauronsoftware.base64.Base64.copy(Unknown Source)
    at it.sauronsoftware.base64.Base64.decode(Unknown Source)
    ... 3 more
4

1 に答える 1

1

元のメッセージの暗号化を解読しているわけではありません。暗号化元のメッセージのbase64 エンコーディングをデコードしています。

を渡すのではなくcipher.getBytes()、 が必要ですBase64.decode(cipher).getBytes()。または、代わりに、メソッドに base64 String を受け入れさせ、メソッドでデコードを処理させます。

また、復号化されたコンテンツを base64 でデコードする必要はありません。すでに元のエンコーディングになっています。つまり、単に return new String(textDecrypted).


実行しようとしているフローは、プレーンテキスト -> 暗号化されたコンテンツ -> base64 -> 暗号化されたコンテンツ -> プレーンテキストです。あなたがしているフローは、テキスト -> 暗号化されたコンテンツ -> base64 -> 復号化された base64 (ナンセンス) -> base64 (ナンセンス) です。

于 2013-10-23T07:17:45.600 に答える