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-信息安全(四)-数据 ...
随机推荐
- from __future__ import absolute_import,division,print_function的作用
绪论: 最近看多的项目中都文件的开头都带引入了三个模块,特地去查了下其作用(注:验证需要在python2的环境下) absolute_import :绝对导入,其作用是导入模块的时候如果在当前项目目录 ...
- 去掉烦人的“!=null"(判空语句)
文章首发于公众号 松花皮蛋的黑板报 作者就职于京东,在稳定性保障.敏捷开发.高级JAVA.微服务架构有深入的理解 为了避免空指针调用,我们经常会看到这样的语句 if (someobject != nu ...
- RDIFramework.NET ━ .NET敏捷开发框架全新发布-最好用的.NET开发框架 100%源码授权
RDIFramework.NET,基于.NET的快速信息化系统敏捷开发框架.10年沉淀.历经上千项目检验,致力于企业智能化开发,帮助提升软件开发效率.最好用的.NET开发框架,100%源码授权. 1. ...
- EChart绘制风速风向曲线分析图
1.获取ECharts 在 ECharts 的 GitHub 上下载最新的 release 版本,解压出来的文件夹里的 dist 目录里可以找到最新版本的 echarts 库. 2.引入ECharts ...
- 如何判断Linux系统安装在VMware上?
如何判断当前Linux系统是否安装在VMware上面呢? 因为公司大部分服务器位于VMware上,也有小部分系统部署在物理机上面.今天老大要求统计一下VMware和物理机上服务器的数量,个人简单测试. ...
- 由导入paramkio包失败,而pip list又能查到此包,而引出的:离线安装python第三方库的实用方法:解决公司内网,服务器/电脑不能上网却需要安装python三方库问题(下:Linux环境中)
问题描述: 公司的Linux服务器是内网,今天要实现某个功能,会用到python控制ssh,需要安装一个Paramkio库,和上一篇一样,仅仅依靠Pypi上下载下来的离线.whl安装包是不行的,lin ...
- nvidia quadro m5000 驱动安装 - 1804 ubuntu; nvidia-smi topo --matrix 查看gpu拓扑;nvidia-smi命令使用;
查看GPU型号: lspci | grep -i nvidia 驱动安装: https://www.nvidia.cn/Download/index.aspx?lang=cn 下载对应版本的驱动驱动程 ...
- 04. Go 语言流程控制
Go 语言流程控制 流程控制是每种编程语言控制逻辑走向和执行次序的重要部分,流程控制可以说是一门语言的"经脉". Go 语言的常用流程控制有 if 和 for,而 switch 和 ...
- SQL Server 移位运算符
参考链接:http://dataeducation.com/bitmask-handling-part-4-left-shift-and-right-shift/ SQL Server 官网的连接:h ...
- <Array> 54 (高频+hard )45
55. Jump Game 希望知道能否到达末尾,也就是说我们只对最远能到达的位置感兴趣,所以维护一个变量 reach,表示最远能到达的位置,初始化为0.遍历数组中每一个数字,如果当前坐标大于 rea ...