可以使用 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();
}
}
}
序列密码
编辑
流密码即序列密码。
序列密码也称为流密码(Stream Cipher),它是对称密码算法的一种。序列密码具有实现简单、便于硬件实施、加解密处理速度快、没有或只有有限的错误传播等特点,因此在实际应用中,特别是专用或机密机构中保持着优势,典型的应用领域包括无线通信、外交通信。 1949年Shannon证明了只有一次一密的密码体制是绝对安全的,这给序列密码技术的研究以强大的支持,序列密码方案的发展是模仿一次一密系统的尝试,或者说“一次一密”的密码方案是序列密码的雏形。如果序列密码所使用的是真正随机方式的、与消息流长度相同的密钥流,则此时的序列密码就是一次一密的密码体制。若能以一种方式产生一随机序列(密钥流),这一序列由密钥所确定,则利用这样的序列就可以进行加密,即将密钥、明文表示成连续的符号或二进制,对应地进行加密,加解密时一次处理明文中的一个或几个比特。
序列密码与分组密码的对比
分组密码以一定大小作为每次处理的基本单元,而序列密码则是以一个元素(一个字母或一个比特)作为基本的处理单元。
序列密码是一个随时间变化的加密变换,具有转换速度快、低错误传播的优点,硬件实现电路更简单;其缺点是:低扩散(意味着混乱不够)、插入及修改的不敏感性。
分组密码使用的是一个不随时间变化的固定变换,具有扩散性好、插入敏感等优点;其缺点是:加解密处理速度慢、存在错误传播。
序列密码涉及到大量的理论知识,提出了众多的设计原理,也得到了广泛的分析,但许多研究成果并没有完全公开,这也许是因为序列密码目前主要应用于军事和外交等机密部门的缘故。目前,公开的序列密码算法主要有RC4、SEAL等。
直接给你java关于telnet的一个例子
public class Main { public static void main(String[] args) { try {
TelnetClient telnetClient = new TelnetClient("vt200"); //指明Telnet终端类型,否则会返回来的数据中文会乱码
telnetClient.setDefaultTimeout(5000); //socket延迟时间:5000ms
telnetClient.connect("127.0.0.1",23); //建立一个连接,默认端口是23
InputStream inputStream = telnetClient.getInputStream(); //读取命令的流
PrintStream pStream = new PrintStream(telnetClient.getOutputStream()); //写命令的流
byte[] b = new byte[1024]; int size;
StringBuffer sBuffer = new StringBuffer(300); while(true) { //读取Server返回来的数据,直到读到登陆标识,这个时候认为可以输入用户名
size = inputStream.read(b); if(-1 != size) {
sBuffer.append(new String(b,0,size)); if(sBuffer.toString().trim().endsWith("login:")) { break;
}
}
}
System.out.println(sBuffer.toString());
pStream.println("exit"); //写命令
pStream.flush(); //将命令发送到telnet Server
if(null != pStream) {
pStream.close();
}
telnetClient.disconnect();
} catch (SocketException e) { // TODO Auto-generated catch block e.printStackTrace();
} catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace();
}
}
}
javax.crypto.Cipher类提供加密和解密功能,该类是JCE框架的核心。
一,与所有的引擎类一样,可以通过调用Cipher类中的getInstance静态工厂方法得到Cipher对象。
public static Cipher getInstance(String transformation);
public static Cipher getInstance(String transformation,String provider);
参数transformation是一个字符串,它描述了由指定输入产生输出所进行的操作或操作集合。
参数transformation总是包含密码学算法名称,比如DES,也可以在后面包含模式和填充方式。
参数transformation可以是下列两种形式之一:
“algorithm/mode/padding”
“algorithm”
例如下面的例子就是有效的transformation形式:
"DES/CBC/PKCS5Padding"
"DES"
如 果没有指定模式或填充方式,就使用特定提供者指定的默认模式或默认填充方式。例如,SunJCE提供者使用ECB作为DES、DES-EDE和 Blowfish等Cipher的默认模式,并使用PKCS5Padding作为它们默认的填充方案。这意味着在SunJCE提供者中,下列形式的声明是 等价的:Cipher c1=Cipher.getInstance("DES/ECB/PKCS5Padding");
Cipher c1=Cipher.getInstance("DES");
当 以流加密方式请求以块划分的cipher时,可以在模式名后面跟上一次运算需要操作的bit数目,例如采用"DES/CFB8/NoPadding"和 "DES/OFB32/PKCS5Padding"形式的transformation参数。如果没有指定数目,则使用提供者指定的默认值(例如 SunJCE提供者使用的默认值是64bit)。
getInstance工厂方法返回的对象没有进行初始化,因此在使用前必须进行初始化。
通过getInstance得到的Cipher对象必须使用下列四个模式之一进行初始化,这四个模式在Cipher类中被定义为final integer常数,我们可以使用符号名来引用这些模式:
ENCRYPT_MODE,加密数据
DECRYPT_MODE,解密数据
WRAP_MODE,将一个Key封装成字节,可以用来进行安全传输
UNWRAP_MODE,将前述已封装的密钥解开成java.security.Key对象
每个Cipher初始化方法使用一个模式参数opmod,并用此模式初始化Cipher对象。此外还有其他参数,包括密钥key、包含密钥的证书certificate、算法参数params和随机源random。
我们可以调用以下的init方法之一来初始化Cipher对象:
public void init(int opmod,Key key);
public void init(int opmod,Certificate certificate);
public void init(int opmod,Key key,SecureRandom random);
public void init(int opmod,Certificate certificate,SecureRandom random);
public void init(int opmod,Key key,AlgorithmParameterSpec params);
public void init(int opmod,Key key,AlgorithmParameterSpec params,SecureRandom random);
public void init(int opmod,Key key,AlgorithmParameters params);
public void init(int opmod,Key key,AlgorithmParameters params,SecureRandom random);
必须指出的是,加密和解密必须使用相同的参数。当Cipher对象被初始化时,它将失去以前得到的所有状态。即,初始化Cipher对象与新建一个Cipher实例然后将它初始化是等价的。
二,可以调用以下的doFinal()方法之一完成单步的加密或解密数据:
public byte[] doFinal(byte[] input);
public byte[] doFinal(byte[] input,int inputOffset,int inputLen);
public int doFinal(byte[] input,int inputOffset,int inputLen,byte[] output);
public int doFinal(byte[] input,int inputOffset,int inputLen,byte[] output,int outputOffset);
在多步加密或解密数据时,首先需要一次或多次调用update方法,用以提供加密或解密的所有数据:
public byte[] update(byte[] input);
public byte[] update(byte[] input,int inputOffset,int inputLen);
public int update(byte[] input,int inputOffset,int inputLen,byte[] output);
public int update(byte[] input,int inputOffset,int inputLen,byte[] output,int outputOffset);
如果还有输入数据,多步操作可以使用前面提到的doFinal方法之一结束。如果没有数据,多步操作可以使用下面的doFinal方法之一结束:
public byte[] doFinal();
public int doFinal(byte[] output,int outputOffset);
如果在transformation参数部分指定了padding或unpadding方式,则所有的doFinal方法都要注意所用的padding或unpadding方式。
调用doFinal方法将会重置Cipher对象到使用init进行初始化时的状态,就是说,Cipher对象被重置,使得可以进行更多数据的加密或解密,至于这两种模式,可以在调用init时进行指定。
三,包裹wrap密钥必须先使用WRAP_MODE初始化Cipher对象,然后调用以下方法:
public final byte[] wrap(Key key);
如果将调用wrap方法的结果(wrap后的密钥字节)提供给解包裹unwrap的人使用,必须给接收者发送以下额外信息:
(1)密钥算法名称:
密钥算法名称可以调用Key接口提供的getAlgorithm方法得到:
public String getAlgorithm();
(2)被包裹密钥的类型(Cipher.SECRET_KEY,Cipher.PRIVATE_KEY,Cipher.PUBLIC_KEY)
sourcelink: ;nid=41716order=tid=
为了对调用wrap方法返回的字节进行解包,必须先使用UNWRAP_MODE模式初始化Cipher对象,然后调用以下方法 :
public final Key unwrap(byte[] wrappedKey,String wrappedKeyAlgorithm,int wrappedKeyType));
其 中,参数wrappedKey是调用wrap方法返回的字节,参数wrappedKeyAlgorithm是用来包裹密钥的算法,参数 wrappedKeyType是被包裹密钥的类型,该类型必须是Cipher.SECRET_KEY,Cipher.PRIVATE_KEY, Cipher.PUBLIC_KEY三者之一。
四,SunJCE提供者实现的cipher算法使用如下参数:
(1)采用CBC、CFB、OFB、PCBC模式的DES、DES-EDE和Blowfish算法。,它们使用初始化向量IV作为参数。可以使用javax.crypto.spec.IvParameterSpec类并使用给定的IV参数来初始化Cipher对象。
(2)PBEWithMD5AndDES使用的参数是一个由盐值和迭代次数组成的参数集合。可以使用javax.crypto.spec.PBEParameterSpec类并利用给定盐值和迭代次数来初始化Cipher对象。
注意:如果使用SealedObject类,就不必为解密运算参数的传递和保存担心。这个类在加密对象内容中附带了密封和加密的参数,可以使用相同的参数对其进行解封和解密。
Cipher 中的某些update和doFinal方法允许调用者指定加密或解密数据的输出缓存。此时,保证指定的缓存足够大以容纳加密或解密运算的结果是非常重要 的
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的话代码会更简单。