public class RC4 {
byte[] s = new byte[256];
byte[] key;
byte keylen;// 4 ~ 16
int pi = 0;
int pj = 0; public RC4() {
this.keylen = 16;
randKey();
ksa();
} public RC4(byte keylen) {
this.keylen = keylen;
randKey();
ksa();
} public RC4(byte[] key) {
this.key = key;
keylen = (byte) key.length;
ksa();
} private void randKey() {
// SecureRandom r = new SecureRandom("abc".getBytes());
Random r = new Random(0xdeadbeef);
key = new byte[keylen];
r.nextBytes(key);
} public byte[] getKey() {
return key;
} private void ksa() {
for (int i = 0; i < s.length; i++) {
s[i] = (byte) i;
}
int j = 0;
for (int i = 0; i < s.length; i++) { //使用密钥来交换s的元素
j = ((j + s[i] & 0xff + key[i % keylen] & 0xff) % 256); //重复使用密钥 byte tmp = s[i]; //交换
s[i] = s[j];
s[j] = tmp;
}
} public byte prgaOneByte(byte in) {
pi = pi + 1 % 256;
pj = (pj + s[pi] & 0xff); byte tmp = s[pi];
s[pi] = s[pj];
s[pj] = tmp; int t = (s[pi] & 0xff + s[pj] & 0xff) % 256;
int k = s[t] & 0xff;
return (byte) ((k ^ in & 0xff) & 0xff);
} public void prga(InputStream is, OutputStream os) throws IOException {
int bufsize = 4 * 1024;
byte[] buffer = new byte[bufsize]; // 4K
byte[] outBuffer;
int len = 0;
while ((len = is.read(buffer, 0, bufsize)) != -1) { //读取一块
outBuffer = prga(buffer, 0, len);
os.write(outBuffer);
}
} public byte[] prga(byte[] buffer, int off, int len) throws IOException {
byte[] outBuffer = new byte[buffer.length]; // 4K
for (int i = 0 + off; i < len; i++) { //处理这块
outBuffer[i] = prgaOneByte(buffer[i]);
}
return outBuffer;
} public static void main(String[] args) throws IOException {
String msg = "hello wold!";
byte[] bmsg = msg.getBytes();
byte[] key;
System.out.println("bmsg :" + Arrays.toString(bmsg)); //加密前 RC4 rc4 = new RC4();
key = rc4.getKey();
byte[] ebmsg = rc4.prga(bmsg, 0, bmsg.length);
System.out.println("ebmsg :" + Arrays.toString(ebmsg)); //加密后 RC4 rc42 = new RC4(key);
byte[] debmsg = rc42.prga(ebmsg, 0, ebmsg.length);
System.out.println("debmsg:" + Arrays.toString(debmsg));//解密后
System.out.println("debmsg:" + new String(debmsg));
}
}

输出

bmsg :[, , , , , , , , , , ]
ebmsg :[-, , -, -, -, , -, -, -, , -]
debmsg:[, , , , , , , , , , ]
debmsg:hello wold!

