大橙子网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
可以使用 Runtime 直接调用 winRar 的命令行命令来解压缩
创新互联公司坚持“要么做到,要么别承诺”的工作理念,服务领域包括:网站制作、做网站、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的泉港网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!
注意:
1、winRar命令使用,在dos下输入 unrar 就可以看到全部的命令说明。该命令在winRar的安装目录下
2、winRar命令行命令的路径问题,也就是path。要么加入系统变量path中,要么在winRar的安装目录下执行程序
以下是程序代码,解压 test.rar 到当前目录下,密码123
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class TestRunTime {
public static void main(String[] args) {
Runtime run = Runtime.getRuntime();
try {
Process p = run.exec("unrar e test.rar -p123");//执行解压缩命令
BufferedInputStream in = new BufferedInputStream(p.getInputStream());
BufferedReader inBr = new BufferedReader(new InputStreamReader(in));
String lineStr;
while ((lineStr = inBr.readLine()) != null)
System.out.println(lineStr);
// 检查命令是否执行失败。
if (p.waitFor() != 0) {
if (p.exitValue() == 1)// p.exitValue()==0表示正常结束,1:非正常结束
System.err.println("命令执行失败!");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
Java中的IO流使用的是Decorator设计模式
所以只要写两个装饰者类
覆盖write和read方法
在write前和read后对原数据进行一些处理(比如异或操作)就可以了
我吃过饭写个贴上来……
--------------------------------------------------------
// EncryptStream.java
import java.io.IOException;
import java.io.OutputStream;
/**
*
* 类型描述 加密流
*
* @since 2009-5-22
* @author 何智刚
*
*/
public class EncryptStream extends OutputStream {
private byte key;
private OutputStream out;
/**
*
* @param key 密钥
* @param in 需要加密的流
*/
public EncryptStream(byte key, OutputStream out) {
this.key = key;
this.out = out;
}
@Override
public void write(int b) throws IOException {
out.write(b ^ key);
}
}
// DecryptStream.java
import java.io.IOException;
import java.io.InputStream;
/**
*
* 类型描述 解密流
*
* @since 2009-5-22
* @author 何智刚
*
*/
public class DecryptStream extends InputStream {
private byte key;
private InputStream in;
/**
*
* @param key 密钥
* @param in 需要解密的流
*/
public DecryptStream(byte key, InputStream in) {
this.key = key;
this.in = in;
}
@Override
public int read() throws IOException {
return in.read() ^ key;
}
@Override
public int read(byte[] b, int off, int len) throws IOException {
byte[] temp = new byte[b.length];
int c = in.read(temp, off, len);
for (int i = 0; i b.length; i++) {
b[i] = (byte) (temp[i] ^ key);
}
return c;
}
}
// Client.java
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
public class Client {
public static void main(String[] args) throws Exception {
byte key = 25;
encryptFile("要加密的文件.dat", "加密过的文件.dat", key);
decryptFile("加密过的文件.dat", "解密出来的文件.dat", key);
}
/**
*
* 方法描述 加密文件
*
* @param src 要加密的文件的路径
* @param des 加密过后的文件的存放路径
* @param key 密钥
* @throws Exception
*
* @变更记录 2009-5-22 下午12:42:25 何智刚 创建
*
*/
public static void encryptFile(String src, String des, byte key)
throws Exception {
InputStream in = new FileInputStream(src);
OutputStream out = new EncryptStream(key, new FileOutputStream(des));
byte[] buf = new byte[8192];
int c;
while ((c = in.read(buf)) 0) {
out.write(buf, 0, c);
}
in.close();
out.flush();
out.close();
}
/**
*
* 方法描述 解密文件
*
* @param src 要解密的文件的路径
* @param des 解密过后的文件的存放路径
* @param key 密钥
* @throws Exception
*
* @变更记录 2009-5-22 下午12:43:04 何智刚 创建
*
*/
public static void decryptFile(String src, String des, byte key)
throws Exception {
InputStream in = new DecryptStream(key, new FileInputStream(src));
OutputStream out = new FileOutputStream(des);
byte[] buf = new byte[8192];
int c;
while ((c = in.read(buf)) 0) {
out.write(buf, 0, c);
}
in.close();
out.flush();
out.close();
}
}
-----------------------------------------------
我在例子里没有用BufferedStream,而是自己创建了个byte[]做缓冲区,因为这样性能更好。用BufferedStream的话代码会更简单。
序列密码
编辑
流密码即序列密码。
序列密码也称为流密码(Stream Cipher),它是对称密码算法的一种。序列密码具有实现简单、便于硬件实施、加解密处理速度快、没有或只有有限的错误传播等特点,因此在实际应用中,特别是专用或机密机构中保持着优势,典型的应用领域包括无线通信、外交通信。 1949年Shannon证明了只有一次一密的密码体制是绝对安全的,这给序列密码技术的研究以强大的支持,序列密码方案的发展是模仿一次一密系统的尝试,或者说“一次一密”的密码方案是序列密码的雏形。如果序列密码所使用的是真正随机方式的、与消息流长度相同的密钥流,则此时的序列密码就是一次一密的密码体制。若能以一种方式产生一随机序列(密钥流),这一序列由密钥所确定,则利用这样的序列就可以进行加密,即将密钥、明文表示成连续的符号或二进制,对应地进行加密,加解密时一次处理明文中的一个或几个比特。
序列密码与分组密码的对比
分组密码以一定大小作为每次处理的基本单元,而序列密码则是以一个元素(一个字母或一个比特)作为基本的处理单元。
序列密码是一个随时间变化的加密变换,具有转换速度快、低错误传播的优点,硬件实现电路更简单;其缺点是:低扩散(意味着混乱不够)、插入及修改的不敏感性。
分组密码使用的是一个不随时间变化的固定变换,具有扩散性好、插入敏感等优点;其缺点是:加解密处理速度慢、存在错误传播。
序列密码涉及到大量的理论知识,提出了众多的设计原理,也得到了广泛的分析,但许多研究成果并没有完全公开,这也许是因为序列密码目前主要应用于军事和外交等机密部门的缘故。目前,公开的序列密码算法主要有RC4、SEAL等。