您好我有一个使用Triple DES的客户端。我知道我知道如果AES我不会有问题它是一个较旧的解决方案集成。我在下面的代码中获取文件并写入另一个文件。在解密方法我不明白文件长度的第二个参数。请帮忙。我得到的错误如下: 线程“main”中的异常org.bouncycastle.crypto.DataLengthException:解密时最后一个块不完整 在org.bouncycastle.crypto.paddings.PaddedBufferedBlockCipher.doFinal(未知来源) 在DESede_BC.decrypt(DESede_BC.java:102) 在DESede_BC.main(DESede_BC.java:120)
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import javax.crypto.BadPaddingException;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.ShortBufferException;
import org.bouncycastle.crypto.DataLengthException;
import org.bouncycastle.crypto.InvalidCipherTextException;
import org.bouncycastle.crypto.engines.DESedeEngine;
import org.bouncycastle.crypto.paddings.PaddedBufferedBlockCipher;
import org.bouncycastle.crypto.params.KeyParameter;
public class DESede_BC {
PaddedBufferedBlockCipher encryptCipher;
PaddedBufferedBlockCipher decryptCipher;
// Buffers used to transport the bytes from one stream to another
byte[] buf = new byte[8]; //input buffer - block size length
byte[] obuf = new byte[557]; //output buffer
byte[] key = null; //the key
public DESede_BC(){
//use a default 192 bit key
key = "thekey".getBytes();
InitCiphers();
}
public DESede_BC(byte[] keyBytes){
key = new byte[keyBytes.length];
System.arraycopy(keyBytes, 0 , key, 0, keyBytes.length);
InitCiphers();
}
private void InitCiphers(){
encryptCipher = new PaddedBufferedBlockCipher(new DESedeEngine());
encryptCipher.init(true, new KeyParameter(key));
decryptCipher = new PaddedBufferedBlockCipher(new DESedeEngine());
decryptCipher.init(false, new KeyParameter(key));
}
public void ResetCiphers() {
if(encryptCipher!=null)
encryptCipher.reset();
if(decryptCipher!=null)
decryptCipher.reset();
}
public void encrypt(InputStream in, long length, OutputStream out)
throws ShortBufferException,
IllegalBlockSizeException,
BadPaddingException,
DataLengthException,
IllegalStateException,
InvalidCipherTextException
{
try {
// Bytes written to out will be encrypted
// Read in the cleartext bytes from in InputStream and
// write them encrypted to out OutputStream
int noBytesRead = 0; //number of bytes read from input
int noBytesProcessed = 0; //number of bytes processed
while ((noBytesRead = in.read(buf)) >= 0) {
noBytesProcessed =
encryptCipher.processBytes(buf, 0, noBytesRead, obuf, 0);
out.write(obuf, 0, noBytesProcessed);
}
noBytesProcessed =
encryptCipher.doFinal(obuf, 0);
out.write(obuf, 0, noBytesProcessed);
out.flush();
}
catch (java.io.IOException e) {
System.out.println(e.getMessage());
}
}
public void decrypt(InputStream in,long length, OutputStream out)
throws ShortBufferException, IllegalBlockSizeException, BadPaddingException,
DataLengthException, IllegalStateException, InvalidCipherTextException
{
try {
// Bytes read from in will be decrypted
// Read in the decrypted bytes from in InputStream and and
// write them in cleartext to out OutputStream
int noBytesRead = 0; //number of bytes read from input
int noBytesProcessed = 0; //number of bytes processed
while ((noBytesRead = in.read(buf)) >= 0) {
noBytesProcessed = decryptCipher.processBytes(buf, 0, noBytesRead, obuf, 0);
out.write(obuf, 0, noBytesProcessed);
}
noBytesProcessed = decryptCipher.doFinal(obuf, 0);
out.write(obuf, 0, noBytesProcessed);
out.flush();
}
catch (java.io.IOException e) {
System.out.println(e.getMessage());
}
}
public static void main(String... args)
throws Exception
{
DESede_BC d = new DESede_BC();
FileInputStream fis2 = new FileInputStream("c:\\2.in");
FileOutputStream fos2 = new FileOutputStream("c:\\decrypted.txt");
d.decrypt(fis2, new Long("128"), fos2);
}
}
答案 0 :(得分:1)
我认为您需要在doFinal之前将输入解码为Base64:
byte[] obuf = Base64.decode(obuf, Base64.NO_OPTIONS);
byte[] decValue = c.doFinal(obuf);