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-信息安全(四)-数据 ...
随机推荐
- 【心得】Lattice EPC3 PCS使用经验
[博客导航] [导航]FPGA相关 一.目的 将使用过程中遇到的问题随时记录,共享经验心得. 二.心得随笔 1.仿真脚本 为避免生成PCS IP之后,仿真时忘记添加参数文件,可以在仿真脚本中添加以下代 ...
- jt格式文件读取,osg显示插件更新
osgdb_jt 最近还是更新了一下 osgdb_jt 插件.解码jt格式核心库jt_toolkit,通过静态链接到Plugin jt产生osgdb_jt插件,使得osg可以可视化jt格式文件. 用法 ...
- React中循环渲染类似Vue中 的v-for
17==>循环数组 类似v-for import React, { Component } from "react"; export default class CharSh ...
- CF1278B-A and B-(简单数学)
https://vjudge.net/problem/CodeForces-1278B 题意:给两个数a和b,有一种操作:第i次操作任选其中一个数加或减i:如第1次操作可以任选其中一个数加1或减1,第 ...
- ASP.NET Core 获取主机名时的 "Decoded string is not a valid IDN name" 错误
在 ASP.NET Core 中通过 Request.Host.Host 获取主机名(hostname)时,如果主机名中包含非 ASCII 字符(比如 puny code),就会引发下面的异常: Sy ...
- 说说 Vue.js 中的 v-cloak 指令
可以使用 v-cloak 指令设置样式,这些样式会在 Vue 实例编译结束时,从绑定的 HTML 元素上被移除. 当网络较慢,网页还在加载 Vue.js ,而导致 Vue 来不及渲染,这时页面就会显示 ...
- IT兄弟连 Java语法教程 算符运算符
Java提供了丰富的运算符环境.可以将大部分Java运算符划分为4组:算术运算符.位运算符.关系运算符以及逻辑运算符.Java还定义了一些用于处理某些特定情况的附加运算符.本章将介绍除类型比较运算符i ...
- 12-UA池和代理池
一.UA池和代理池 1.UA池 scrapy的下载中间件: 下载中间件(Downloader Middlewares) 位于s ...
- H5混合应用之上下文切换
一.native/web/hybrid 简介 目前主流应用程序大体分为:Native App(原生应用).Web App(网页应用).Hybrid App(混合应用),它们三者的优缺点比较如下表: 应 ...
- Pull Request找原作者做review
最近对代码库进行了一次全局替换,改了150个左右的文件,发了PR后需要找原作者确认一下,于是写了个工具做git blame,地址在这里 写完发现一个问题,如果只是新增一个函数,没有调用,是应该不用找原 ...