Java 解密加密文件时获得大量额外输出。我的代码中可能有什么问题?

Java 解密加密文件时获得大量额外输出。我的代码中可能有什么问题?,java,encryption,aes,Java,Encryption,Aes,我对密码学是新手,这是我写的代码,填充了我的赋值人提供的框架代码(请不要介意结构)。我在下面的代码中描述了这个问题 公共类文件加密程序{ 私有静态最终字符串progName=“FileEncryptor”; 专用静态最终int bufSize=128; 公共静态void main(字符串[]args){ BufferedInputStream in=null;//要从中读取的缓冲输入流 BufferedOutputStream out=null;//和要写入的缓冲输出流 SecretKeyFac

我对密码学是新手,这是我写的代码,填充了我的赋值人提供的框架代码(请不要介意结构)。我在下面的代码中描述了这个问题

公共类文件加密程序{
私有静态最终字符串progName=“FileEncryptor”;
专用静态最终int bufSize=128;
公共静态void main(字符串[]args){
BufferedInputStream in=null;//要从中读取的缓冲输入流
BufferedOutputStream out=null;//和要写入的缓冲输出流
SecretKeyFactory kf=null;//用于为我们创建密钥的内容
keyspeck ks=null;//这就是我们如何指定要生成的键的类型
byte[]salt=新字节[20];//一些盐用于PBKDF2,只是不是很咸
SecretKey key=null;//它生成的密钥
Cipher Cipher=null;//将执行实际工作的密码
SecretKeySpec keyspec=null;//如何将密钥传递给密码
int bytesRead=0;//读取到输入文件缓冲区的字节数
//首先,检查用户是否提供了所有必需的参数,如果没有,告诉他们然后退出
如果(参数长度!=4){
printUsageMessage();System.exit(1);
}
//打开输入文件
试一试{
in=新的BufferedInputStream(新的FileInputStream(args[1]);
}catch(filenotfounde异常){
printErrorMessage(“无法打开输入文件:“+args[1],null”);
系统出口(1);
}
//然后是输出文件
试一试{
out=new-BufferedOutputStream(new-FileOutputStream(args[2]);
}catch(filenotfounde异常){
printErrorMessage(“无法打开输出文件:”+args[2],e);
系统出口(1);
}
//创建PBKDF2密钥工厂
字符串算法=“PBKDF2WithHmacSHA256”;
试一试{
kf=SecretKeyFactory.getInstance(算法);
}捕获(无算法异常){
printErrorMessage(“找不到指定的算法:“+算法,e”);
系统出口(1);
}
//为基于密码生成128位密钥设置密钥规范
ks=新的PBEKeySpec(args[3].toCharArray(),salt,4096128);
//现在通过PBKDF2运行密码短语以获取密钥
试一试{
键=kf.generateScret(ks);
}捕获(InvalidKeySpece异常){
printErrorMessage(“提供的密钥规范无效:“+keyspec,e”);
系统出口(1);
}
//以字节数组的形式获取字节编码的键值
字节[]aeskey=key.getEncoded();
//现在,使用PKCS#5填充在ECBC模式下为AES加密生成一个密码对象
//在第一个任务中使用ECB,然后在版本2和版本3中切换到CBC
试一试{
cipher=cipher.getInstance(“AES/ECB/PKCS5Padding”);
}捕获(无算法异常){
printErrorMessage(“创建主密码时无此类算法异常”,e);
系统出口(2);
}捕获(无此填充例外){
printErrorMessage(“创建主密码时无此类填充异常”,e);
系统出口(2);
}
//根据args[0]设置一个变量以指示我们处于加密还是解密模式
int-cipherMode=-1;
char mode=Character.toLowerCase(args[0].charAt(0));
开关(模式){
案例“e”:cipherMode=Cipher.ENCRYPT\u模式;中断;
案例“d”:cipherMode=Cipher.DECRYPT_模式;中断;
默认值:printUsageMessage();System.exit(1);
}
//根据先前生成的16字节(128位)AES密钥数组设置密钥规范
keyspec=新的SecretKeySpec(aeskey,“AES”);
//现在用keyspec和ivspec在正确的模式下初始化密码
试一试{
init(cipherMode,keyspec);
}捕获(InvalidKeyException e){
printErrorMessage(“无效密钥规范”,e);系统退出(2);
}
//设置一些输入和输出字节数组缓冲区
字节[]inputBuffer=新字节[bufSize];
字节[]outputBuffer=null;
//“给泵充油”-我们必须先读一些东西,然后才能加密它
//如果我们什么也不读,就什么也不加密。
试一试{
bytesRead=in.read(inputBuffer);
}捕获(IOE1异常){
printErrorMessage(“读取输入文件时出错”+args[1],e1);System.exit(1);
}
//只要我们读过一些东西,就可以循环加密、写和读
//如果未读取任何内容,bytesRead将为零,或者EOF上为-1-将两者视为相同
而(字节读取>0){
字节[]输入=输入缓冲区;
//现在加密这个块
outputBuffer=cipher.update(输入);
//将生成的块写入文件
试一试{
out.write(输出缓冲区);
}捕获(IOE1异常){
printErrorMessage(“写入输出文件时出错”+args[2],e1);System.exit(1);
}
//并读入文件的下一个块
试一试{
bytesRead=in.read(inputBuffer);
}捕获(IOE1异常){
printErrorMessage(“读取输入文件时出错”+args[1],e1);System.exit(1);
}
}
//现在做最后的处理
试一试{
outputBuffer=cipher.doFinal(outputBuffer);
}捕获(IllegalBlockSizeException e2){
printErrorMessage(“执行最终处理时遇到非法块大小:”+out
hello there
9`ÃLå7}
syXÀ¢Èì´^¾Õn¾AXëC~9‹`Èì´^¾Õn¾AXëC~9‹`Èì´^¾Õn¾AXëC~9‹`Èì´^¾Õn¾AXëC~9‹`Èì´^¾Õn¾AXëC~9‹`Èì´^¾Õn¾AXëC~9‹`Èì´^¾Õn¾AXëC~9‹`0‹ó‚±G¸Y·IñåsòQœ ÙÞç„ò;uîðpoîœ ÙÞç„ò;uîðpoîœ ÙÞç„ò;uîðpoîœ ÙÞç„ò;uîðpoîœ ÙÞç„ò;uîðpoîœ ÙÞç„ò;uîðpoîœ ÙÞç„ò;uîðpoÄQé±uTö/ژͤ
hello there                                                                                                                     9`Ì巽
syXÀ¢Ȭ´^¾ծ¾AX냾9`Ȭ´^¾ծ¾AX냾9`Ȭ´^¾ծ¾AX냾9`Ȭ´^¾ծ¾AX냾9`Ȭ´^¾ծ¾AX냾9`Ȭ´^¾ծ¾AX냾9`Ȭ´^¾ծ¾AX냾9`Ȭ´^¾ծ¾AX냾9`Ȭ´^¾ծ¾AX냾9`Ȭ´^¾ծ¾AX냾9`Ȭ´^¾ծ¾AX냾9`Ȭ´^¾ծ¾AX냾9`Ȭ´^¾ծ¾AX냾9`Ȭ´^¾ծ¾AX냾9`Ȭ´^¾ծ¾AX냾9`Ȭ´^¾ծ¾AX냾9`Ȭ´^¾ծ¾AX냾9`Ȭ´^¾ծ¾AX냾9`Ȭ´^¾ծ¾AX냾9`Ȭ´^¾ծ¾AX냾9`