0

次のコードは、AES-128を使用してバイト配列SOURCE_DATAを別のバイト配列ENCRYPTED_DATAに暗号化し、それを再びDECRYPTED_DATAに復号化します。バイト配列のサイズが256バイト未満の場合、コードは問題なく機能しますが、バイト配列が長い場合、DECRYPTED_DATAにはバイト256の後にゼロのみが含まれ、SOURCE_DATA配列と等しくありません。私は何が欠けていますか?

出力:

ソースデータ:... fbfcfdfeff0001復号化された
データ:... fbfcfdfeff000 0

コード:

// Create data array with size greater 256 bytes
byte[] SOURCE_DATA = new byte[257];     
for (int i=0;i<SOURCE_DATA.length; i++) {
    SOURCE_DATA[i] = (byte)((i+1) & 0xff);
}

// Init ciphers
Cipher encC = Cipher.getInstance("AES/ECB/PKCS5Padding");
Cipher decC = Cipher.getInstance("AES/ECB/PKCS5Padding");
encC.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(new byte[] {0,1,2,3,4,5,6,7,8,9,1,2,3,4,5,6}, "AES"));                  
decC.init(Cipher.DECRYPT_MODE, new SecretKeySpec(new byte[] {0,1,2,3,4,5,6,7,8,9,1,2,3,4,5,6}, "AES"));          

// Encrypt
ByteArrayOutputStream bos = new ByteArrayOutputStream();
CipherOutputStream cos = new CipherOutputStream(bos, encC);
DataOutputStream dos = new DataOutputStream(cos);

dos.write(SOURCE_DATA, 0, SOURCE_DATA.length);
dos.close();

byte[] ENCRYPTED_DATA = bos.toByteArray();

// Decrypt
ByteArrayInputStream bis = new ByteArrayInputStream(ENCRYPTED_DATA);
CipherInputStream cis = new CipherInputStream(bis, decC);
DataInputStream dis = new DataInputStream(cis);

byte[] DECRYPTED_DATA = new byte[SOURCE_DATA.length];
dis.read(DECRYPTED_DATA, 0, DECRYPTED_DATA.length);
cis.close();

System.out.println("Source Data:    "+toHex(SOURCE_DATA));
System.out.println("Decrypted Data: "+toHex(DECRYPTED_DATA));            
4

1 に答える 1

1

使用してみてくださいDataInputStream.readFully(つまり、結果の一部しか読み取っていないため、常にInputStream.readwhileループで呼び出します)。

于 2012-07-03T20:48:33.627 に答える