RC4 对称加密的更多相关文章

  1. https处理的一个过程,对称加密和非对称加密

    一,对称加密 所谓对称加密,就是它们在编码时使用的密钥e和解码时一样d(e=d),我们就将其统称为密钥k. 对称加解密的过程如下: 发送端和接收端首先要共享相同的密钥k(即通信前双方都需要知道对应的密 ...

  2. 【上】安全HTTPS-全面具体解释对称加密,非对称加密,数字签名,数字证书和HTTPS

    一,对称加密 所谓对称加密.就是它们在编码时使用的密钥e和解码时一样d(e=d),我们就将其统称为密钥k. 对称加解密的步骤例如以下: 发送端和接收端首先要共享同样的密钥k(即通信前两方都须要知道相应 ...

  3. 介绍对称加密的另一个算法——PBE

    除了DES,我们还知道有DESede(TripleDES,就是3DES).AES.Blowfish.RC2.RC4(ARCFOUR)等多种对称加密方式,其实现方式大同小异,这里介绍对称加密的另一个算法 ...

  4. iOS CommonCrypto 对称加密 AES ecb,cbc

    CommonCrypto 为苹果提供的系统加密接口,支持iOS 和 mac 开发: 不仅限于AES加密,提供的接口还支持其他DES,3DES,RC4,BLOWFISH等算法, 本文章主要讨论AES在i ...

  5. RAS RC4 AES 加密 MD5

    这两者唯一的相同点是设计者中都包含了MIT的Ron Revist教授.RSA是公钥密码算法,优点:不用事先通过秘密信道传递密钥,可以用于数字签名.缺点:速度慢RC4是序列密码算法,优点:速度快,缺点: ...

  6. 安全HTTPS-全面详解对称加密,非对称加密,数字签名,数字证书和HTTPS【下】

    1.  HTTPS 1.1. 什么是HTTPS HTTPS(HypertextTransfer Protocol Secure)即安全的HTTP.HTTPS的安全基础是安全套接层(Secure Soc ...

  7. DotNet加密方式解析--对称加密

    离过年又近了一天,回家已是近在咫尺,有人欢喜有人愁,因为过几天就得经历每年一度的装逼大戏,亲戚朋友加同学的各方显摆,所以得靠一剂年终奖来装饰一个安稳的年,在这里我想起了一个题目“论装逼的技术性和重要性 ...

  8. [转]理解SSL(https)中的对称加密与非对称加密

    加密 解密 Tweet   密码学最早可以追溯到古希腊罗马时代,那时的加密方法很简单:替换字母. 早期的密码学 古希腊人用一种叫 Scytale 的工具加密.更快的工具是 transposition ...

  9. java-信息安全(七)-基于非对称加密,对称加密等理解HTTPS

    概述 java-信息安全(一)-BASE64,MD5,SHA,HMAC java-信息安全(二)-对称加密算法DES,3DES,AES,Blowfish,RC2,RC4 java-信息安全(四)-数据 ...

随机推荐

  1. 使用docker-compose部署springboot项目

    由于是单机测试,没有测试多主机的跨网络分布式请求. 项目是前后分离的,所以使用nginx作为前端服务器,后端是springboot则直接基于java8环境的容器上跑,cache用的redis,mysq ...

  2. RDIFramework.NET敏捷开发框架 ━ 工作流程组件介绍

    RDIFramework.NET,基于.NET的快速信息化系统敏捷开发.整合框架,给用户和开发者最佳的.Net框架部署方案. 1.RDIFramework.NET敏捷开发框架介绍 RDIFramewo ...

  3. 使用Anaconda3的Docker镜像

    假设本地 Ubuntu 服务器已经安装好了Docker,这里讲述一下如何开始运行Anaconda3的Docker镜像: 1. 搜索镜像 搜索我们想要的anaconda镜像: docker search ...

  4. Linux和Windows的区别

    1. 软件与支持 • Windows 平台:数量和质量的优势,不过大部分为收费软件:由微软官方提供重要支持和服务: • Linux 平台:大都为开源自由软件,用户可以修改定制和再发布,由于基本免费没有 ...

  5. Linux:源代码安装及脚本安装的使用

    由于这两个安装方法比较少,就没有单独分开来写 源代码安装 源码安装的步骤 (1)对下载的码包进行解压 (2)进入解压目录执行 configure 命令做相关设置 (3)执行 make 进行编译 (4) ...

  6. 古来月Beta阶段博客报告

    Scrum会议 第十一周会议 https://www.cnblogs.com/ouc-xxxxxx/p/12014345.html 第十周会议 https://www.cnblogs.com/ouc- ...

  7. MySQL常用数据类型 length 专题

    MySQL-data_type数据类型 1.查看数据类型 mysql> help data type    //通过help对数据进行查看,以及使用的方法 2.MySQL常见的数据类型 整数in ...

  8. linux五天光速入门

    第一章: 01 Linux的安装及相关配置  → B站视频链接(p1-p21) 02 UNIX和Linux操作系统概述    → B站视频链接 第二章: 01 Linux命令及获取帮助   → B站视 ...

  9. VScode保持vue语法高亮的方式

    VScode保持vue语法高亮的方式: 1.安装插件:vetur.打开VScode,Ctrl + P 然后输入 ext install vetur 然后回车点安装即可. 2.在 VSCode中使用 C ...

  10. 一个有用的排序函数,array_multisort(),下面的一个用法是根据二维数组里的一个字段值的大小,对该二维数组进行重新排序

    从二维数组$cashes中取出一列 'store_id'(二维数组中的每个一维数组都有的字段),按照这个的大小排序,对二维数组$caches里面的一维数组进行重新排序 实际应用如下 想让相同部门的排在 ...