AES缓冲区大小

AES缓冲区大小

问题描述:

我想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的工作是什么常用的缓冲区大小?

我认为这是说必须要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 
}; 

你的主要问题已经回答了,但我想补充一点,你不应该在一般使用固定字符串IV,除非你知道自己在做什么。您可能也想使用PKCS5Padding而不是NoPadding。

+0

谢谢,我会阅读PKCS5Padding .. –