2010-03-31 164 views
3

我想this DES加密例如適應AES,所以我所做的更改,並嘗試運行此:AES緩衝區大小

import java.io.File; 
import java.io.FileInputStream; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.security.spec.AlgorithmParameterSpec; 

import javax.crypto.Cipher; 
import javax.crypto.CipherInputStream; 
import javax.crypto.CipherOutputStream; 
import javax.crypto.KeyGenerator; 
import javax.crypto.SecretKey; 
import javax.crypto.spec.IvParameterSpec; 

// Adapted from http://www.exampledepot.com/egs/javax.crypto/DesFile.html 
public class AesEncrypter { 

    private Cipher ecipher; 
    private Cipher dcipher; 

    // Buffer used to transport the bytes from one stream to another 
    private byte[] buf = new byte[1024]; 

    public AesEncrypter(SecretKey key) throws Exception { 
// Create an 8-byte initialization vector 
byte[] iv = new byte[] { (byte) 0x8E, 0x12, 0x39, (byte) 0x9C, 0x07, 0x72, 0x6F, 0x5A }; 
AlgorithmParameterSpec paramSpec = new IvParameterSpec(iv); 

ecipher = Cipher.getInstance("AES/CBC/NoPadding"); 
dcipher = Cipher.getInstance("AES/CBC/NoPadding"); 

// CBC requires an initialization vector 
ecipher.init(Cipher.ENCRYPT_MODE, key, paramSpec); 
dcipher.init(Cipher.DECRYPT_MODE, key, paramSpec); 
    } 

    public void encrypt(InputStream in, OutputStream out) throws Exception { 
// Bytes written to out will be encrypted 
out = new CipherOutputStream(out, ecipher); 

// Read in the cleartext bytes and write to out to encrypt 
int numRead = 0; 
while ((numRead = in.read(buf)) >= 0) { 
    out.write(buf, 0, numRead); 
} 
out.close(); 
    } 

    public void decrypt(InputStream in, OutputStream out) throws Exception { 
// Bytes read from in will be decrypted 
in = new CipherInputStream(in, dcipher); 

// Read in the decrypted bytes and write the cleartext to out 
int numRead = 0; 
while ((numRead = in.read(buf)) >= 0) { 
    out.write(buf, 0, numRead); 
} 
out.close(); 
    } 

    public static void main(String[] args) throws Exception { 
System.out.println("Starting..."); 

SecretKey key = KeyGenerator.getInstance("AES").generateKey(); 

InputStream in = new FileInputStream(new File("/home/wellington/Livros/O Alienista/speechgen0001.mp3/")); 
OutputStream out = System.out; 

AesEncrypter encrypter = new AesEncrypter(key); 
encrypter.encrypt(in, out); 

System.out.println("Done!"); 
    } 

} 

,但我得到了異常:

InvalidAlgorithmParameterException: Wrong IV length: must be 16 bytes long 

所以,我想通過改變來解決

AlgorithmParameterSpec paramSpec = new IvParameterSpec(iv); 

AlgorithmParameterSpec paramSpec = new IvParameterSpec(iv, 0, 16); 

但結果

IV buffer too short for given offset/length combination 

我可以去嘗試,直到它的工作原理,但我想聽到誰與AES的工作是什麼常用的緩衝區大小?

回答

3

我認爲這是說必須要16個字節,但是這僅僅是8個字節:

byte[] iv = new byte[] { 
    (byte) 0x8E, 0x12, 0x39, (byte) 0x9C, 0x07, 0x72, 0x6F, 0x5A 
}; 

也許嘗試呢?

byte[] iv = new byte[] { 
    (byte) 0x8E, 0x12, 0x39, (byte) 0x9C, 0x07, 0x72, 0x6F, 0x5A, 
    (byte) 0x8E, 0x12, 0x39, (byte) 0x9C, 0x07, 0x72, 0x6F, 0x5A 
}; 
4

你的主要問題已經回答了,但我想補充一點,你不應該在一般使用固定字符串IV,除非你知道自己在做什麼。您可能也想使用PKCS5Padding而不是NoPadding。

+0

謝謝,我會閱讀PKCS5Padding .. –