急求:流密码的算法,用JAVA

急求:流密码的算法,用JAVA,第1张

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 = 0i <b.lengthi++) {

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等。

本文已经收录至我的GitHub,欢迎大家踊跃star

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/8202595.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存