RC4 对称加密
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 对称加密的更多相关文章
- https处理的一个过程,对称加密和非对称加密
一,对称加密 所谓对称加密,就是它们在编码时使用的密钥e和解码时一样d(e=d),我们就将其统称为密钥k. 对称加解密的过程如下: 发送端和接收端首先要共享相同的密钥k(即通信前双方都需要知道对应的密 ...
- 【上】安全HTTPS-全面具体解释对称加密,非对称加密,数字签名,数字证书和HTTPS
一,对称加密 所谓对称加密.就是它们在编码时使用的密钥e和解码时一样d(e=d),我们就将其统称为密钥k. 对称加解密的步骤例如以下: 发送端和接收端首先要共享同样的密钥k(即通信前两方都须要知道相应 ...
- 介绍对称加密的另一个算法——PBE
除了DES,我们还知道有DESede(TripleDES,就是3DES).AES.Blowfish.RC2.RC4(ARCFOUR)等多种对称加密方式,其实现方式大同小异,这里介绍对称加密的另一个算法 ...
- iOS CommonCrypto 对称加密 AES ecb,cbc
CommonCrypto 为苹果提供的系统加密接口,支持iOS 和 mac 开发: 不仅限于AES加密,提供的接口还支持其他DES,3DES,RC4,BLOWFISH等算法, 本文章主要讨论AES在i ...
- RAS RC4 AES 加密 MD5
这两者唯一的相同点是设计者中都包含了MIT的Ron Revist教授.RSA是公钥密码算法,优点:不用事先通过秘密信道传递密钥,可以用于数字签名.缺点:速度慢RC4是序列密码算法,优点:速度快,缺点: ...
- 安全HTTPS-全面详解对称加密,非对称加密,数字签名,数字证书和HTTPS【下】
1. HTTPS 1.1. 什么是HTTPS HTTPS(HypertextTransfer Protocol Secure)即安全的HTTP.HTTPS的安全基础是安全套接层(Secure Soc ...
- DotNet加密方式解析--对称加密
离过年又近了一天,回家已是近在咫尺,有人欢喜有人愁,因为过几天就得经历每年一度的装逼大戏,亲戚朋友加同学的各方显摆,所以得靠一剂年终奖来装饰一个安稳的年,在这里我想起了一个题目“论装逼的技术性和重要性 ...
- [转]理解SSL(https)中的对称加密与非对称加密
加密 解密 Tweet 密码学最早可以追溯到古希腊罗马时代,那时的加密方法很简单:替换字母. 早期的密码学 古希腊人用一种叫 Scytale 的工具加密.更快的工具是 transposition ...
- java-信息安全(七)-基于非对称加密,对称加密等理解HTTPS
概述 java-信息安全(一)-BASE64,MD5,SHA,HMAC java-信息安全(二)-对称加密算法DES,3DES,AES,Blowfish,RC2,RC4 java-信息安全(四)-数据 ...
随机推荐
- 使用docker-compose部署springboot项目
由于是单机测试,没有测试多主机的跨网络分布式请求. 项目是前后分离的,所以使用nginx作为前端服务器,后端是springboot则直接基于java8环境的容器上跑,cache用的redis,mysq ...
- RDIFramework.NET敏捷开发框架 ━ 工作流程组件介绍
RDIFramework.NET,基于.NET的快速信息化系统敏捷开发.整合框架,给用户和开发者最佳的.Net框架部署方案. 1.RDIFramework.NET敏捷开发框架介绍 RDIFramewo ...
- 使用Anaconda3的Docker镜像
假设本地 Ubuntu 服务器已经安装好了Docker,这里讲述一下如何开始运行Anaconda3的Docker镜像: 1. 搜索镜像 搜索我们想要的anaconda镜像: docker search ...
- Linux和Windows的区别
1. 软件与支持 • Windows 平台:数量和质量的优势,不过大部分为收费软件:由微软官方提供重要支持和服务: • Linux 平台:大都为开源自由软件,用户可以修改定制和再发布,由于基本免费没有 ...
- Linux:源代码安装及脚本安装的使用
由于这两个安装方法比较少,就没有单独分开来写 源代码安装 源码安装的步骤 (1)对下载的码包进行解压 (2)进入解压目录执行 configure 命令做相关设置 (3)执行 make 进行编译 (4) ...
- 古来月Beta阶段博客报告
Scrum会议 第十一周会议 https://www.cnblogs.com/ouc-xxxxxx/p/12014345.html 第十周会议 https://www.cnblogs.com/ouc- ...
- MySQL常用数据类型 length 专题
MySQL-data_type数据类型 1.查看数据类型 mysql> help data type //通过help对数据进行查看,以及使用的方法 2.MySQL常见的数据类型 整数in ...
- linux五天光速入门
第一章: 01 Linux的安装及相关配置 → B站视频链接(p1-p21) 02 UNIX和Linux操作系统概述 → B站视频链接 第二章: 01 Linux命令及获取帮助 → B站视 ...
- VScode保持vue语法高亮的方式
VScode保持vue语法高亮的方式: 1.安装插件:vetur.打开VScode,Ctrl + P 然后输入 ext install vetur 然后回车点安装即可. 2.在 VSCode中使用 C ...
- 一个有用的排序函数,array_multisort(),下面的一个用法是根据二维数组里的一个字段值的大小,对该二维数组进行重新排序
从二维数组$cashes中取出一列 'store_id'(二维数组中的每个一维数组都有的字段),按照这个的大小排序,对二维数组$caches里面的一维数组进行重新排序 实际应用如下 想让相同部门的排在 ...