0

データを暗号化および復号化する2つの関数を次のように記述しました。

public static void encrypt() throws Exception {
    // Add the BouncyCastle Provider
    //Security.addProvider(new BouncyCastleProvider());


// Generate the key
byte[] keyBytes = "AAAAAAAAAAAAAAAA".getBytes();
SecretKeySpec   key = new SecretKeySpec(keyBytes, "AES");

// Generate the IV
byte[] ivBytes  = "AAAAAAAAAAAAAAAA".getBytes();
IvParameterSpec ivSpec = new IvParameterSpec(ivBytes);

// Create the cipher object and initialize it
Cipher          cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec);

// Read all bytes from a file into a bytes array
byte[] inputBytes = GCM.readFile("input");
byte[] cipherBytes = cipher.doFinal(inputBytes);

BufferedOutputStream  outputStream = new BufferedOutputStream(new FileOutputStream("output.enc"));
outputStream.write(cipherBytes);

outputStream.close();   
}

public static void decrypt() throws Exception {
    // Add the BouncyCastle Provider
     //Security.addProvider(new BouncyCastleProvider());

 // Generate the key
 byte[] keyBytes = "AAAAAAAAAAAAAAAA".getBytes();
 SecretKeySpec   key = new SecretKeySpec(keyBytes, "AES");

 // Generate the IV
 byte[] ivBytes  = "AAAAAAAAAAAAAAAA".getBytes();
 IvParameterSpec ivSpec = new IvParameterSpec(ivBytes);

 // Create the cipher object and initialize it
 Cipher          cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
 cipher.init(Cipher.DECRYPT_MODE, key, ivSpec);

 // Read all bytes from a file into a bytes array
 byte[] cipherBytes = GCM.readFile("ouput.enc");
 byte[] decBytes = cipher.doFinal(cipherBytes);

 BufferedOutputStream  outputStream = new BufferedOutputStream(new FileOutputStream("regen.plain"));
 outputStream.write(decBytes);
 outputStream.close();   
}

"AAAAAAAAAAAAAAAA".getBytes()コードのキーが;として設定されていることに気付きました。ただし、これは単なる例ですので、ご容赦ください。

プログラムを実行すると、次のスタックトレースが表示されます:-

Exception in thread "main" javax.crypto.IllegalBlockSizeException: Input length must be multiple of 16 when decrypting with padded cipher
    at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..)
    at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..)
    at com.sun.crypto.provider.AESCipher.engineDoFinal(DashoA13*..)
    at javax.crypto.Cipher.doFinal(DashoA13*..)
    at GCM.decrypt(GCM.java:80)
    at GCM.main(GCM.java:90)

このエラーが発生する理由を理解するのに問題があります。問題を解決するためのヒントはありますか?

[編集]データを書き出すと全部で16バイトあるようですが、読み戻すと15バイトしかありません。

4

2 に答える 2

1

考えられる問題(タイプミスでない限り)を書き込みますoutput.encが、から読み取りますouput.enc

于 2013-01-10T18:14:03.320 に答える
1

更新について:それでは簡単です。暗号文はN *ブロックサイズ、つまり16バイトである必要があるため、ファイルを読み取る部分を修正します。他の露骨なエラーは見られません。

于 2013-01-11T08:03:33.010 に答える